From 3adfb8da64d10df18b5bd4489ec25e7a8296a423 Mon Sep 17 00:00:00 2001 From: JimLewis Date: Thu, 17 Aug 2017 07:00:13 -0700 Subject: [PATCH 1/8] Made AlertLogType a type rather than a subtype --- AlertLogPkg.vhd | 15 ++++++++------- ScoreboardGenericPkg.vhd | 10 +++++++--- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/AlertLogPkg.vhd b/AlertLogPkg.vhd index b67316c..c631291 100644 --- a/AlertLogPkg.vhd +++ b/AlertLogPkg.vhd @@ -69,7 +69,8 @@ use ieee.numeric_std.all ; package AlertLogPkg is - subtype AlertLogIDType is integer ; + type AlertLogIDType is range integer'low to integer'high ; + type AlertLogIDVectorType is array (integer range <>) of AlertLogIDType ; type AlertType is (FAILURE, ERROR, WARNING) ; -- NEVER subtype AlertIndexType is AlertType range FAILURE to WARNING ; type AlertCountType is array (AlertIndexType) of integer ; @@ -458,12 +459,12 @@ package body AlertLogPkg is ------------------------------------------------------------ procedure SetAlertLogName(Name : string ) ; - procedure SetNumAlertLogIDs (NewNumAlertLogIDs : integer) ; + procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) ; impure function FindAlertLogID(Name : string ) return AlertLogIDType ; impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType ; impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; - procedure Initialize(NewNumAlertLogIDs : integer := MIN_NUM_AL_IDS) ; + procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) ; procedure Deallocate ; ------------------------------------------------------------ @@ -1061,7 +1062,7 @@ package body AlertLogPkg is ------------------------------------------------------------ -- PT Local -- Construct initial data structure - procedure LocalInitialize(NewNumAlertLogIDs : integer := MIN_NUM_AL_IDS) is + procedure LocalInitialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is ------------------------------------------------------------ begin if NumAllocatedAlertLogIDsVar /= 0 then @@ -1091,7 +1092,7 @@ package body AlertLogPkg is ------------------------------------------------------------ -- Construct initial data structure - procedure Initialize(NewNumAlertLogIDs : integer := MIN_NUM_AL_IDS) is + procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is ------------------------------------------------------------ begin LocalInitialize(NewNumAlertLogIDs) ; @@ -1146,7 +1147,7 @@ package body AlertLogPkg is ------------------------------------------------------------ -- PT Local. - procedure GrowAlertStructure (NewNumAlertLogIDs : integer) is + procedure GrowAlertStructure (NewNumAlertLogIDs : AlertLogIDType) is ------------------------------------------------------------ variable oldAlertLogPtr : AlertLogArrayPtrType ; begin @@ -1165,7 +1166,7 @@ package body AlertLogPkg is -- Sets a AlertLogPtr to a particular size -- Use for small bins to save space or large bins to -- suppress the resize and copy as a CovBin autosizes. - procedure SetNumAlertLogIDs (NewNumAlertLogIDs : integer) is + procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) is ------------------------------------------------------------ variable oldAlertLogPtr : AlertLogArrayPtrType ; begin diff --git a/ScoreboardGenericPkg.vhd b/ScoreboardGenericPkg.vhd index ed43425..ddc5665 100644 --- a/ScoreboardGenericPkg.vhd +++ b/ScoreboardGenericPkg.vhd @@ -448,12 +448,15 @@ package body ScoreboardGenericPkg is type IntegerArrayType is array (integer range <>) of Integer ; type IntegerArrayPointerType is access IntegerArrayType ; + type AlertLogIDArrayType is array (integer range <>) of AlertLogIDType ; + type AlertLogIDArrayPointerType is access AlertLogIDArrayType ; + variable ErrCntVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; variable DropCountVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; variable ItemNumberVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; variable CheckCountVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; - variable AlertLogIDVar : IntegerArrayPointerType := new IntegerArrayType'(1 => OSVVM_SCOREBOARD_ALERTLOG_ID) ; + variable AlertLogIDVar : AlertLogIDArrayPointerType := new AlertLogIDArrayType'(1 => OSVVM_SCOREBOARD_ALERTLOG_ID) ; variable NameVar : NamePType ; variable ReportModeVar : ScoreboardReportType ; @@ -509,7 +512,8 @@ package body ScoreboardGenericPkg is procedure SetArrayIndex(L, R : integer) is ------------------------------------------------------------ variable OldHeadPointer, OldTailPointer, OldPopListPointer : ListArrayPointerType ; - variable OldErrCnt, OldDropCount, OldItemNumber, OldCheckCount, OldAlertLogIDVar : IntegerArrayPointerType ; + variable OldErrCnt, OldDropCount, OldItemNumber, OldCheckCount : IntegerArrayPointerType ; + variable OldAlertLogIDVar : AlertLogIDArrayPointerType ; variable Min, Max, Len, OldLen, OldMax : integer ; begin Min := minimum(L, R) ; @@ -571,7 +575,7 @@ package body ScoreboardGenericPkg is end if ; OldAlertLogIDVar := AlertLogIDVar ; - AlertLogIDVar := new IntegerArrayType'(Min to Max => OSVVM_SCOREBOARD_ALERTLOG_ID) ; + AlertLogIDVar := new AlertLogIDArrayType'(Min to Max => OSVVM_SCOREBOARD_ALERTLOG_ID) ; if OldAlertLogIDVar /= NULL then AlertLogIDVar(Min to OldMax) := OldAlertLogIDVar.all ; Deallocate(OldAlertLogIDVar) ; From 1ff790363649508362acc08d4bc8b6e120b4e978 Mon Sep 17 00:00:00 2001 From: JimLewis Date: Thu, 1 Mar 2018 22:39:31 -0800 Subject: [PATCH 2/8] backed out change to AlertLogIDType since it exposed a tool bug --- AlertLogPkg.vhd | 6627 ++++++++++++++++++++++++----------------------- 1 file changed, 3316 insertions(+), 3311 deletions(-) diff --git a/AlertLogPkg.vhd b/AlertLogPkg.vhd index c631291..4f941bb 100644 --- a/AlertLogPkg.vhd +++ b/AlertLogPkg.vhd @@ -1,3312 +1,3317 @@ --- --- File Name: AlertLogPkg.vhd --- Design Unit Name: AlertLogPkg --- Revision: STANDARD VERSION --- --- Maintainer: Jim Lewis email: jim@synthworks.com --- Contributor(s): --- Jim Lewis jim@synthworks.com --- --- --- Description: --- Alert handling and log filtering (verbosity control) --- Alert handling provides a method to count failures, errors, and warnings --- To accumlate counts, a data structure is created in a shared variable --- It is of type AlertLogStructPType which is defined in AlertLogBasePkg --- Log filtering provides verbosity control for logs (display or do not display) --- AlertLogPkg provides a simplified interface to the shared variable --- --- --- Developed for: --- SynthWorks Design Inc. --- VHDL Training Classes --- 11898 SW 128th Ave. Tigard, Or 97223 --- http://www.SynthWorks.com --- --- Revision History: --- Date Version Description --- 01/2015: 2015.01 Initial revision --- 03/2015 2015.03 Added: AlertIfEqual, AlertIfNotEqual, AlertIfDiff, PathTail, --- ReportNonZeroAlerts, ReadLogEnables --- 05/2015 2015.06 Added IncAlertCount, AffirmIf --- 07/2015 2016.01 Fixed AlertLogID issue with > 32 IDs --- 02/2016 2016.02 Fixed IsLogEnableType (for PASSED), AffirmIf (to pass AlertLevel) --- Created LocalInitialize --- 05/2017 2017.05 AffirmIfEqual, AffirmIfDiff, --- GetAffirmCount (deprecates GetAffirmCheckCount), IncAffirmCount (deprecates IncAffirmCheckCount), --- IsAlertEnabled (alias), IsLogEnabled (alias) --- --- --- Copyright (c) 2015 - 2017 by SynthWorks Design Inc. All rights reserved. --- --- Verbatim copies of this source file may be used and --- distributed without restriction. --- --- This source file is free software; you can redistribute it --- and/or modify it under the terms of the ARTISTIC License --- as published by The Perl Foundation; either version 2.0 of --- the License, or (at your option) any later version. --- --- This source is distributed in the hope that it will be --- useful, but WITHOUT ANY WARRANTY; without even the implied --- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --- PURPOSE. See the Artistic License for details. --- --- You should have received a copy of the license with this source. --- If not download it from, --- http://www.perlfoundation.org/artistic_license_2_0 --- - - -use std.textio.all ; -use work.OsvvmGlobalPkg.all ; -use work.TranscriptPkg.all ; -use work.TextUtilPkg.all ; - -library IEEE ; -use ieee.std_logic_1164.all ; -use ieee.numeric_std.all ; - -package AlertLogPkg is - - type AlertLogIDType is range integer'low to integer'high ; - type AlertLogIDVectorType is array (integer range <>) of AlertLogIDType ; - type AlertType is (FAILURE, ERROR, WARNING) ; -- NEVER - subtype AlertIndexType is AlertType range FAILURE to WARNING ; - type AlertCountType is array (AlertIndexType) of integer ; - type AlertEnableType is array(AlertIndexType) of boolean ; - type LogType is (ALWAYS, DEBUG, FINAL, INFO, PASSED) ; -- NEVER -- See function IsLogEnableType - subtype LogIndexType is LogType range DEBUG to PASSED ; - type LogEnableType is array (LogIndexType) of boolean ; - - constant ALERTLOG_BASE_ID : AlertLogIDType := 0 ; -- Careful as some code may assume this is 0. - constant ALERTLOG_DEFAULT_ID : AlertLogIDType := 1 ; - constant ALERT_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ; - constant LOG_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ; - constant OSVVM_ALERTLOG_ID : AlertLogIDType := 2 ; - constant OSVVM_SCOREBOARD_ALERTLOG_ID : AlertLogIDType := OSVVM_ALERTLOG_ID ; - -- NUM_PREDEFINED_AL_IDS intended to be local, but depends on others - -- constant NUM_PREDEFINED_AL_IDS : AlertLogIDType := OSVVM_SCOREBOARD_ALERTLOG_ID - ALERTLOG_BASE_ID ; -- Not including base - constant ALERTLOG_ID_NOT_FOUND : AlertLogIDType := -1 ; -- alternately integer'right - constant ALERTLOG_ID_NOT_ASSIGNED : AlertLogIDType := -1 ; - constant MIN_NUM_AL_IDS : AlertLogIDType := 32 ; -- Number IDs initially allocated - - alias AlertLogOptionsType is work.OsvvmGlobalPkg.OsvvmOptionsType ; - - ------------------------------------------------------------ - -- Alert always goes to the transcript file - procedure Alert( - AlertLogID : AlertLogIDType ; - Message : string ; - Level : AlertType := ERROR - ) ; - procedure Alert( Message : string ; Level : AlertType := ERROR ) ; - - ------------------------------------------------------------ - procedure IncAlertCount( -- A silent form of alert - AlertLogID : AlertLogIDType ; - Level : AlertType := ERROR - ) ; - procedure IncAlertCount( Level : AlertType := ERROR ) ; - - ------------------------------------------------------------ - -- Similar to assert, except condition is positive - procedure AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; - impure function AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; - impure function AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; - - ------------------------------------------------------------ - -- Direct replacement for assert - procedure AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; - impure function AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; - impure function AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; - - ------------------------------------------------------------ - -- overloading for common functionality - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) ; - - procedure AlertIfEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) ; - - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) ; - - procedure AlertIfNotEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) ; - - ------------------------------------------------------------ - -- Simple Diff for file comparisons - procedure AlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) ; - procedure AlertIfDiff (Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) ; - procedure AlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) ; - procedure AlertIfDiff (file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - ------------------------------------------------------------ - procedure AffirmIf( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - condition : boolean ; - ReceivedMessage : string ; - ExpectedMessage : string ; - Enable : boolean := FALSE -- override internal enable - ) ; - - procedure AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; - impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; - impure function AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; - - procedure AffirmIf( - AlertLogID : AlertLogIDType ; - condition : boolean ; - Message : string ; - Enable : boolean := FALSE -- override internal enable - ) ; - - procedure AffirmIf(condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; - impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; - impure function AffirmIf( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; - - ------------------------------------------------------------ - procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; - procedure AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; - impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; - impure function AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; - - ------------------------------------------------------------ - procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; - procedure AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; - impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; - impure function AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; - - ------------------------------------------------------------ - procedure AffirmPassed( AlertLogID : AlertLogIDType ; Message : string ; Enable : boolean := FALSE ) ; - procedure AffirmPassed( Message : string ; Enable : boolean := FALSE ) ; - procedure AffirmError( AlertLogID : AlertLogIDType ; Message : string ) ; - procedure AffirmError( Message : string ) ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ); - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) ; - - -- Without AlertLogID - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfDiff (Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfDiff (file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) ; - - ------------------------------------------------------------ - procedure SetAlertLogJustify ; - procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) ; - procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) ; - procedure ReportNonZeroAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) ; - procedure ClearAlerts ; - function "ABS" (L : AlertCountType) return AlertCountType ; - function "+" (L, R : AlertCountType) return AlertCountType ; - function "-" (L, R : AlertCountType) return AlertCountType ; - function "-" (R : AlertCountType) return AlertCountType ; - impure function SumAlertCount(AlertCount: AlertCountType) return integer ; - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer ; - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer ; - impure function GetDisabledAlertCount return AlertCountType ; - impure function GetDisabledAlertCount return integer ; - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType ; - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer ; - - ------------------------------------------------------------ - -- log filtering for verbosity control, optionally has a separate file parameter - procedure Log( - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType := ALWAYS ; - Enable : boolean := FALSE -- override internal enable - ) ; - procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) ; - - ------------------------------------------------------------ - -- Accessor Methods - procedure SetAlertLogName(Name : string ) ; - impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string ; - procedure DeallocateAlertLogStruct ; - procedure InitializeAlertLogStruct ; - impure function FindAlertLogID(Name : string ) return AlertLogIDType ; - impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; - impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType ; - impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; - - ------------------------------------------------------------ - -- Accessor Methods - procedure SetGlobalAlertEnable (A : boolean := TRUE) ; - impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean ; - impure function GetGlobalAlertEnable return boolean ; - procedure IncAffirmCount ; - impure function GetAffirmCount return natural ; ---?? procedure IncAffirmPassCount ; ---?? impure function GetAffirmPassCount return natural ; - - procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ; - procedure SetAlertStopCount(Level : AlertType ; Count : integer) ; - impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ; - impure function GetAlertStopCount(Level : AlertType) return integer ; - - procedure SetAlertEnable(Level : AlertType ; Enable : boolean) ; - procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; - impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean ; - impure function GetAlertEnable(Level : AlertType) return boolean ; - alias IsAlertEnabled is GetAlertEnable[AlertLogIDType, AlertType return boolean] ; - alias IsAlertEnabled is GetAlertEnable[AlertType return boolean] ; - - procedure SetLogEnable(Level : LogType ; Enable : boolean) ; - procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; - impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean ; - impure function GetLogEnable(Level : LogType) return boolean ; - alias IsLogEnabled is GetLogEnable [AlertLogIDType, LogType return boolean] ; -- same as GetLogEnable - alias IsLogEnabled is GetLogEnable [LogType return boolean] ; -- same as GetLogEnable - - procedure ReportLogEnables ; - - ------------------------------------------------------------ - procedure SetAlertLogOptions ( - FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - - procedure ReportAlertLogOptions ; - - impure function GetAlertLogFailOnWarning return AlertLogOptionsType ; - impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType ; - impure function GetAlertLogReportHierarchy return AlertLogOptionsType ; - impure function GetAlertLogFoundReportHier return boolean ; - impure function GetAlertLogFoundAlertHier return boolean ; - impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType ; - impure function GetAlertLogWriteAlertName return AlertLogOptionsType ; - impure function GetAlertLogWriteAlertTime return AlertLogOptionsType ; - impure function GetAlertLogWriteLogLevel return AlertLogOptionsType ; - impure function GetAlertLogWriteLogName return AlertLogOptionsType ; - impure function GetAlertLogWriteLogTime return AlertLogOptionsType ; - - impure function GetAlertLogAlertPrefix return string ; - impure function GetAlertLogLogPrefix return string ; - - impure function GetAlertLogReportPrefix return string ; - impure function GetAlertLogDoneName return string ; - impure function GetAlertLogPassName return string ; - impure function GetAlertLogFailName return string ; - - - -- File Reading Utilities - function IsLogEnableType (Name : String) return boolean ; - procedure ReadLogEnables (file AlertLogInitFile : text) ; - procedure ReadLogEnables (FileName : string) ; - - -- String Helper Functions -- This should be in a more general string package - function PathTail (A : string) return string ; - - - -- ------------------------------------------------------------ - -- Deprecated - -- - - -- deprecated - procedure AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) ; - impure function AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean ; - - -- deprecated - procedure AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) ; - impure function AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean ; - - -- deprecated - procedure AffirmIf( - AlertLogID : AlertLogIDType ; - condition : boolean ; - Message : string ; - LogLevel : LogType ; -- := PASSED - AlertLevel : AlertType := ERROR - ) ; - procedure AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; AlertLevel : AlertType ) ; - procedure AffirmIf(condition : boolean ; Message : string ; LogLevel : LogType ; AlertLevel : AlertType := ERROR) ; - procedure AffirmIf(condition : boolean ; Message : string ; AlertLevel : AlertType ) ; - - alias IncAffirmCheckCount is IncAffirmCount [] ; - alias GetAffirmCheckCount is GetAffirmCount [return natural] ; - alias IsLoggingEnabled is GetLogEnable [AlertLogIDType, LogType return boolean] ; -- same as IsLogEnabled - alias IsLoggingEnabled is GetLogEnable [LogType return boolean] ; -- same as IsLogEnabled - - -end AlertLogPkg ; - ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// - -use work.NamePkg.all ; - -package body AlertLogPkg is - - -- instead of justify(to_upper(to_string())), just look up the upper case, left justified values - type AlertNameType is array(AlertType) of string(1 to 7) ; - constant ALERT_NAME : AlertNameType := (WARNING => "WARNING", ERROR => "ERROR ", FAILURE => "FAILURE") ; -- , NEVER => "NEVER " - type LogNameType is array(LogType) of string(1 to 7) ; - constant LOG_NAME : LogNameType := (DEBUG => "DEBUG ", FINAL => "FINAL ", INFO => "INFO ", ALWAYS => "ALWAYS ", PASSED => "PASSED ") ; -- , NEVER => "NEVER " - - - type AlertLogStructPType is protected - - ------------------------------------------------------------ - procedure alert ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - message : string ; - level : AlertType := ERROR - ) ; - - ------------------------------------------------------------ - procedure IncAlertCount ( AlertLogID : AlertLogIDType ; level : AlertType := ERROR ) ; - procedure SetJustify ; - procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) ; - procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (0,0,0) ; ReportAll : boolean := TRUE ) ; - procedure ClearAlerts ; - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; - impure function GetDisabledAlertCount return AlertCountType ; - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType ; - - ------------------------------------------------------------ - procedure log ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType := ALWAYS ; - Enable : boolean := FALSE -- override internal enable - ) ; - - ------------------------------------------------------------ - -- FILE IO Controls --- procedure SetTranscriptEnable (A : boolean := TRUE) ; --- impure function IsTranscriptEnabled return boolean ; --- procedure MirrorTranscript (A : boolean := TRUE) ; --- impure function IsTranscriptMirrored return boolean ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- AlertLog Structure Creation and Interaction Methods - - ------------------------------------------------------------ - procedure SetAlertLogName(Name : string ) ; - procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) ; - impure function FindAlertLogID(Name : string ) return AlertLogIDType ; - impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; - impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType ; - impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; - procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) ; - procedure Deallocate ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- Accessor Methods - ------------------------------------------------------------ - procedure SetGlobalAlertEnable (A : boolean := TRUE) ; - impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string ; - impure function GetGlobalAlertEnable return boolean ; - procedure IncAffirmCount ; - impure function GetAffirmCount return natural ; ---?? procedure IncAffirmPassCount ; ---?? impure function GetAffirmPassCount return natural ; - - procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ; - impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ; - - procedure SetAlertEnable(Level : AlertType ; Enable : boolean) ; - procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; - impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean ; - - procedure SetLogEnable(Level : LogType ; Enable : boolean) ; - procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; - impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean ; - - procedure ReportLogEnables ; - - ------------------------------------------------------------ - -- Reporting Accessor - procedure SetAlertLogOptions ( - FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - procedure ReportAlertLogOptions ; - - impure function GetAlertLogFailOnWarning return AlertLogOptionsType ; - impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType ; - impure function GetAlertLogReportHierarchy return AlertLogOptionsType ; - impure function GetAlertLogFoundReportHier return boolean ; - impure function GetAlertLogFoundAlertHier return boolean ; - impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType ; - impure function GetAlertLogWriteAlertName return AlertLogOptionsType ; - impure function GetAlertLogWriteAlertTime return AlertLogOptionsType ; - impure function GetAlertLogWriteLogLevel return AlertLogOptionsType ; - impure function GetAlertLogWriteLogName return AlertLogOptionsType ; - impure function GetAlertLogWriteLogTime return AlertLogOptionsType ; - - impure function GetAlertLogAlertPrefix return string ; - impure function GetAlertLogLogPrefix return string ; - - impure function GetAlertLogReportPrefix return string ; - impure function GetAlertLogDoneName return string ; - impure function GetAlertLogPassName return string ; - impure function GetAlertLogFailName return string ; - - end protected AlertLogStructPType ; - - --- /////////////////////////////////////////////////////////////////////////// - - type AlertLogStructPType is protected body - - variable GlobalAlertEnabledVar : boolean := TRUE ; -- Allows turn off and on - - variable AffirmCheckCountVar : natural := 0 ; ---?? variable AffirmPassedCountVar : natural := 0 ; - - ------------------------------------------------------------ - type AlertLogRecType is record - ------------------------------------------------------------ - Name : Line ; - ParentID : AlertLogIDType ; - AlertCount : AlertCountType ; - AlertStopCount : AlertCountType ; - AlertEnabled : AlertEnableType ; - LogEnabled : LogEnableType ; - end record AlertLogRecType ; - - ------------------------------------------------------------ - -- Basis for AlertLog Data Structure - variable NumAlertLogIDsVar : AlertLogIDType := 0 ; -- defined by initialize - variable NumAllocatedAlertLogIDsVar : AlertLogIDType := 0 ; ---xx variable NumPredefinedAlIDsVar : AlertLogIDType := 0 ; -- defined by initialize - - type AlertLogRecPtrType is access AlertLogRecType ; - type AlertLogArrayType is array (AlertLogIDType range <>) of AlertLogRecPtrType ; - type AlertLogArrayPtrType is access AlertLogArrayType ; - variable AlertLogPtr : AlertLogArrayPtrType ; - - ------------------------------------------------------------ - -- Report formatting settings, with defaults - variable FailOnWarningVar : boolean := TRUE ; - variable FailOnDisabledErrorsVar : boolean := TRUE ; - variable ReportHierarchyVar : boolean := TRUE ; - variable FoundReportHierVar : boolean := FALSE ; - variable FoundAlertHierVar : boolean := FALSE ; - - variable WriteAlertLevelVar : boolean := TRUE ; - variable WriteAlertNameVar : boolean := TRUE ; - variable WriteAlertTimeVar : boolean := TRUE ; - variable WriteLogLevelVar : boolean := TRUE ; - variable WriteLogNameVar : boolean := TRUE ; - variable WriteLogTimeVar : boolean := TRUE ; - - variable AlertPrefixVar : NamePType ; - variable LogPrefixVar : NamePType ; - variable ReportPrefixVar : NamePType ; - variable DoneNameVar : NamePType ; - variable PassNameVar : NamePType ; - variable FailNameVar : NamePType ; - - variable AlertLogJustifyAmountVar : integer := 0 ; - variable ReportJustifyAmountVar : integer := 0 ; - - ------------------------------------------------------------ - -- PT Local - impure function LeftJustify(A : String; Amount : integer) return string is - ------------------------------------------------------------ - constant Spaces : string(1 to maximum(1, Amount)) := (others => ' ') ; - begin - if A'length >= Amount then - return A ; - else - return A & Spaces(1 to Amount - A'length) ; - end if ; - end function LeftJustify ; - - - ------------------------------------------------------------ - -- PT Local - procedure IncrementAlertCount( - ------------------------------------------------------------ - constant AlertLogID : in AlertLogIDType ; - constant Level : in AlertType ; - variable StopDueToCount : inout boolean - ) is - begin - -- Always Count at this level - AlertLogPtr(AlertLogID).AlertCount(Level) := AlertLogPtr(AlertLogID).AlertCount(Level) + 1 ; - -- Only do remaining actions if enabled - if AlertLogPtr(AlertLogID).AlertEnabled(Level) then - -- Exceeded Stop Count at this level? - if AlertLogPtr(AlertLogID).AlertCount(Level) >= AlertLogPtr(AlertLogID).AlertStopCount(Level) then - StopDueToCount := TRUE ; - end if ; - -- Propagate counts to parent(s) -- Ascend Hierarchy - if AlertLogID /= ALERTLOG_BASE_ID then - IncrementAlertCount(AlertLogPtr(AlertLogID).ParentID, Level, StopDueToCount) ; - end if ; - end if ; - end procedure IncrementAlertCount ; - - ------------------------------------------------------------ - procedure alert ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - message : string ; - level : AlertType := ERROR - ) is - variable buf : Line ; - constant AlertPrefix : string := AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; - variable StopDueToCount : boolean := FALSE ; - begin - if GlobalAlertEnabledVar then - -- Do not write or count when GlobalAlertEnabledVar is disabled - if AlertLogPtr(AlertLogID).AlertEnabled(Level) then - -- do not write when disabled - write(buf, AlertPrefix) ; - if WriteAlertLevelVar then - -- write(buf, " " & to_string(Level) ) ; - write(buf, " " & ALERT_NAME(Level)) ; -- uses constant lookup - end if ; ---xx if (NumAlertLogIDsVar > NumPredefinedAlIDsVar) and WriteAlertNameVar then -- print hierarchy names even when silent - if FoundAlertHierVar and WriteAlertNameVar then --- write(buf, " in " & justify(AlertLogPtr(AlertLogID).Name.all & ",", LEFT, AlertLogJustifyAmountVar) ) ; - write(buf, " in " & LeftJustify(AlertLogPtr(AlertLogID).Name.all & ",", AlertLogJustifyAmountVar) ) ; - end if ; - write(buf, " " & Message) ; - if WriteAlertTimeVar then - write(buf, " at " & to_string(NOW, 1 ns)) ; - end if ; - writeline(buf) ; - end if ; - -- Always Count - IncrementAlertCount(AlertLogID, Level, StopDueToCount) ; - if StopDueToCount then - write(buf, LF & AlertPrefix & " Stop Count on " & ALERT_NAME(Level) & " reached") ; ---xx if NumAlertLogIDsVar > NumPredefinedAlIDsVar then -- print hierarchy names even when silent - if FoundAlertHierVar then - write(buf, " in " & AlertLogPtr(AlertLogID).Name.all) ; - end if ; - write(buf, " at " & to_string(NOW, 1 ns) & " ") ; - writeline(buf) ; - ReportAlerts(ReportAll => TRUE) ; - std.env.stop(1) ; - end if ; - end if ; - end procedure alert ; - - ------------------------------------------------------------ - procedure IncAlertCount ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - level : AlertType := ERROR - ) is - variable buf : Line ; - constant AlertPrefix : string := AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; - variable StopDueToCount : boolean := FALSE ; - begin - if GlobalAlertEnabledVar then - IncrementAlertCount(AlertLogID, Level, StopDueToCount) ; - if StopDueToCount then - write(buf, LF & AlertPrefix & " Stop Count on " & ALERT_NAME(Level) & " reached") ; ---xx if NumAlertLogIDsVar > NumPredefinedAlIDsVar then -- print hierarchy names even when silent - if FoundAlertHierVar then - write(buf, " in " & AlertLogPtr(AlertLogID).Name.all) ; - end if ; - write(buf, " at " & to_string(NOW, 1 ns) & " ") ; - writeline(buf) ; - ReportAlerts(ReportAll => TRUE) ; - std.env.stop ; - end if ; - end if ; - end procedure IncAlertCount ; - - ------------------------------------------------------------ - -- PT Local - impure function CalcJustify (AlertLogID : AlertLogIDType ; CurrentLength : integer ; IndentAmount : integer) return integer_vector is - ------------------------------------------------------------ - variable ResultValues, LowerLevelValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented - begin - ResultValues(1) := CurrentLength + 1 ; -- AlertLogJustifyAmountVar - ResultValues(2) := CurrentLength + IndentAmount ; -- ReportJustifyAmountVar - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - LowerLevelValues := CalcJustify(i, AlertLogPtr(i).Name'length, IndentAmount + 2) ; - ResultValues(1) := maximum(ResultValues(1), LowerLevelValues(1)) ; - ResultValues(2) := maximum(ResultValues(2), LowerLevelValues(2)) ; - end if ; - end loop ; - return ResultValues ; - end function CalcJustify ; - - ------------------------------------------------------------ - procedure SetJustify is - ------------------------------------------------------------ - variable ResultValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented - begin - ResultValues := CalcJustify(ALERTLOG_BASE_ID, 0, 0) ; - AlertLogJustifyAmountVar := ResultValues(1) ; - ReportJustifyAmountVar := ResultValues(2) ; - end procedure SetJustify ; - - ------------------------------------------------------------ - -- PT Local - impure function GetEnabledAlertCount(AlertCount: AlertCountType; AlertEnabled : AlertEnableType) return AlertCountType is - ------------------------------------------------------------ - variable Count : AlertCountType := (others => 0) ; - begin - if AlertEnabled(FAILURE) then - Count(FAILURE) := AlertCount(FAILURE) ; - end if ; - if AlertEnabled(ERROR) then - Count(ERROR) := AlertCount(ERROR) ; - end if ; - if FailOnWarningVar and AlertEnabled(WARNING) then - Count(WARNING) := AlertCount(WARNING) ; - end if ; - return Count ; - end function GetEnabledAlertCount ; - - ------------------------------------------------------------ - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is - ------------------------------------------------------------ - variable AlertCount : AlertCountType ; - begin - return AlertLogPtr(AlertLogID).AlertCount ; - end function GetAlertCount ; - - ------------------------------------------------------------ - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is - ------------------------------------------------------------ - variable AlertCount : AlertCountType ; - begin - return GetEnabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ; - end function GetEnabledAlertCount ; - - ------------------------------------------------------------ - -- PT Local - impure function GetDisabledAlertCount(AlertCount: AlertCountType; AlertEnabled : AlertEnableType) return AlertCountType is - ------------------------------------------------------------ - variable Count : AlertCountType := (others => 0) ; - begin - if not AlertEnabled(FAILURE) then - Count(FAILURE) := AlertCount(FAILURE) ; - end if ; - if not AlertEnabled(ERROR) then - Count(ERROR) := AlertCount(ERROR) ; - end if ; - if FailOnWarningVar and not AlertEnabled(WARNING) then - Count(WARNING) := AlertCount(WARNING) ; - end if ; - return Count ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount return AlertCountType is - ------------------------------------------------------------ - variable Count : AlertCountType := (others => 0) ; - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - Count := Count + GetDisabledAlertCount(AlertLogPtr(i).AlertCount, AlertLogPtr(i).AlertEnabled) ; - end loop ; - return Count ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is - ------------------------------------------------------------ - variable Count : AlertCountType := (others => 0) ; - begin - Count := GetDisabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ; - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - Count := Count + GetDisabledAlertCount(i) ; - end if ; - end loop ; - return Count ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - -- PT Local - procedure PrintTopAlerts ( - ------------------------------------------------------------ - NumErrors : integer ; - AlertCount : AlertCountType ; - Name : string ; - NumDisabledErrors : integer - ) is - constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt ) ; - constant DoneName : string := ResolveOsvvmDoneName(DoneNameVar.GetOpt ) ; - constant PassName : string := ResolveOsvvmPassName(PassNameVar.GetOpt ) ; - constant FailName : string := ResolveOsvvmFailName(FailNameVar.GetOpt ) ; - variable buf : line ; - begin - if NumErrors = 0 then - if NumDisabledErrors = 0 then - -- Passed - write(buf, ReportPrefix & DoneName & " " & PassName & " " & Name) ; - if AffirmCheckCountVar > 0 then - write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; - end if ; - write(buf, " at " & to_string(NOW, 1 ns)) ; - WriteLine(buf) ; - else - -- Failed Due to Disabled Errors - write(buf, ReportPrefix & DoneName & " " & FailName & " " & Name) ; - write(buf, " Failed Due to Disabled Error(s) = " & to_string(NumDisabledErrors)) ; - if AffirmCheckCountVar > 0 then - write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; - end if ; - write(buf, " at " & to_string(NOW, 1 ns)) ; - WriteLine(buf) ; - end if ; - else - -- Failed - write(buf, ReportPrefix & DoneName & " " & FailName & " "& Name) ; - write(buf, " Total Error(s) = " & to_string(NumErrors) ) ; - write(buf, " Failures: " & to_string(AlertCount(FAILURE)) ) ; - write(buf, " Errors: " & to_string(AlertCount(ERROR) ) ) ; - write(buf, " Warnings: " & to_string(AlertCount(WARNING) ) ) ; - if AffirmCheckCountVar > 0 then ---?? write(buf, " Affirmations Passed: " & to_string(AffirmPassedCountVar)) ; ---?? write(buf, " Checked: " & to_string(AffirmCheckCountVar)) ; - write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; - end if ; - Write(buf, " at " & to_string(NOW, 1 ns)) ; - WriteLine(buf) ; - end if ; - end procedure PrintTopAlerts ; - - ------------------------------------------------------------ - -- PT Local - procedure PrintChild( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Prefix : string ; - IndentAmount : integer ; - ReportAll : boolean - ) is - variable buf : line ; - begin - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - if ReportAll or SumAlertCount(AlertLogPtr(i).AlertCount) > 0 then - Write(buf, Prefix & " " & LeftJustify(AlertLogPtr(i).Name.all, ReportJustifyAmountVar - IndentAmount)) ; - write(buf, " Failures: " & to_string(AlertLogPtr(i).AlertCount(FAILURE) ) ) ; - write(buf, " Errors: " & to_string(AlertLogPtr(i).AlertCount(ERROR) ) ) ; - write(buf, " Warnings: " & to_string(AlertLogPtr(i).AlertCount(WARNING) ) ) ; - WriteLine(buf) ; - end if ; - PrintChild( - AlertLogID => i, - Prefix => Prefix & " ", - IndentAmount => IndentAmount + 2, - ReportAll => ReportAll - ) ; - end if ; - end loop ; - end procedure PrintChild ; - - ------------------------------------------------------------ - procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (0,0,0) ; ReportAll : boolean := TRUE) is - ------------------------------------------------------------ - variable NumErrors : integer ; - variable NumDisabledErrors : integer ; - constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ; - begin - if ReportJustifyAmountVar <= 0 then - SetJustify ; - end if ; - NumErrors := SumAlertCount( ExternalErrors + GetEnabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ) ; - if FailOnDisabledErrorsVar then - NumDisabledErrors := SumAlertCount( GetDisabledAlertCount(AlertLogID) ) ; - else - NumDisabledErrors := 0 ; - end if ; - if IsOsvvmStringSet(Name) then - PrintTopAlerts ( - NumErrors => NumErrors, - AlertCount => AlertLogPtr(AlertLogID).AlertCount + ExternalErrors, - Name => Name, - NumDisabledErrors => NumDisabledErrors - ) ; - else - PrintTopAlerts ( - NumErrors => NumErrors, - AlertCount => AlertLogPtr(AlertLogID).AlertCount + ExternalErrors, - Name => AlertLogPtr(AlertLogID).Name.all, - NumDisabledErrors => NumDisabledErrors - ) ; - end if ; - --Print Hierarchy when enabled and error or disabled error - if (FoundReportHierVar and ReportHierarchyVar) and (NumErrors /= 0 or NumDisabledErrors /=0) then - PrintChild( - AlertLogID => AlertLogID, - Prefix => ReportPrefix & " ", - IndentAmount => 2, - ReportAll => ReportAll - ) ; - end if ; - end procedure ReportAlerts ; - - ------------------------------------------------------------ - procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) is - ------------------------------------------------------------ - begin - PrintTopAlerts ( - NumErrors => SumAlertCount(AlertCount), - AlertCount => AlertCount, - Name => Name, - NumDisabledErrors => 0 - ) ; - end procedure ReportAlerts ; - - ------------------------------------------------------------ - procedure ClearAlerts is - ------------------------------------------------------------ - begin - AffirmCheckCountVar := 0 ; ---?? AffirmPassedCountVar := 0 ; - - AlertLogPtr(ALERTLOG_BASE_ID).AlertCount := (0, 0, 0) ; - AlertLogPtr(ALERTLOG_BASE_ID).AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ; - - for i in ALERTLOG_BASE_ID + 1 to NumAlertLogIDsVar loop - AlertLogPtr(i).AlertCount := (0, 0, 0) ; - AlertLogPtr(i).AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ; - end loop ; - end procedure ClearAlerts ; - - ------------------------------------------------------------ - -- PT Local - procedure LocalLog ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType - ) is - variable buf : line ; - constant LogPrefix : string := LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ; - begin - write(buf, LogPrefix) ; - if WriteLogLevelVar then - write(buf, " " & LOG_NAME(Level) ) ; - end if ; ---xx if (NumAlertLogIDsVar > NumPredefinedAlIDsVar) and WriteLogNameVar then -- print hierarchy names even when silent - if FoundAlertHierVar and WriteLogNameVar then --- write(buf, " in " & justify(AlertLogPtr(AlertLogID).Name.all & ",", LEFT, AlertLogJustifyAmountVar) ) ; - write(buf, " in " & LeftJustify(AlertLogPtr(AlertLogID).Name.all & ",", AlertLogJustifyAmountVar) ) ; - end if ; - write(buf, " " & Message) ; - if WriteLogTimeVar then - write(buf, " at " & to_string(NOW, 1 ns)) ; - end if ; - writeline(buf) ; - end procedure LocalLog ; - - ------------------------------------------------------------ - procedure log ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType := ALWAYS ; - Enable : boolean := FALSE -- override internal enable - ) is - begin - if Level = ALWAYS or Enable then - LocalLog(AlertLogID, Message, Level) ; - elsif AlertLogPtr(AlertLogID).LogEnabled(Level) then - LocalLog(AlertLogID, Message, Level) ; - end if ; - end procedure log ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- AlertLog Structure Creation and Interaction Methods - - ------------------------------------------------------------ - procedure SetAlertLogName(Name : string ) is - ------------------------------------------------------------ - begin - Deallocate(AlertLogPtr(ALERTLOG_BASE_ID).Name) ; - AlertLogPtr(ALERTLOG_BASE_ID).Name := new string'(Name) ; - end procedure SetAlertLogName ; - - ------------------------------------------------------------ - impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string is - ------------------------------------------------------------ - begin - return AlertLogPtr(AlertLogID).Name.all ; - end function GetAlertLogName ; - - ------------------------------------------------------------ - -- PT Local - procedure NewAlertLogRec(AlertLogID : AlertLogIDType ; Name : string ; ParentID : AlertLogIDType) is - ------------------------------------------------------------ - variable AlertEnabled : AlertEnableType ; - variable AlertStopCount : AlertCountType ; - variable LogEnabled : LogEnableType ; - begin - if AlertLogID = ALERTLOG_BASE_ID then - AlertEnabled := (TRUE, TRUE, TRUE) ; - LogEnabled := (others => FALSE) ; - AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ; - else - if ParentID < ALERTLOG_BASE_ID then - AlertEnabled := AlertLogPtr(ALERTLOG_BASE_ID).AlertEnabled ; - LogEnabled := AlertLogPtr(ALERTLOG_BASE_ID).LogEnabled ; - else - AlertEnabled := AlertLogPtr(ParentID).AlertEnabled ; - LogEnabled := AlertLogPtr(ParentID).LogEnabled ; - end if ; - AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ; - end if ; - AlertLogPtr(AlertLogID) := new AlertLogRecType ; - AlertLogPtr(AlertLogID).Name := new string'(NAME) ; - AlertLogPtr(AlertLogID).ParentID := ParentID ; - AlertLogPtr(AlertLogID).AlertCount := (0, 0, 0) ; - AlertLogPtr(AlertLogID).AlertEnabled := AlertEnabled ; - AlertLogPtr(AlertLogID).AlertStopCount := AlertStopCount ; - AlertLogPtr(AlertLogID).LogEnabled := LogEnabled ; --- AlertLogPtr(AlertLogID) := new AlertLogRecType'( --- Name => new string'(NAME), --- ParentID => ParentID, --- AlertCount => (0, 0, 0), --- AlertEnabled => AlertEnabled, --- AlertStopCount => AlertStopCount, --- LogEnabled => LogEnabled --- ) ; - end procedure NewAlertLogRec ; - - ------------------------------------------------------------ - -- PT Local - -- Construct initial data structure - procedure LocalInitialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is - ------------------------------------------------------------ - begin - if NumAllocatedAlertLogIDsVar /= 0 then - Alert(ALERT_DEFAULT_ID, "AlertLogPkg: Initialize, data structure already initialized", FAILURE) ; - return ; - end if ; - -- Initialize Pointer - AlertLogPtr := new AlertLogArrayType(ALERTLOG_BASE_ID to ALERTLOG_BASE_ID + NewNumAlertLogIDs) ; - NumAllocatedAlertLogIDsVar := NewNumAlertLogIDs ; - -- Create BASE AlertLogID (if it differs from DEFAULT - if ALERTLOG_BASE_ID /= ALERT_DEFAULT_ID then - NewAlertLogRec(ALERTLOG_BASE_ID, "AlertLogTop", ALERTLOG_BASE_ID) ; - end if ; - -- Create DEFAULT AlertLogID - NewAlertLogRec(ALERT_DEFAULT_ID, "Default", ALERTLOG_BASE_ID) ; - NumAlertLogIDsVar := ALERT_DEFAULT_ID ; - -- Create OSVVM AlertLogID (if it differs from DEFAULT - if OSVVM_ALERTLOG_ID /= ALERT_DEFAULT_ID then - NewAlertLogRec(OSVVM_ALERTLOG_ID, "OSVVM", ALERTLOG_BASE_ID) ; - NumAlertLogIDsVar := NumAlertLogIDsVar + 1 ; - end if ; - if OSVVM_SCOREBOARD_ALERTLOG_ID /= OSVVM_ALERTLOG_ID then - NewAlertLogRec(OSVVM_SCOREBOARD_ALERTLOG_ID, "OSVVM Scoreboard", ALERTLOG_BASE_ID) ; - NumAlertLogIDsVar := NumAlertLogIDsVar + 1 ; - end if ; - end procedure LocalInitialize ; - - ------------------------------------------------------------ - -- Construct initial data structure - procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is - ------------------------------------------------------------ - begin - LocalInitialize(NewNumAlertLogIDs) ; - end procedure Initialize ; - - ------------------------------------------------------------ - -- PT Local - -- Constructs initial data structure using constant below - impure function LocalInitialize return boolean is - ------------------------------------------------------------ - begin - LocalInitialize(MIN_NUM_AL_IDS) ; - return TRUE ; - end function LocalInitialize ; - - constant CONSTRUCT_ALERT_DATA_STRUCTURE : boolean := LocalInitialize ; - - ------------------------------------------------------------ - procedure Deallocate is - ------------------------------------------------------------ - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - Deallocate(AlertLogPtr(i).Name) ; - Deallocate(AlertLogPtr(i)) ; - end loop ; - deallocate(AlertLogPtr) ; - -- Free up space used by protected types within AlertLogPkg - AlertPrefixVar.Deallocate ; - LogPrefixVar.Deallocate ; - ReportPrefixVar.Deallocate ; - DoneNameVar.Deallocate ; - PassNameVar.Deallocate ; - FailNameVar.Deallocate ; - -- Restore variables to their initial state - NumAlertLogIDsVar := 0 ; - NumAllocatedAlertLogIDsVar := 0 ; - GlobalAlertEnabledVar := TRUE ; -- Allows turn off and on - AffirmCheckCountVar := 0 ; ---?? AffirmPassedCountVar := 0 ; - FailOnWarningVar := TRUE ; - FailOnDisabledErrorsVar := TRUE ; - ReportHierarchyVar := TRUE ; - FoundReportHierVar := FALSE ; - FoundAlertHierVar := FALSE ; - WriteAlertLevelVar := TRUE ; - WriteAlertNameVar := TRUE ; - WriteAlertTimeVar := TRUE ; - WriteLogLevelVar := TRUE ; - WriteLogNameVar := TRUE ; - WriteLogTimeVar := TRUE ; - end procedure Deallocate ; - - ------------------------------------------------------------ - -- PT Local. - procedure GrowAlertStructure (NewNumAlertLogIDs : AlertLogIDType) is - ------------------------------------------------------------ - variable oldAlertLogPtr : AlertLogArrayPtrType ; - begin - if NumAllocatedAlertLogIDsVar = 0 then - Initialize (NewNumAlertLogIDs) ; -- Construct initial structure - else - oldAlertLogPtr := AlertLogPtr ; - AlertLogPtr := new AlertLogArrayType(ALERTLOG_BASE_ID to NewNumAlertLogIDs) ; - AlertLogPtr(ALERTLOG_BASE_ID to NumAlertLogIDsVar) := oldAlertLogPtr(ALERTLOG_BASE_ID to NumAlertLogIDsVar) ; - deallocate(oldAlertLogPtr) ; - end if ; - NumAllocatedAlertLogIDsVar := NewNumAlertLogIDs ; - end procedure GrowAlertStructure ; - - ------------------------------------------------------------ - -- Sets a AlertLogPtr to a particular size - -- Use for small bins to save space or large bins to - -- suppress the resize and copy as a CovBin autosizes. - procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) is - ------------------------------------------------------------ - variable oldAlertLogPtr : AlertLogArrayPtrType ; - begin - if NewNumAlertLogIDs > NumAllocatedAlertLogIDsVar then - GrowAlertStructure(NewNumAlertLogIDs) ; - end if; - end procedure SetNumAlertLogIDs ; - - ------------------------------------------------------------ - -- PT Local - impure function GetNextAlertLogID return AlertLogIDType is - ------------------------------------------------------------ - variable NewNumAlertLogIDs : AlertLogIDType ; - begin - NewNumAlertLogIDs := NumAlertLogIDsVar + 1 ; - if NewNumAlertLogIDs > NumAllocatedAlertLogIDsVar then - GrowAlertStructure(NumAllocatedAlertLogIDsVar + MIN_NUM_AL_IDS) ; - end if ; - NumAlertLogIDsVar := NewNumAlertLogIDs ; - return NumAlertLogIDsVar ; - end function GetNextAlertLogID ; - - ------------------------------------------------------------ - impure function FindAlertLogID(Name : string ) return AlertLogIDType is - ------------------------------------------------------------ - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - if Name = AlertLogPtr(i).Name.all then - return i ; - end if ; - end loop ; - return ALERTLOG_ID_NOT_FOUND ; -- not found - end function FindAlertLogID ; - - ------------------------------------------------------------ - impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is - ------------------------------------------------------------ - variable CurParentID : AlertLogIDType ; - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - CurParentID := AlertLogPtr(i).ParentID ; - if Name = AlertLogPtr(i).Name.all and - (CurParentID = ParentID or CurParentID = ALERTLOG_ID_NOT_ASSIGNED or ParentID = ALERTLOG_ID_NOT_ASSIGNED) - then - return i ; - end if ; - end loop ; - return ALERTLOG_ID_NOT_FOUND ; -- not found - end function FindAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType is - ------------------------------------------------------------ - variable ResultID : AlertLogIDType ; - begin - ResultID := FindAlertLogID(Name, ParentID) ; - if ResultID /= ALERTLOG_ID_NOT_FOUND then - -- found it, set ParentID - if AlertLogPtr(ResultID).ParentID = ALERTLOG_ID_NOT_ASSIGNED then - AlertLogPtr(ResultID).ParentID := ParentID ; - -- else -- do not update as ParentIDs are either same or input ParentID = ALERTLOG_ID_NOT_ASSIGNED - end if ; - else - ResultID := GetNextAlertLogID ; - NewAlertLogRec(ResultID, Name, ParentID) ; - FoundAlertHierVar := TRUE ; - if CreateHierarchy then - FoundReportHierVar := TRUE ; - end if ; - end if ; - return ResultID ; - end function GetAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogPtr(AlertLogID).ParentID ; - end function GetAlertLogParentID ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- Accessor Methods - ------------------------------------------------------------ - - ------------------------------------------------------------ - procedure SetGlobalAlertEnable (A : boolean := TRUE) is - ------------------------------------------------------------ - begin - GlobalAlertEnabledVar := A ; - end procedure SetGlobalAlertEnable ; - - ------------------------------------------------------------ - impure function GetGlobalAlertEnable return boolean is - ------------------------------------------------------------ - begin - return GlobalAlertEnabledVar ; - end function GetGlobalAlertEnable ; - - ------------------------------------------------------------ - procedure IncAffirmCount is - ------------------------------------------------------------ - begin - if GlobalAlertEnabledVar then - AffirmCheckCountVar := AffirmCheckCountVar + 1 ; - end if ; - end procedure IncAffirmCount ; - - ------------------------------------------------------------ - impure function GetAffirmCount return natural is - ------------------------------------------------------------ - begin - return AffirmCheckCountVar ; - end function GetAffirmCount ; - ---?? ------------------------------------------------------------ ---?? procedure IncAffirmPassCount is ---?? ------------------------------------------------------------ ---?? begin ---?? if GlobalAlertEnabledVar then ---?? AffirmCheckCountVar := AffirmCheckCountVar + 1 ; ---?? AffirmPassedCountVar := AffirmPassedCountVar + 1 ; ---?? end if ; ---?? end procedure IncAffirmPassCount ; ---?? ---?? ------------------------------------------------------------ ---?? impure function GetAffirmPassCount return natural is ---?? ------------------------------------------------------------ ---?? begin ---?? return AffirmPassedCountVar ; ---?? end function GetAffirmPassCount ; - - ------------------------------------------------------------ - -- PT LOCAL - procedure SetOneStopCount( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Level : AlertType ; - Count : integer - ) is - begin - if AlertLogPtr(AlertLogID).AlertStopCount(Level) = integer'right then - AlertLogPtr(AlertLogID).AlertStopCount(Level) := Count ; - else - AlertLogPtr(AlertLogID).AlertStopCount(Level) := - AlertLogPtr(AlertLogID).AlertStopCount(Level) + Count ; - end if ; - end procedure SetOneStopCount ; - - ------------------------------------------------------------ - procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is - ------------------------------------------------------------ - begin - SetOneStopCount(AlertLogID, Level, Count) ; - if AlertLogID /= ALERTLOG_BASE_ID then - SetAlertStopCount(AlertLogPtr(AlertLogID).ParentID, Level, Count) ; - end if ; - end procedure SetAlertStopCount ; - - ------------------------------------------------------------ - impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is - ------------------------------------------------------------ - begin - return AlertLogPtr(AlertLogID).AlertStopCount(Level) ; - end function GetAlertStopCount ; - - ------------------------------------------------------------ - procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is - ------------------------------------------------------------ - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - AlertLogPtr(i).AlertEnabled(Level) := Enable ; - end loop ; - end procedure SetAlertEnable ; - - ------------------------------------------------------------ - procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogPtr(AlertLogID).AlertEnabled(Level) := Enable ; - if DescendHierarchy then - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - SetAlertEnable(i, Level, Enable, DescendHierarchy) ; - end if ; - end loop ; - end if ; - end procedure SetAlertEnable ; - - ------------------------------------------------------------ - impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogPtr(AlertLogID).AlertEnabled(Level) ; - end function GetAlertEnable ; - - ------------------------------------------------------------ - procedure SetLogEnable(Level : LogType ; Enable : boolean) is - ------------------------------------------------------------ - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - AlertLogPtr(i).LogEnabled(Level) := Enable ; - end loop ; - end procedure SetLogEnable ; - - ------------------------------------------------------------ - procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogPtr(AlertLogID).LogEnabled(Level) := Enable ; - if DescendHierarchy then - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - SetLogEnable(i, Level, Enable, DescendHierarchy) ; - end if ; - end loop ; - end if ; - end procedure SetLogEnable ; - - ------------------------------------------------------------ - impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is - ------------------------------------------------------------ - begin - if Level = ALWAYS then - return TRUE ; - else - return AlertLogPtr(AlertLogID).LogEnabled(Level) ; - end if ; - end function GetLogEnable ; - - ------------------------------------------------------------ - -- PT Local - procedure PrintLogLevels( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Prefix : string ; - IndentAmount : integer - ) is - variable buf : line ; - begin - write(buf, Prefix & " " & LeftJustify(AlertLogPtr(AlertLogID).Name.all, ReportJustifyAmountVar - IndentAmount)) ; - for i in LogIndexType loop - if AlertLogPtr(AlertLogID).LogEnabled(i) then --- write(buf, " " & to_string(AlertLogPtr(AlertLogID).LogEnabled(i)) ) ; - write(buf, " " & to_string(i)) ; - end if ; - end loop ; - WriteLine(buf) ; - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - PrintLogLevels( - AlertLogID => i, - Prefix => Prefix & " ", - IndentAmount => IndentAmount + 2 - ) ; - end if ; - end loop ; - end procedure PrintLogLevels ; - - ------------------------------------------------------------ - procedure ReportLogEnables is - ------------------------------------------------------------ - begin - if ReportJustifyAmountVar <= 0 then - SetJustify ; - end if ; - PrintLogLevels(ALERTLOG_BASE_ID, "", 0) ; - end procedure ReportLogEnables ; - - ------------------------------------------------------------ - procedure SetAlertLogOptions ( - ------------------------------------------------------------ - FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - begin - if FailOnWarning /= OPT_INIT_PARM_DETECT then - FailOnWarningVar := IsEnabled(FailOnWarning) ; - end if ; - if FailOnDisabledErrors /= OPT_INIT_PARM_DETECT then - FailOnDisabledErrorsVar := IsEnabled(FailOnDisabledErrors) ; - end if ; - if ReportHierarchy /= OPT_INIT_PARM_DETECT then - ReportHierarchyVar := IsEnabled(ReportHierarchy) ; - end if ; - if WriteAlertLevel /= OPT_INIT_PARM_DETECT then - WriteAlertLevelVar := IsEnabled(WriteAlertLevel) ; - end if ; - if WriteAlertName /= OPT_INIT_PARM_DETECT then - WriteAlertNameVar := IsEnabled(WriteAlertName) ; - end if ; - if WriteAlertTime /= OPT_INIT_PARM_DETECT then - WriteAlertTimeVar := IsEnabled(WriteAlertTime) ; - end if ; - if WriteLogLevel /= OPT_INIT_PARM_DETECT then - WriteLogLevelVar := IsEnabled(WriteLogLevel) ; - end if ; - if WriteLogName /= OPT_INIT_PARM_DETECT then - WriteLogNameVar := IsEnabled(WriteLogName) ; - end if ; - if WriteLogTime /= OPT_INIT_PARM_DETECT then - WriteLogTimeVar := IsEnabled(WriteLogTime) ; - end if ; - if AlertPrefix /= OSVVM_STRING_INIT_PARM_DETECT then - AlertPrefixVar.Set(AlertPrefix) ; - end if ; - if LogPrefix /= OSVVM_STRING_INIT_PARM_DETECT then - LogPrefixVar.Set(LogPrefix) ; - end if ; - if ReportPrefix /= OSVVM_STRING_INIT_PARM_DETECT then - ReportPrefixVar.Set(ReportPrefix) ; - end if ; - if DoneName /= OSVVM_STRING_INIT_PARM_DETECT then - DoneNameVar.Set(DoneName) ; - end if ; - if PassName /= OSVVM_STRING_INIT_PARM_DETECT then - PassNameVar.Set(PassName) ; - end if ; - if FailName /= OSVVM_STRING_INIT_PARM_DETECT then - FailNameVar.Set(FailName) ; - end if ; - end procedure SetAlertLogOptions ; - - ------------------------------------------------------------ - procedure ReportAlertLogOptions is - ------------------------------------------------------------ - variable buf : line ; - begin - -- Boolean Values - swrite(buf, "ReportAlertLogOptions" & LF ) ; - swrite(buf, "---------------------" & LF ) ; - swrite(buf, "FailOnWarningVar: " & to_string(FailOnWarningVar ) & LF ) ; - swrite(buf, "FailOnDisabledErrorsVar: " & to_string(FailOnDisabledErrorsVar ) & LF ) ; - swrite(buf, "ReportHierarchyVar: " & to_string(ReportHierarchyVar ) & LF ) ; - swrite(buf, "FoundReportHierVar: " & to_string(FoundReportHierVar ) & LF ) ; -- Not set by user - swrite(buf, "FoundAlertHierVar: " & to_string(FoundAlertHierVar ) & LF ) ; -- Not set by user - swrite(buf, "WriteAlertLevelVar: " & to_string(WriteAlertLevelVar ) & LF ) ; - swrite(buf, "WriteAlertNameVar: " & to_string(WriteAlertNameVar ) & LF ) ; - swrite(buf, "WriteAlertTimeVar: " & to_string(WriteAlertTimeVar ) & LF ) ; - swrite(buf, "WriteLogLevelVar: " & to_string(WriteLogLevelVar ) & LF ) ; - swrite(buf, "WriteLogNameVar: " & to_string(WriteLogNameVar ) & LF ) ; - swrite(buf, "WriteLogTimeVar: " & to_string(WriteLogTimeVar ) & LF ) ; - - -- String - swrite(buf, "AlertPrefixVar: " & string'(AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX)) & LF ) ; - swrite(buf, "LogPrefixVar: " & string'(LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX)) & LF ) ; - swrite(buf, "ReportPrefixVar: " & ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) & LF ) ; - swrite(buf, "DoneNameVar: " & ResolveOsvvmDoneName(DoneNameVar.GetOpt) & LF ) ; - swrite(buf, "PassNameVar: " & ResolveOsvvmPassName(PassNameVar.GetOpt) & LF ) ; - swrite(buf, "FailNameVar: " & ResolveOsvvmFailName(FailNameVar.GetOpt) & LF ) ; - writeline(buf) ; - end procedure ReportAlertLogOptions ; - - ------------------------------------------------------------ - impure function GetAlertLogFailOnWarning return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(FailOnWarningVar) ; - end function GetAlertLogFailOnWarning ; - - ------------------------------------------------------------ - impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(FailOnDisabledErrorsVar) ; - end function GetAlertLogFailOnDisabledErrors ; - - ------------------------------------------------------------ - impure function GetAlertLogReportHierarchy return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(ReportHierarchyVar) ; - end function GetAlertLogReportHierarchy ; - - ------------------------------------------------------------ - impure function GetAlertLogFoundReportHier return boolean is - ------------------------------------------------------------ - begin - return FoundReportHierVar ; - end function GetAlertLogFoundReportHier ; - - ------------------------------------------------------------ - impure function GetAlertLogFoundAlertHier return boolean is - ------------------------------------------------------------ - begin - return FoundAlertHierVar ; - end function GetAlertLogFoundAlertHier ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteAlertLevelVar) ; - end function GetAlertLogWriteAlertLevel ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertName return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteAlertNameVar) ; - end function GetAlertLogWriteAlertName ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertTime return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteAlertTimeVar) ; - end function GetAlertLogWriteAlertTime ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogLevel return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteLogLevelVar) ; - end function GetAlertLogWriteLogLevel ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogName return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteLogNameVar) ; - end function GetAlertLogWriteLogName ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogTime return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteLogTimeVar) ; - end function GetAlertLogWriteLogTime ; - - ------------------------------------------------------------ - impure function GetAlertLogAlertPrefix return string is - ------------------------------------------------------------ - begin - return AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; - end function GetAlertLogAlertPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogLogPrefix return string is - ------------------------------------------------------------ - begin - return LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ; - end function GetAlertLogLogPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogReportPrefix return string is - ------------------------------------------------------------ - begin - return ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ; - end function GetAlertLogReportPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogDoneName return string is - ------------------------------------------------------------ - begin - return ResolveOsvvmDoneName(DoneNameVar.GetOpt) ; - end function GetAlertLogDoneName ; - - ------------------------------------------------------------ - impure function GetAlertLogPassName return string is - ------------------------------------------------------------ - begin - return ResolveOsvvmPassName(PassNameVar.GetOpt) ; - end function GetAlertLogPassName ; - - ------------------------------------------------------------ - impure function GetAlertLogFailName return string is - ------------------------------------------------------------ - begin - return ResolveOsvvmFailName(FailNameVar.GetOpt) ; - end function GetAlertLogFailName ; - - end protected body AlertLogStructPType ; - - - - shared variable AlertLogStruct : AlertLogStructPType ; - ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// - - ------------------------------------------------------------ - procedure Alert( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Message : string ; - Level : AlertType := ERROR - ) is - begin - AlertLogStruct.Alert(AlertLogID, Message, Level) ; - end procedure alert ; - - ------------------------------------------------------------ - procedure Alert( Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; - end procedure alert ; - - ------------------------------------------------------------ - procedure IncAlertCount( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Level : AlertType := ERROR - ) is - begin - AlertLogStruct.IncAlertCount(AlertLogID, Level) ; - end procedure IncAlertCount ; - - ------------------------------------------------------------ - procedure IncAlertCount( Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - AlertLogStruct.IncAlertCount(ALERT_DEFAULT_ID, Level) ; - end procedure IncAlertCount ; - - - ------------------------------------------------------------ - procedure AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if condition then - AlertLogStruct.Alert(AlertLogID , Message, Level) ; - end if ; - end procedure AlertIf ; - - ------------------------------------------------------------ - procedure AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if condition then - AlertLogStruct.Alert(ALERT_DEFAULT_ID , Message, Level) ; - end if ; - end procedure AlertIf ; - - ------------------------------------------------------------ - -- useful in a loop: exit when AlertIf( not ReadValid, failure, "Read Failed") ; - impure function AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is - ------------------------------------------------------------ - begin - if condition then - AlertLogStruct.Alert(AlertLogID , Message, Level) ; - end if ; - return condition ; - end function AlertIf ; - - ------------------------------------------------------------ - impure function AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is - ------------------------------------------------------------ - begin - if condition then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; - end if ; - return condition ; - end function AlertIf ; - - ------------------------------------------------------------ - procedure AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if not condition then - AlertLogStruct.Alert(AlertLogID, Message, Level) ; - end if ; - end procedure AlertIfNot ; - - ------------------------------------------------------------ - procedure AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if not condition then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; - end if ; - end procedure AlertIfNot ; - - ------------------------------------------------------------ - -- useful in a loop: exit when AlertIfNot( not ReadValid, failure, "Read Failed") ; - impure function AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is - ------------------------------------------------------------ - begin - if not condition then - AlertLogStruct.Alert(AlertLogID, Message, Level) ; - end if ; - return not condition ; - end function AlertIfNot ; - - ------------------------------------------------------------ - impure function AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is - ------------------------------------------------------------ - begin - if not condition then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; - end if ; - return not condition ; - end function AlertIfNot ; - - - ------------------------------------------------------------ - -- AlertIfEqual with AlertLogID - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - - ------------------------------------------------------------ - -- AlertIfEqual without AlertLogID - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - - ------------------------------------------------------------ - -- AlertIfNotEqual with AlertLogID - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - - ------------------------------------------------------------ - -- AlertIfNotEqual without AlertLogID - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - - ------------------------------------------------------------ - -- Local - procedure LocalAlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string ; Level : AlertType ; Valid : out boolean ) is - -- Simple diff. - ------------------------------------------------------------ - variable Buf1, Buf2 : line ; - variable File1Done, File2Done : boolean ; - variable LineCount : integer := 0 ; - begin - ReadLoop : loop - File1Done := EndFile(File1) ; - File2Done := EndFile(File2) ; - exit ReadLoop when File1Done or File2Done ; - - ReadLine(File1, Buf1) ; - ReadLine(File2, Buf2) ; - LineCount := LineCount + 1 ; - - if Buf1.all /= Buf2.all then - AlertLogStruct.Alert(AlertLogID , Message & " File miscompare on line " & to_string(LineCount), Level) ; - exit ReadLoop ; - end if ; - end loop ReadLoop ; - if File1Done /= File2Done then - if not File1Done then - AlertLogStruct.Alert(AlertLogID , Message & " File1 longer than File2 " & to_string(LineCount), Level) ; - end if ; - if not File2Done then - AlertLogStruct.Alert(AlertLogID , Message & " File2 longer than File1 " & to_string(LineCount), Level) ; - end if ; - end if; - if File1Done and File2Done then - Valid := TRUE ; - else - Valid := FALSE ; - end if ; - end procedure LocalAlertIfDiff ; - - ------------------------------------------------------------ - -- Local - procedure LocalAlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string ; Level : AlertType ; Valid : out boolean ) is - -- Open files and call AlertIfDiff[text, ...] - ------------------------------------------------------------ - file FileID1, FileID2 : text ; - variable status1, status2 : file_open_status ; - begin - Valid := FALSE ; - file_open(status1, FileID1, Name1, READ_MODE) ; - file_open(status2, FileID2, Name2, READ_MODE) ; - if status1 = OPEN_OK and status2 = OPEN_OK then - LocalAlertIfDiff (AlertLogID, FileID1, FileID2, Message & " " & Name1 & " /= " & Name2 & ", ", Level, Valid) ; - else - if status1 /= OPEN_OK then - AlertLogStruct.Alert(AlertLogID , Message & " File, " & Name1 & ", did not open", Level) ; - end if ; - if status2 /= OPEN_OK then - AlertLogStruct.Alert(AlertLogID , Message & " File, " & Name2 & ", did not open", Level) ; - end if ; - end if; - end procedure LocalAlertIfDiff ; - - ------------------------------------------------------------ - procedure AlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) is - -- Open files and call AlertIfDiff[text, ...] - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (AlertLogID, Name1, Name2, Message, Level, Valid) ; - end procedure AlertIfDiff ; - - ------------------------------------------------------------ - procedure AlertIfDiff (Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (ALERT_DEFAULT_ID, Name1, Name2, Message, Level, Valid) ; - end procedure AlertIfDiff ; - - ------------------------------------------------------------ - procedure AlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) is - -- Simple diff. - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (AlertLogID, File1, File2, Message, Level, Valid ) ; - end procedure AlertIfDiff ; - - ------------------------------------------------------------ - procedure AlertIfDiff (file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (ALERT_DEFAULT_ID, File1, File2, Message, Level, Valid ) ; - end procedure AlertIfDiff ; - - ------------------------------------------------------------ - procedure AffirmIf( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - condition : boolean ; - ReceivedMessage : string ; - ExpectedMessage : string ; - Enable : boolean := FALSE -- override internal enable - ) is - begin - AlertLogStruct.IncAffirmCount ; -- increment check count - if condition then - -- passed - AlertLogStruct.Log(AlertLogID, ReceivedMessage, PASSED, Enable) ; --- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count - else - AlertLogStruct.Alert(AlertLogID, ReceivedMessage & ExpectedMessage, ERROR) ; - end if ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - procedure AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, condition, ReceivedMessage, ExpectedMessage, Enable) ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, condition, ReceivedMessage, ExpectedMessage, Enable) ; - return condition ; - end function AffirmIf ; - - ------------------------------------------------------------ - impure function AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, condition, ReceivedMessage, ExpectedMessage, Enable) ; - return condition ; - end function AffirmIf ; - - - ------------------------------------------------------------ - procedure AffirmIf( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - condition : boolean ; - Message : string ; - Enable : boolean := FALSE -- override internal enable - ) is - begin - AlertLogStruct.IncAffirmCount ; -- increment check count - if condition then - -- passed - AlertLogStruct.Log(AlertLogID, Message, PASSED, Enable) ; --- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count - else - AlertLogStruct.Alert(AlertLogID, Message, ERROR) ; - end if ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - procedure AffirmIf(condition : boolean ; Message : string ; Enable : boolean := FALSE) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, condition, Message, Enable) ; - end procedure AffirmIf; - - ------------------------------------------------------------ - -- useful in a loop: exit when AffirmIf( ID, not ReadValid, "Read Failed") ; - impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, condition, Message, Enable) ; - return condition ; - end function AffirmIf ; - - ------------------------------------------------------------ - impure function AffirmIf( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, condition, Message, Enable) ; - return condition ; - end function AffirmIf ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; - end procedure AffirmIfNot ; - - ------------------------------------------------------------ - procedure AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; - end procedure AffirmIfNot ; - - ------------------------------------------------------------ - -- useful in a loop: exit when AffirmIfNot( not ReadValid, failure, "Read Failed") ; - impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; - return not condition ; - end function AffirmIfNot ; - - ------------------------------------------------------------ - impure function AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; - return not condition ; - end function AffirmIfNot ; - - ------------------------------------------------------------ - procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, not condition, Message, Enable) ; - end procedure AffirmIfNot ; - - ------------------------------------------------------------ - procedure AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, not condition, Message, Enable) ; - end procedure AffirmIfNot ; - - ------------------------------------------------------------ - -- useful in a loop: exit when AffirmIfNot( not ReadValid, failure, "Read Failed") ; - impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, not condition, Message, Enable) ; - return not condition ; - end function AffirmIfNot ; - - ------------------------------------------------------------ - impure function AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, not condition, Message, Enable) ; - return not condition ; - end function AffirmIfNot ; - - - ------------------------------------------------------------ - ------------------------------------------------------------ - procedure AffirmPassed( AlertLogID : AlertLogIDType ; Message : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, TRUE, Message, Enable) ; - end procedure AffirmPassed ; - - ------------------------------------------------------------ - procedure AffirmPassed( Message : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, TRUE, Message, Enable) ; - end procedure AffirmPassed ; - - ------------------------------------------------------------ - procedure AffirmError( AlertLogID : AlertLogIDType ; Message : string ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, FALSE, Message, FALSE) ; - end procedure AffirmError ; - - ------------------------------------------------------------ - procedure AffirmError( Message : string ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, FALSE, Message, FALSE) ; - end procedure AffirmError ; - - -- With AlertLogID - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, ??(Received ?= Expected), - Message & " Received : " & to_hstring(Received), - " ?= Expected : " & to_hstring(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, ??(Received ?= Expected), - Message & " Received : " & to_hstring(Received), - " ?= Expected : " & to_hstring(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, ??(Received ?= Expected), - Message & " Received : " & to_hstring(Received), - " ?= Expected : " & to_hstring(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & to_string(Received, 4), - " = Expected : " & to_string(Expected, 4), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & Received, - " = Expected : " & Expected, - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - -- Without AlertLogID - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & to_string(Received, 4), - " = Expected : " & to_string(Expected, 4), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & Received, - " = Expected : " & Expected, - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) is - -- Open files and call AffirmIfDiff[text, ...] - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (AlertLogID, Name1, Name2, Message, ERROR, Valid) ; - if Valid then - AlertLogStruct.Log(AlertLogID, Message & " " & Name1 & " = " & Name2, PASSED, Enable) ; - end if ; - end procedure AffirmIfDiff ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (ALERT_DEFAULT_ID, Name1, Name2, Message, ERROR, Valid) ; - if Valid then - AlertLogStruct.Log(ALERT_DEFAULT_ID, Message & " " & Name1 & " = " & Name2, PASSED, Enable) ; - end if ; - end procedure AffirmIfDiff ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) is - -- Simple diff. - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (AlertLogID, File1, File2, Message, ERROR, Valid ) ; - if Valid then - AlertLogStruct.Log(AlertLogID, Message, PASSED, Enable) ; - end if ; - end procedure AffirmIfDiff ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (ALERT_DEFAULT_ID, File1, File2, Message, ERROR, Valid ) ; - if Valid then - AlertLogStruct.Log(ALERT_DEFAULT_ID, Message, PASSED, Enable) ; - end if ; - end procedure AffirmIfDiff ; - - ------------------------------------------------------------ - procedure SetAlertLogJustify is - ------------------------------------------------------------ - begin - AlertLogStruct.SetJustify ; - end procedure SetAlertLogJustify ; - - ------------------------------------------------------------ - procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportAlerts(Name, AlertCount) ; - end procedure ReportAlerts ; - - ------------------------------------------------------------ - procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, TRUE) ; - end procedure ReportAlerts ; - - ------------------------------------------------------------ - procedure ReportNonZeroAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, FALSE) ; - end procedure ReportNonZeroAlerts ; - - ------------------------------------------------------------ - procedure ClearAlerts is - ------------------------------------------------------------ - begin - AlertLogStruct.ClearAlerts ; - end procedure ClearAlerts ; - - ------------------------------------------------------------ - function "ABS" (L : AlertCountType) return AlertCountType is - ------------------------------------------------------------ - variable Result : AlertCountType ; - begin - Result(FAILURE) := ABS( L(FAILURE) ) ; - Result(ERROR) := ABS( L(ERROR) ) ; - Result(WARNING) := ABS( L(WARNING) ); - return Result ; - end function "ABS" ; - - ------------------------------------------------------------ - function "+" (L, R : AlertCountType) return AlertCountType is - ------------------------------------------------------------ - variable Result : AlertCountType ; - begin - Result(FAILURE) := L(FAILURE) + R(FAILURE) ; - Result(ERROR) := L(ERROR) + R(ERROR) ; - Result(WARNING) := L(WARNING) + R(WARNING) ; - return Result ; - end function "+" ; - - ------------------------------------------------------------ - function "-" (L, R : AlertCountType) return AlertCountType is - ------------------------------------------------------------ - variable Result : AlertCountType ; - begin - Result(FAILURE) := L(FAILURE) - R(FAILURE) ; - Result(ERROR) := L(ERROR) - R(ERROR) ; - Result(WARNING) := L(WARNING) - R(WARNING) ; - return Result ; - end function "-" ; - - ------------------------------------------------------------ - function "-" (R : AlertCountType) return AlertCountType is - ------------------------------------------------------------ - variable Result : AlertCountType ; - begin - Result(FAILURE) := - R(FAILURE) ; - Result(ERROR) := - R(ERROR) ; - Result(WARNING) := - R(WARNING) ; - return Result ; - end function "-" ; - - ------------------------------------------------------------ - impure function SumAlertCount(AlertCount: AlertCountType) return integer is - ------------------------------------------------------------ - begin - -- Using ABS ensures correct expected error handling. - return abs(AlertCount(FAILURE)) + abs(AlertCount(ERROR)) + abs(AlertCount(WARNING)) ; - end function SumAlertCount ; - - ------------------------------------------------------------ - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertCount(AlertLogID) ; - end function GetAlertCount ; - - ------------------------------------------------------------ - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is - ------------------------------------------------------------ - begin - return SumAlertCount(AlertLogStruct.GetAlertCount(AlertLogID)) ; - end function GetAlertCount ; - - ------------------------------------------------------------ - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetEnabledAlertCount(AlertLogID) ; - end function GetEnabledAlertCount ; - - ------------------------------------------------------------ - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is - ------------------------------------------------------------ - begin - return SumAlertCount(AlertLogStruct.GetEnabledAlertCount(AlertLogID)) ; - end function GetEnabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount return AlertCountType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetDisabledAlertCount ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount return integer is - ------------------------------------------------------------ - begin - return SumAlertCount(AlertLogStruct.GetDisabledAlertCount) ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetDisabledAlertCount(AlertLogID) ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer is - ------------------------------------------------------------ - begin - return SumAlertCount(AlertLogStruct.GetDisabledAlertCount(AlertLogID)) ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - procedure Log( - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType := ALWAYS ; - Enable : boolean := FALSE -- override internal enable - ) is - begin - AlertLogStruct.Log(AlertLogID, Message, Level, Enable) ; - end procedure log ; - - ------------------------------------------------------------ - procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) is - ------------------------------------------------------------ - begin - AlertLogStruct.Log(LOG_DEFAULT_ID, Message, Level, Enable) ; - end procedure log ; - - ------------------------------------------------------------ - procedure SetAlertLogName(Name : string ) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertLogName(Name) ; - end procedure SetAlertLogName ; - - ------------------------------------------------------------ - impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogName(AlertLogID) ; - end GetAlertLogName ; - - ------------------------------------------------------------ - procedure DeallocateAlertLogStruct is - ------------------------------------------------------------ - begin - AlertLogStruct.Deallocate ; - end procedure DeallocateAlertLogStruct ; - - ------------------------------------------------------------ - procedure InitializeAlertLogStruct is - ------------------------------------------------------------ - begin - AlertLogStruct.Initialize ; - end procedure InitializeAlertLogStruct ; - - ------------------------------------------------------------ - impure function FindAlertLogID(Name : string ) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogStruct.FindAlertLogID(Name) ; - end function FindAlertLogID ; - - ------------------------------------------------------------ - impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogStruct.FindAlertLogID(Name, ParentID) ; - end function FindAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogID(Name, ParentID, CreateHierarchy ) ; - end function GetAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogParentID(AlertLogID) ; - end function GetAlertLogParentID ; - - ------------------------------------------------------------ - procedure SetGlobalAlertEnable (A : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetGlobalAlertEnable(A) ; - end procedure SetGlobalAlertEnable ; - - ------------------------------------------------------------ - -- Set using constant. Set before code runs. - impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean is - ------------------------------------------------------------ - begin - AlertLogStruct.SetGlobalAlertEnable(A) ; - return A ; - end function SetGlobalAlertEnable ; - - ------------------------------------------------------------ - impure function GetGlobalAlertEnable return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetGlobalAlertEnable ; - end function GetGlobalAlertEnable ; - - ------------------------------------------------------------ - procedure IncAffirmCount is - ------------------------------------------------------------ - begin - AlertLogStruct.IncAffirmCount ; - end procedure IncAffirmCount ; - - ------------------------------------------------------------ - impure function GetAffirmCount return natural is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAffirmCount ; - end function GetAffirmCount ; - ---?? ------------------------------------------------------------ ---?? procedure IncAffirmPassCount is ---?? ------------------------------------------------------------ ---?? begin ---?? AlertLogStruct.IncAffirmPassCount ; ---?? end procedure IncAffirmPassCount ; ---?? ---?? ------------------------------------------------------------ ---?? impure function GetAffirmPassCount return natural is ---?? ------------------------------------------------------------ ---?? begin ---?? return AlertLogStruct.GetAffirmPassCount ; ---?? end function GetAffirmPassCount ; - - ------------------------------------------------------------ - procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertStopCount(AlertLogID, Level, Count) ; - end procedure SetAlertStopCount ; - - ------------------------------------------------------------ - procedure SetAlertStopCount(Level : AlertType ; Count : integer) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertStopCount(ALERTLOG_BASE_ID, Level, Count) ; - end procedure SetAlertStopCount ; - - ------------------------------------------------------------ - impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertStopCount(AlertLogID, Level) ; - end function GetAlertStopCount ; - - ------------------------------------------------------------ - impure function GetAlertStopCount(Level : AlertType) return integer is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertStopCount(ALERTLOG_BASE_ID, Level) ; - end function GetAlertStopCount ; - - ------------------------------------------------------------ - procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertEnable(Level, Enable) ; - end procedure SetAlertEnable ; - - ------------------------------------------------------------ - procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertEnable(AlertLogID, Level, Enable, DescendHierarchy) ; - end procedure SetAlertEnable ; - - ------------------------------------------------------------ - impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertEnable(AlertLogID, Level) ; - end function GetAlertEnable ; - - ------------------------------------------------------------ - impure function GetAlertEnable(Level : AlertType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertEnable(ALERT_DEFAULT_ID, Level) ; - end function GetAlertEnable ; - - ------------------------------------------------------------ - procedure SetLogEnable(Level : LogType ; Enable : boolean) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetLogEnable(Level, Enable) ; - end procedure SetLogEnable ; - - ------------------------------------------------------------ - procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetLogEnable(AlertLogID, Level, Enable, DescendHierarchy) ; - end procedure SetLogEnable ; - - ------------------------------------------------------------ - impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetLogEnable(AlertLogID, Level) ; - end function GetLogEnable ; - - ------------------------------------------------------------ - impure function GetLogEnable(Level : LogType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetLogEnable(LOG_DEFAULT_ID, Level) ; - end function GetLogEnable ; - - ------------------------------------------------------------ - procedure ReportLogEnables is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportLogEnables ; - end ReportLogEnables ; - - ------------------------------------------------------------ - procedure SetAlertLogOptions ( - ------------------------------------------------------------ - FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - begin - AlertLogStruct.SetAlertLogOptions ( - FailOnWarning => FailOnWarning , - FailOnDisabledErrors => FailOnDisabledErrors, - ReportHierarchy => ReportHierarchy , - WriteAlertLevel => WriteAlertLevel , - WriteAlertName => WriteAlertName , - WriteAlertTime => WriteAlertTime , - WriteLogLevel => WriteLogLevel , - WriteLogName => WriteLogName , - WriteLogTime => WriteLogTime , - AlertPrefix => AlertPrefix , - LogPrefix => LogPrefix , - ReportPrefix => ReportPrefix , - DoneName => DoneName , - PassName => PassName , - FailName => FailName - ); - end procedure SetAlertLogOptions ; - - ------------------------------------------------------------ - procedure ReportAlertLogOptions is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportAlertLogOptions ; - end procedure ReportAlertLogOptions ; - - ------------------------------------------------------------ - impure function GetAlertLogFailOnWarning return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFailOnWarning ; - end function GetAlertLogFailOnWarning ; - - ------------------------------------------------------------ - impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFailOnDisabledErrors ; - end function GetAlertLogFailOnDisabledErrors ; - - ------------------------------------------------------------ - impure function GetAlertLogReportHierarchy return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogReportHierarchy ; - end function GetAlertLogReportHierarchy ; - - ------------------------------------------------------------ - impure function GetAlertLogFoundReportHier return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFoundReportHier ; - end function GetAlertLogFoundReportHier ; - - ------------------------------------------------------------ - impure function GetAlertLogFoundAlertHier return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFoundAlertHier ; - end function GetAlertLogFoundAlertHier ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteAlertLevel ; - end function GetAlertLogWriteAlertLevel ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertName return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteAlertName ; - end function GetAlertLogWriteAlertName ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertTime return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteAlertTime ; - end function GetAlertLogWriteAlertTime ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogLevel return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteLogLevel ; - end function GetAlertLogWriteLogLevel ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogName return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteLogName ; - end function GetAlertLogWriteLogName ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogTime return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteLogTime ; - end function GetAlertLogWriteLogTime ; - - ------------------------------------------------------------ - impure function GetAlertLogAlertPrefix return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogAlertPrefix ; - end function GetAlertLogAlertPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogLogPrefix return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogLogPrefix ; - end function GetAlertLogLogPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogReportPrefix return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogReportPrefix ; - end function GetAlertLogReportPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogDoneName return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogDoneName ; - end function GetAlertLogDoneName ; - - ------------------------------------------------------------ - impure function GetAlertLogPassName return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogPassName ; - end function GetAlertLogPassName ; - - ------------------------------------------------------------ - impure function GetAlertLogFailName return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFailName ; - end function GetAlertLogFailName ; - - ------------------------------------------------------------ - function IsLogEnableType (Name : String) return boolean is - ------------------------------------------------------------ - -- type LogType is (ALWAYS, DEBUG, FINAL, INFO, PASSED) ; -- NEVER - begin - if Name = "PASSED" then return TRUE ; - elsif Name = "DEBUG" then return TRUE ; - elsif Name = "FINAL" then return TRUE ; - elsif Name = "INFO" then return TRUE ; - end if ; - return FALSE ; - end function IsLogEnableType ; - - ------------------------------------------------------------ - procedure ReadLogEnables (file AlertLogInitFile : text) is - -- Preferred Read format - -- Line 1: instance1_name log_enable log_enable log_enable - -- Line 2: instance2_name log_enable log_enable log_enable - -- when reading multiple log_enables on a line, they must be separated by a space - -- - --- Also supports alternate format from Lyle/.... - -- Line 1: instance1_name - -- Line 2: log enable - -- Line 3: instance2_name - -- Line 4: log enable - -- - ------------------------------------------------------------ - type ReadStateType is (GET_ID, GET_ENABLE) ; - variable ReadState : ReadStateType := GET_ID ; - variable buf : line ; - variable Empty : boolean ; - variable MultiLineComment : boolean := FALSE ; - variable Name : string(1 to 80) ; - variable NameLen : integer ; - variable AlertLogID : AlertLogIDType ; - variable ReadAnEnable : boolean ; - variable LogLevel : LogType ; - begin - ReadState := GET_ID ; - ReadLineLoop : while not EndFile(AlertLogInitFile) loop - ReadLine(AlertLogInitFile, buf) ; - if ReadAnEnable then - -- Read one or more enable values, next line read AlertLog name - -- Note that any newline with ReadAnEnable TRUE will result in - -- searching for another AlertLogID name - this includes multi-line comments. - ReadState := GET_ID ; - end if ; - - ReadNameLoop : loop - EmptyOrCommentLine(buf, Empty, MultiLineComment) ; - next ReadLineLoop when Empty ; - - case ReadState is - when GET_ID => - sread(buf, Name, NameLen) ; - exit ReadNameLoop when NameLen = 0 ; - AlertLogID := GetAlertLogID(Name(1 to NameLen), ALERTLOG_ID_NOT_ASSIGNED) ; - ReadState := GET_ENABLE ; - ReadAnEnable := FALSE ; - - when GET_ENABLE => - sread(buf, Name, NameLen) ; - exit ReadNameLoop when NameLen = 0 ; - ReadAnEnable := TRUE ; - if not IsLogEnableType(Name(1 to NameLen)) then - Alert(OSVVM_ALERTLOG_ID, "AlertLogPkg.ReadLogEnables: Found Invalid LogEnable: " & Name(1 to NameLen)) ; - exit ReadNameLoop ; - end if ; - LogLevel := LogType'value(Name(1 to NameLen)) ; - SetLogEnable(AlertLogID, LogLevel, TRUE) ; - end case ; - end loop ReadNameLoop ; - end loop ReadLineLoop ; - end procedure ReadLogEnables ; - - ------------------------------------------------------------ - procedure ReadLogEnables (FileName : string) is - ------------------------------------------------------------ - file AlertLogInitFile : text open READ_MODE is FileName ; - begin - ReadLogEnables(AlertLogInitFile) ; - end procedure ReadLogEnables ; - - ------------------------------------------------------------ - function PathTail (A : string) return string is - ------------------------------------------------------------ - alias aA : string(1 to A'length) is A ; - begin - for i in aA'length - 1 downto 1 loop - if aA(i) = ':' then - return aA(i+1 to aA'length-1) ; - end if ; - end loop ; - return aA ; - end function PathTail ; - - -- ------------------------------------------------------------ - -- Deprecated - -- - - ------------------------------------------------------------ - -- deprecated - procedure AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) is - begin - AlertIf( AlertLogID, condition, Message, Level) ; - end procedure AlertIf ; - - ------------------------------------------------------------ - -- deprecated - impure function AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean is - begin - return AlertIf( AlertLogID, condition, Message, Level) ; - end function AlertIf ; - - ------------------------------------------------------------ - -- deprecated - procedure AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) is - begin - AlertIfNot( AlertLogID, condition, Message, Level) ; - end procedure AlertIfNot ; - - ------------------------------------------------------------ - -- deprecated - impure function AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean is - begin - return AlertIfNot( AlertLogID, condition, Message, Level) ; - end function AlertIfNot ; - - ------------------------------------------------------------ - -- deprecated - procedure AffirmIf( - AlertLogID : AlertLogIDType ; - condition : boolean ; - Message : string ; - LogLevel : LogType ; -- := PASSED - AlertLevel : AlertType := ERROR - ) is - begin - AlertLogStruct.IncAffirmCount ; -- increment check count - if condition then - -- passed - AlertLogStruct.Log(AlertLogID, Message, LogLevel) ; -- call log --- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count - else - AlertLogStruct.Alert(AlertLogID, Message, AlertLevel) ; -- signal failure - end if ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - -- deprecated - procedure AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; AlertLevel : AlertType ) is - begin - AffirmIf(AlertLogID, condition, Message, PASSED, AlertLevel) ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - -- deprecated - procedure AffirmIf(condition : boolean ; Message : string ; LogLevel : LogType ; AlertLevel : AlertType := ERROR) is - begin - AffirmIf(ALERT_DEFAULT_ID, condition, Message, LogLevel, AlertLevel) ; - end procedure AffirmIf; - - ------------------------------------------------------------ - -- deprecated - procedure AffirmIf(condition : boolean ; Message : string ; AlertLevel : AlertType ) is - begin - AffirmIf(ALERT_DEFAULT_ID, condition, Message, PASSED, AlertLevel) ; - end procedure AffirmIf; - +-- +-- File Name: AlertLogPkg.vhd +-- Design Unit Name: AlertLogPkg +-- Revision: STANDARD VERSION +-- +-- Maintainer: Jim Lewis email: jim@synthworks.com +-- Contributor(s): +-- Jim Lewis jim@synthworks.com +-- +-- +-- Description: +-- Alert handling and log filtering (verbosity control) +-- Alert handling provides a method to count failures, errors, and warnings +-- To accumlate counts, a data structure is created in a shared variable +-- It is of type AlertLogStructPType which is defined in AlertLogBasePkg +-- Log filtering provides verbosity control for logs (display or do not display) +-- AlertLogPkg provides a simplified interface to the shared variable +-- +-- +-- Developed for: +-- SynthWorks Design Inc. +-- VHDL Training Classes +-- 11898 SW 128th Ave. Tigard, Or 97223 +-- http://www.SynthWorks.com +-- +-- Revision History: +-- Date Version Description +-- 01/2015: 2015.01 Initial revision +-- 03/2015 2015.03 Added: AlertIfEqual, AlertIfNotEqual, AlertIfDiff, PathTail, +-- ReportNonZeroAlerts, ReadLogEnables +-- 05/2015 2015.06 Added IncAlertCount, AffirmIf +-- 07/2015 2016.01 Fixed AlertLogID issue with > 32 IDs +-- 02/2016 2016.02 Fixed IsLogEnableType (for PASSED), AffirmIf (to pass AlertLevel) +-- Created LocalInitialize +-- 05/2017 2017.05 AffirmIfEqual, AffirmIfDiff, +-- GetAffirmCount (deprecates GetAffirmCheckCount), IncAffirmCount (deprecates IncAffirmCheckCount), +-- IsAlertEnabled (alias), IsLogEnabled (alias) +-- +-- +-- Copyright (c) 2015 - 2017 by SynthWorks Design Inc. All rights reserved. +-- +-- Verbatim copies of this source file may be used and +-- distributed without restriction. +-- +-- This source file is free software; you can redistribute it +-- and/or modify it under the terms of the ARTISTIC License +-- as published by The Perl Foundation; either version 2.0 of +-- the License, or (at your option) any later version. +-- +-- This source is distributed in the hope that it will be +-- useful, but WITHOUT ANY WARRANTY; without even the implied +-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +-- PURPOSE. See the Artistic License for details. +-- +-- You should have received a copy of the license with this source. +-- If not download it from, +-- http://www.perlfoundation.org/artistic_license_2_0 +-- + + +use std.textio.all ; +use work.OsvvmGlobalPkg.all ; +use work.TranscriptPkg.all ; +use work.TextUtilPkg.all ; + +library IEEE ; +use ieee.std_logic_1164.all ; +use ieee.numeric_std.all ; + +package AlertLogPkg is + +-- type AlertLogIDType is range integer'low to integer'high ; -- next revsion + subtype AlertLogIDType is integer ; + type AlertLogIDVectorType is array (integer range <>) of AlertLogIDType ; + type AlertType is (FAILURE, ERROR, WARNING) ; -- NEVER + subtype AlertIndexType is AlertType range FAILURE to WARNING ; + type AlertCountType is array (AlertIndexType) of integer ; + type AlertEnableType is array(AlertIndexType) of boolean ; + type LogType is (ALWAYS, DEBUG, FINAL, INFO, PASSED) ; -- NEVER -- See function IsLogEnableType + subtype LogIndexType is LogType range DEBUG to PASSED ; + type LogEnableType is array (LogIndexType) of boolean ; + + constant ALERTLOG_BASE_ID : AlertLogIDType := 0 ; -- Careful as some code may assume this is 0. + constant ALERTLOG_DEFAULT_ID : AlertLogIDType := 1 ; + constant ALERT_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ; + constant LOG_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ; + constant OSVVM_ALERTLOG_ID : AlertLogIDType := 2 ; + constant OSVVM_SCOREBOARD_ALERTLOG_ID : AlertLogIDType := OSVVM_ALERTLOG_ID ; + -- NUM_PREDEFINED_AL_IDS intended to be local, but depends on others + -- constant NUM_PREDEFINED_AL_IDS : AlertLogIDType := OSVVM_SCOREBOARD_ALERTLOG_ID - ALERTLOG_BASE_ID ; -- Not including base + constant ALERTLOG_ID_NOT_FOUND : AlertLogIDType := -1 ; -- alternately integer'right + constant ALERTLOG_ID_NOT_ASSIGNED : AlertLogIDType := -1 ; + constant MIN_NUM_AL_IDS : AlertLogIDType := 32 ; -- Number IDs initially allocated + + alias AlertLogOptionsType is work.OsvvmGlobalPkg.OsvvmOptionsType ; + + ------------------------------------------------------------ + -- Alert always goes to the transcript file + procedure Alert( + AlertLogID : AlertLogIDType ; + Message : string ; + Level : AlertType := ERROR + ) ; + procedure Alert( Message : string ; Level : AlertType := ERROR ) ; + + ------------------------------------------------------------ + procedure IncAlertCount( -- A silent form of alert + AlertLogID : AlertLogIDType ; + Level : AlertType := ERROR + ) ; + procedure IncAlertCount( Level : AlertType := ERROR ) ; + + ------------------------------------------------------------ + -- Similar to assert, except condition is positive + procedure AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; + impure function AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; + impure function AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; + + ------------------------------------------------------------ + -- Direct replacement for assert + procedure AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; + impure function AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; + impure function AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; + + ------------------------------------------------------------ + -- overloading for common functionality + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) ; + + procedure AlertIfEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) ; + + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) ; + + procedure AlertIfNotEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) ; + + ------------------------------------------------------------ + -- Simple Diff for file comparisons + procedure AlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) ; + procedure AlertIfDiff (Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) ; + procedure AlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) ; + procedure AlertIfDiff (file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + ------------------------------------------------------------ + procedure AffirmIf( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + condition : boolean ; + ReceivedMessage : string ; + ExpectedMessage : string ; + Enable : boolean := FALSE -- override internal enable + ) ; + + procedure AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; + impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; + impure function AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; + + procedure AffirmIf( + AlertLogID : AlertLogIDType ; + condition : boolean ; + Message : string ; + Enable : boolean := FALSE -- override internal enable + ) ; + + procedure AffirmIf(condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; + impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; + impure function AffirmIf( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; + + ------------------------------------------------------------ + procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; + procedure AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; + impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; + impure function AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; + + ------------------------------------------------------------ + procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; + procedure AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; + impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; + impure function AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; + + ------------------------------------------------------------ + procedure AffirmPassed( AlertLogID : AlertLogIDType ; Message : string ; Enable : boolean := FALSE ) ; + procedure AffirmPassed( Message : string ; Enable : boolean := FALSE ) ; + procedure AffirmError( AlertLogID : AlertLogIDType ; Message : string ) ; + procedure AffirmError( Message : string ) ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ); + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) ; + + -- Without AlertLogID + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfDiff (Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfDiff (file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) ; + + ------------------------------------------------------------ + procedure SetAlertLogJustify ; + procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) ; + procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) ; + procedure ReportNonZeroAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) ; + procedure ClearAlerts ; + function "ABS" (L : AlertCountType) return AlertCountType ; + function "+" (L, R : AlertCountType) return AlertCountType ; + function "-" (L, R : AlertCountType) return AlertCountType ; + function "-" (R : AlertCountType) return AlertCountType ; + impure function SumAlertCount(AlertCount: AlertCountType) return integer ; + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer ; + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer ; + impure function GetDisabledAlertCount return AlertCountType ; + impure function GetDisabledAlertCount return integer ; + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType ; + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer ; + + ------------------------------------------------------------ + -- log filtering for verbosity control, optionally has a separate file parameter + procedure Log( + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType := ALWAYS ; + Enable : boolean := FALSE -- override internal enable + ) ; + procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) ; + + ------------------------------------------------------------ + -- Accessor Methods + procedure SetAlertLogName(Name : string ) ; + impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string ; + procedure DeallocateAlertLogStruct ; + procedure InitializeAlertLogStruct ; + impure function FindAlertLogID(Name : string ) return AlertLogIDType ; + impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; + impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType ; + impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; + + ------------------------------------------------------------ + -- Accessor Methods + procedure SetGlobalAlertEnable (A : boolean := TRUE) ; + impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean ; + impure function GetGlobalAlertEnable return boolean ; + procedure IncAffirmCount ; + impure function GetAffirmCount return natural ; +--?? procedure IncAffirmPassCount ; +--?? impure function GetAffirmPassCount return natural ; + + procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ; + procedure SetAlertStopCount(Level : AlertType ; Count : integer) ; + impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ; + impure function GetAlertStopCount(Level : AlertType) return integer ; + + procedure SetAlertEnable(Level : AlertType ; Enable : boolean) ; + procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; + impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean ; + impure function GetAlertEnable(Level : AlertType) return boolean ; + alias IsAlertEnabled is GetAlertEnable[AlertLogIDType, AlertType return boolean] ; + alias IsAlertEnabled is GetAlertEnable[AlertType return boolean] ; + + procedure SetLogEnable(Level : LogType ; Enable : boolean) ; + procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; + impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean ; + impure function GetLogEnable(Level : LogType) return boolean ; + alias IsLogEnabled is GetLogEnable [AlertLogIDType, LogType return boolean] ; -- same as GetLogEnable + alias IsLogEnabled is GetLogEnable [LogType return boolean] ; -- same as GetLogEnable + + procedure ReportLogEnables ; + + ------------------------------------------------------------ + procedure SetAlertLogOptions ( + FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + + procedure ReportAlertLogOptions ; + + impure function GetAlertLogFailOnWarning return AlertLogOptionsType ; + impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType ; + impure function GetAlertLogReportHierarchy return AlertLogOptionsType ; + impure function GetAlertLogFoundReportHier return boolean ; + impure function GetAlertLogFoundAlertHier return boolean ; + impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType ; + impure function GetAlertLogWriteAlertName return AlertLogOptionsType ; + impure function GetAlertLogWriteAlertTime return AlertLogOptionsType ; + impure function GetAlertLogWriteLogLevel return AlertLogOptionsType ; + impure function GetAlertLogWriteLogName return AlertLogOptionsType ; + impure function GetAlertLogWriteLogTime return AlertLogOptionsType ; + + impure function GetAlertLogAlertPrefix return string ; + impure function GetAlertLogLogPrefix return string ; + + impure function GetAlertLogReportPrefix return string ; + impure function GetAlertLogDoneName return string ; + impure function GetAlertLogPassName return string ; + impure function GetAlertLogFailName return string ; + + + -- File Reading Utilities + function IsLogEnableType (Name : String) return boolean ; + procedure ReadLogEnables (file AlertLogInitFile : text) ; + procedure ReadLogEnables (FileName : string) ; + + -- String Helper Functions -- This should be in a more general string package + function PathTail (A : string) return string ; + + + -- ------------------------------------------------------------ + -- Deprecated + -- + + -- deprecated + procedure AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) ; + impure function AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean ; + + -- deprecated + procedure AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) ; + impure function AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean ; + + -- deprecated + procedure AffirmIf( + AlertLogID : AlertLogIDType ; + condition : boolean ; + Message : string ; + LogLevel : LogType ; -- := PASSED + AlertLevel : AlertType := ERROR + ) ; + procedure AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; AlertLevel : AlertType ) ; + procedure AffirmIf(condition : boolean ; Message : string ; LogLevel : LogType ; AlertLevel : AlertType := ERROR) ; + procedure AffirmIf(condition : boolean ; Message : string ; AlertLevel : AlertType ) ; + + alias IncAffirmCheckCount is IncAffirmCount [] ; + alias GetAffirmCheckCount is GetAffirmCount [return natural] ; + alias IsLoggingEnabled is GetLogEnable [AlertLogIDType, LogType return boolean] ; -- same as IsLogEnabled + alias IsLoggingEnabled is GetLogEnable [LogType return boolean] ; -- same as IsLogEnabled + + +end AlertLogPkg ; + +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// + +use work.NamePkg.all ; + +package body AlertLogPkg is + + -- instead of justify(to_upper(to_string())), just look up the upper case, left justified values + type AlertNameType is array(AlertType) of string(1 to 7) ; + constant ALERT_NAME : AlertNameType := (WARNING => "WARNING", ERROR => "ERROR ", FAILURE => "FAILURE") ; -- , NEVER => "NEVER " + type LogNameType is array(LogType) of string(1 to 7) ; + constant LOG_NAME : LogNameType := (DEBUG => "DEBUG ", FINAL => "FINAL ", INFO => "INFO ", ALWAYS => "ALWAYS ", PASSED => "PASSED ") ; -- , NEVER => "NEVER " + + + type AlertLogStructPType is protected + + ------------------------------------------------------------ + procedure alert ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + message : string ; + level : AlertType := ERROR + ) ; + + ------------------------------------------------------------ + procedure IncAlertCount ( AlertLogID : AlertLogIDType ; level : AlertType := ERROR ) ; + procedure SetJustify ; + procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) ; + procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (0,0,0) ; ReportAll : boolean := TRUE ) ; + procedure ClearAlerts ; + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; + impure function GetDisabledAlertCount return AlertCountType ; + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType ; + + ------------------------------------------------------------ + procedure log ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType := ALWAYS ; + Enable : boolean := FALSE -- override internal enable + ) ; + + ------------------------------------------------------------ + -- FILE IO Controls +-- procedure SetTranscriptEnable (A : boolean := TRUE) ; +-- impure function IsTranscriptEnabled return boolean ; +-- procedure MirrorTranscript (A : boolean := TRUE) ; +-- impure function IsTranscriptMirrored return boolean ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- AlertLog Structure Creation and Interaction Methods + + ------------------------------------------------------------ + procedure SetAlertLogName(Name : string ) ; + procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) ; + impure function FindAlertLogID(Name : string ) return AlertLogIDType ; + impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; + impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType ; + impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; + procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) ; + procedure Deallocate ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- Accessor Methods + ------------------------------------------------------------ + procedure SetGlobalAlertEnable (A : boolean := TRUE) ; + impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string ; + impure function GetGlobalAlertEnable return boolean ; + procedure IncAffirmCount ; + impure function GetAffirmCount return natural ; +--?? procedure IncAffirmPassCount ; +--?? impure function GetAffirmPassCount return natural ; + + procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ; + impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ; + + procedure SetAlertEnable(Level : AlertType ; Enable : boolean) ; + procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; + impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean ; + + procedure SetLogEnable(Level : LogType ; Enable : boolean) ; + procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; + impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean ; + + procedure ReportLogEnables ; + + ------------------------------------------------------------ + -- Reporting Accessor + procedure SetAlertLogOptions ( + FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + procedure ReportAlertLogOptions ; + + impure function GetAlertLogFailOnWarning return AlertLogOptionsType ; + impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType ; + impure function GetAlertLogReportHierarchy return AlertLogOptionsType ; + impure function GetAlertLogFoundReportHier return boolean ; + impure function GetAlertLogFoundAlertHier return boolean ; + impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType ; + impure function GetAlertLogWriteAlertName return AlertLogOptionsType ; + impure function GetAlertLogWriteAlertTime return AlertLogOptionsType ; + impure function GetAlertLogWriteLogLevel return AlertLogOptionsType ; + impure function GetAlertLogWriteLogName return AlertLogOptionsType ; + impure function GetAlertLogWriteLogTime return AlertLogOptionsType ; + + impure function GetAlertLogAlertPrefix return string ; + impure function GetAlertLogLogPrefix return string ; + + impure function GetAlertLogReportPrefix return string ; + impure function GetAlertLogDoneName return string ; + impure function GetAlertLogPassName return string ; + impure function GetAlertLogFailName return string ; + + end protected AlertLogStructPType ; + + --- /////////////////////////////////////////////////////////////////////////// + + type AlertLogStructPType is protected body + + variable GlobalAlertEnabledVar : boolean := TRUE ; -- Allows turn off and on + + variable AffirmCheckCountVar : natural := 0 ; +--?? variable AffirmPassedCountVar : natural := 0 ; + + ------------------------------------------------------------ + type AlertLogRecType is record + ------------------------------------------------------------ + Name : Line ; + ParentID : AlertLogIDType ; + AlertCount : AlertCountType ; + AlertStopCount : AlertCountType ; + AlertEnabled : AlertEnableType ; + LogEnabled : LogEnableType ; + end record AlertLogRecType ; + + ------------------------------------------------------------ + -- Basis for AlertLog Data Structure + variable NumAlertLogIDsVar : AlertLogIDType := 0 ; -- defined by initialize + variable NumAllocatedAlertLogIDsVar : AlertLogIDType := 0 ; +--xx variable NumPredefinedAlIDsVar : AlertLogIDType := 0 ; -- defined by initialize + + type AlertLogRecPtrType is access AlertLogRecType ; + type AlertLogArrayType is array (AlertLogIDType range <>) of AlertLogRecPtrType ; + type AlertLogArrayPtrType is access AlertLogArrayType ; + variable AlertLogPtr : AlertLogArrayPtrType ; + + ------------------------------------------------------------ + -- Report formatting settings, with defaults + variable FailOnWarningVar : boolean := TRUE ; + variable FailOnDisabledErrorsVar : boolean := TRUE ; + variable ReportHierarchyVar : boolean := TRUE ; + variable FoundReportHierVar : boolean := FALSE ; + variable FoundAlertHierVar : boolean := FALSE ; + + variable WriteAlertLevelVar : boolean := TRUE ; + variable WriteAlertNameVar : boolean := TRUE ; + variable WriteAlertTimeVar : boolean := TRUE ; + variable WriteLogLevelVar : boolean := TRUE ; + variable WriteLogNameVar : boolean := TRUE ; + variable WriteLogTimeVar : boolean := TRUE ; + + variable AlertPrefixVar : NamePType ; + variable LogPrefixVar : NamePType ; + variable ReportPrefixVar : NamePType ; + variable DoneNameVar : NamePType ; + variable PassNameVar : NamePType ; + variable FailNameVar : NamePType ; + + variable AlertLogJustifyAmountVar : integer := 0 ; + variable ReportJustifyAmountVar : integer := 0 ; + + ------------------------------------------------------------ + -- PT Local + impure function LeftJustify(A : String; Amount : integer) return string is + ------------------------------------------------------------ + constant Spaces : string(1 to maximum(1, Amount)) := (others => ' ') ; + begin + if A'length >= Amount then + return A ; + else + return A & Spaces(1 to Amount - A'length) ; + end if ; + end function LeftJustify ; + + + ------------------------------------------------------------ + -- PT Local + procedure IncrementAlertCount( + ------------------------------------------------------------ + constant AlertLogID : in AlertLogIDType ; + constant Level : in AlertType ; + variable StopDueToCount : inout boolean + ) is + begin + -- Always Count at this level + AlertLogPtr(AlertLogID).AlertCount(Level) := AlertLogPtr(AlertLogID).AlertCount(Level) + 1 ; + -- Only do remaining actions if enabled + if AlertLogPtr(AlertLogID).AlertEnabled(Level) then + -- Exceeded Stop Count at this level? + if AlertLogPtr(AlertLogID).AlertCount(Level) >= AlertLogPtr(AlertLogID).AlertStopCount(Level) then + StopDueToCount := TRUE ; + end if ; + -- Propagate counts to parent(s) -- Ascend Hierarchy + if AlertLogID /= ALERTLOG_BASE_ID then + IncrementAlertCount(AlertLogPtr(AlertLogID).ParentID, Level, StopDueToCount) ; + end if ; + end if ; + end procedure IncrementAlertCount ; + + ------------------------------------------------------------ + procedure alert ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + message : string ; + level : AlertType := ERROR + ) is + variable buf : Line ; + constant AlertPrefix : string := AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; + variable StopDueToCount : boolean := FALSE ; + begin + if GlobalAlertEnabledVar then + -- Do not write or count when GlobalAlertEnabledVar is disabled + if AlertLogPtr(AlertLogID).AlertEnabled(Level) then + -- do not write when disabled + write(buf, AlertPrefix) ; + if WriteAlertLevelVar then + -- write(buf, " " & to_string(Level) ) ; + write(buf, " " & ALERT_NAME(Level)) ; -- uses constant lookup + end if ; +--xx if (NumAlertLogIDsVar > NumPredefinedAlIDsVar) and WriteAlertNameVar then -- print hierarchy names even when silent + if FoundAlertHierVar and WriteAlertNameVar then +-- write(buf, " in " & justify(AlertLogPtr(AlertLogID).Name.all & ",", LEFT, AlertLogJustifyAmountVar) ) ; + write(buf, " in " & LeftJustify(AlertLogPtr(AlertLogID).Name.all & ",", AlertLogJustifyAmountVar) ) ; + end if ; + write(buf, " " & Message) ; + if WriteAlertTimeVar then + write(buf, " at " & to_string(NOW, 1 ns)) ; + end if ; + writeline(buf) ; + end if ; + -- Always Count + IncrementAlertCount(AlertLogID, Level, StopDueToCount) ; + if StopDueToCount then + write(buf, LF & AlertPrefix & " Stop Count on " & ALERT_NAME(Level) & " reached") ; +--xx if NumAlertLogIDsVar > NumPredefinedAlIDsVar then -- print hierarchy names even when silent + if FoundAlertHierVar then + write(buf, " in " & AlertLogPtr(AlertLogID).Name.all) ; + end if ; + write(buf, " at " & to_string(NOW, 1 ns) & " ") ; + writeline(buf) ; + ReportAlerts(ReportAll => TRUE) ; + std.env.stop(1) ; + end if ; + end if ; + end procedure alert ; + + ------------------------------------------------------------ + procedure IncAlertCount ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + level : AlertType := ERROR + ) is + variable buf : Line ; + constant AlertPrefix : string := AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; + variable StopDueToCount : boolean := FALSE ; + begin + if GlobalAlertEnabledVar then + IncrementAlertCount(AlertLogID, Level, StopDueToCount) ; + if StopDueToCount then + write(buf, LF & AlertPrefix & " Stop Count on " & ALERT_NAME(Level) & " reached") ; +--xx if NumAlertLogIDsVar > NumPredefinedAlIDsVar then -- print hierarchy names even when silent + if FoundAlertHierVar then + write(buf, " in " & AlertLogPtr(AlertLogID).Name.all) ; + end if ; + write(buf, " at " & to_string(NOW, 1 ns) & " ") ; + writeline(buf) ; + ReportAlerts(ReportAll => TRUE) ; + std.env.stop ; + end if ; + end if ; + end procedure IncAlertCount ; + + ------------------------------------------------------------ + -- PT Local + impure function CalcJustify (AlertLogID : AlertLogIDType ; CurrentLength : integer ; IndentAmount : integer) return integer_vector is + ------------------------------------------------------------ + variable ResultValues, LowerLevelValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented + begin + ResultValues(1) := CurrentLength + 1 ; -- AlertLogJustifyAmountVar + ResultValues(2) := CurrentLength + IndentAmount ; -- ReportJustifyAmountVar + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + LowerLevelValues := CalcJustify(i, AlertLogPtr(i).Name'length, IndentAmount + 2) ; + ResultValues(1) := maximum(ResultValues(1), LowerLevelValues(1)) ; + ResultValues(2) := maximum(ResultValues(2), LowerLevelValues(2)) ; + end if ; + end loop ; + return ResultValues ; + end function CalcJustify ; + + ------------------------------------------------------------ + procedure SetJustify is + ------------------------------------------------------------ + variable ResultValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented + begin + ResultValues := CalcJustify(ALERTLOG_BASE_ID, 0, 0) ; + AlertLogJustifyAmountVar := ResultValues(1) ; + ReportJustifyAmountVar := ResultValues(2) ; + end procedure SetJustify ; + + ------------------------------------------------------------ + -- PT Local + impure function GetEnabledAlertCount(AlertCount: AlertCountType; AlertEnabled : AlertEnableType) return AlertCountType is + ------------------------------------------------------------ + variable Count : AlertCountType := (others => 0) ; + begin + if AlertEnabled(FAILURE) then + Count(FAILURE) := AlertCount(FAILURE) ; + end if ; + if AlertEnabled(ERROR) then + Count(ERROR) := AlertCount(ERROR) ; + end if ; + if FailOnWarningVar and AlertEnabled(WARNING) then + Count(WARNING) := AlertCount(WARNING) ; + end if ; + return Count ; + end function GetEnabledAlertCount ; + + ------------------------------------------------------------ + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is + ------------------------------------------------------------ + variable AlertCount : AlertCountType ; + begin + return AlertLogPtr(AlertLogID).AlertCount ; + end function GetAlertCount ; + + ------------------------------------------------------------ + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is + ------------------------------------------------------------ + variable AlertCount : AlertCountType ; + begin + return GetEnabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ; + end function GetEnabledAlertCount ; + + ------------------------------------------------------------ + -- PT Local + impure function GetDisabledAlertCount(AlertCount: AlertCountType; AlertEnabled : AlertEnableType) return AlertCountType is + ------------------------------------------------------------ + variable Count : AlertCountType := (others => 0) ; + begin + if not AlertEnabled(FAILURE) then + Count(FAILURE) := AlertCount(FAILURE) ; + end if ; + if not AlertEnabled(ERROR) then + Count(ERROR) := AlertCount(ERROR) ; + end if ; + if FailOnWarningVar and not AlertEnabled(WARNING) then + Count(WARNING) := AlertCount(WARNING) ; + end if ; + return Count ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount return AlertCountType is + ------------------------------------------------------------ + variable Count : AlertCountType := (others => 0) ; + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + Count := Count + GetDisabledAlertCount(AlertLogPtr(i).AlertCount, AlertLogPtr(i).AlertEnabled) ; + end loop ; + return Count ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is + ------------------------------------------------------------ + variable Count : AlertCountType := (others => 0) ; + begin + Count := GetDisabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ; + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + Count := Count + GetDisabledAlertCount(i) ; + end if ; + end loop ; + return Count ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + -- PT Local + procedure PrintTopAlerts ( + ------------------------------------------------------------ + NumErrors : integer ; + AlertCount : AlertCountType ; + Name : string ; + NumDisabledErrors : integer + ) is + constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt ) ; + constant DoneName : string := ResolveOsvvmDoneName(DoneNameVar.GetOpt ) ; + constant PassName : string := ResolveOsvvmPassName(PassNameVar.GetOpt ) ; + constant FailName : string := ResolveOsvvmFailName(FailNameVar.GetOpt ) ; + variable buf : line ; + begin + if NumErrors = 0 then + if NumDisabledErrors = 0 then + -- Passed + write(buf, ReportPrefix & DoneName & " " & PassName & " " & Name) ; + if AffirmCheckCountVar > 0 then + write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; + end if ; + write(buf, " at " & to_string(NOW, 1 ns)) ; + WriteLine(buf) ; + else + -- Failed Due to Disabled Errors + write(buf, ReportPrefix & DoneName & " " & FailName & " " & Name) ; + write(buf, " Failed Due to Disabled Error(s) = " & to_string(NumDisabledErrors)) ; + if AffirmCheckCountVar > 0 then + write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; + end if ; + write(buf, " at " & to_string(NOW, 1 ns)) ; + WriteLine(buf) ; + end if ; + else + -- Failed + write(buf, ReportPrefix & DoneName & " " & FailName & " "& Name) ; + write(buf, " Total Error(s) = " & to_string(NumErrors) ) ; + write(buf, " Failures: " & to_string(AlertCount(FAILURE)) ) ; + write(buf, " Errors: " & to_string(AlertCount(ERROR) ) ) ; + write(buf, " Warnings: " & to_string(AlertCount(WARNING) ) ) ; + if AffirmCheckCountVar > 0 then +--?? write(buf, " Affirmations Passed: " & to_string(AffirmPassedCountVar)) ; +--?? write(buf, " Checked: " & to_string(AffirmCheckCountVar)) ; + write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; + end if ; + Write(buf, " at " & to_string(NOW, 1 ns)) ; + WriteLine(buf) ; + end if ; + end procedure PrintTopAlerts ; + + ------------------------------------------------------------ + -- PT Local + procedure PrintChild( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Prefix : string ; + IndentAmount : integer ; + ReportAll : boolean + ) is + variable buf : line ; + begin + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + if ReportAll or SumAlertCount(AlertLogPtr(i).AlertCount) > 0 then + Write(buf, Prefix & " " & LeftJustify(AlertLogPtr(i).Name.all, ReportJustifyAmountVar - IndentAmount)) ; + write(buf, " Failures: " & to_string(AlertLogPtr(i).AlertCount(FAILURE) ) ) ; + write(buf, " Errors: " & to_string(AlertLogPtr(i).AlertCount(ERROR) ) ) ; + write(buf, " Warnings: " & to_string(AlertLogPtr(i).AlertCount(WARNING) ) ) ; + WriteLine(buf) ; + end if ; + PrintChild( + AlertLogID => i, + Prefix => Prefix & " ", + IndentAmount => IndentAmount + 2, + ReportAll => ReportAll + ) ; + end if ; + end loop ; + end procedure PrintChild ; + + ------------------------------------------------------------ + procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (0,0,0) ; ReportAll : boolean := TRUE) is + ------------------------------------------------------------ + variable NumErrors : integer ; + variable NumDisabledErrors : integer ; + constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ; + begin + if ReportJustifyAmountVar <= 0 then + SetJustify ; + end if ; + NumErrors := SumAlertCount( ExternalErrors + GetEnabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ) ; + if FailOnDisabledErrorsVar then + NumDisabledErrors := SumAlertCount( GetDisabledAlertCount(AlertLogID) ) ; + else + NumDisabledErrors := 0 ; + end if ; + if IsOsvvmStringSet(Name) then + PrintTopAlerts ( + NumErrors => NumErrors, + AlertCount => AlertLogPtr(AlertLogID).AlertCount + ExternalErrors, + Name => Name, + NumDisabledErrors => NumDisabledErrors + ) ; + else + PrintTopAlerts ( + NumErrors => NumErrors, + AlertCount => AlertLogPtr(AlertLogID).AlertCount + ExternalErrors, + Name => AlertLogPtr(AlertLogID).Name.all, + NumDisabledErrors => NumDisabledErrors + ) ; + end if ; + --Print Hierarchy when enabled and error or disabled error + if (FoundReportHierVar and ReportHierarchyVar) and (NumErrors /= 0 or NumDisabledErrors /=0) then + PrintChild( + AlertLogID => AlertLogID, + Prefix => ReportPrefix & " ", + IndentAmount => 2, + ReportAll => ReportAll + ) ; + end if ; + end procedure ReportAlerts ; + + ------------------------------------------------------------ + procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) is + ------------------------------------------------------------ + begin + PrintTopAlerts ( + NumErrors => SumAlertCount(AlertCount), + AlertCount => AlertCount, + Name => Name, + NumDisabledErrors => 0 + ) ; + end procedure ReportAlerts ; + + ------------------------------------------------------------ + procedure ClearAlerts is + ------------------------------------------------------------ + begin + AffirmCheckCountVar := 0 ; +--?? AffirmPassedCountVar := 0 ; + + AlertLogPtr(ALERTLOG_BASE_ID).AlertCount := (0, 0, 0) ; + AlertLogPtr(ALERTLOG_BASE_ID).AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ; + + for i in ALERTLOG_BASE_ID + 1 to NumAlertLogIDsVar loop + AlertLogPtr(i).AlertCount := (0, 0, 0) ; + AlertLogPtr(i).AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ; + end loop ; + end procedure ClearAlerts ; + + ------------------------------------------------------------ + -- PT Local + procedure LocalLog ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType + ) is + variable buf : line ; + constant LogPrefix : string := LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ; + begin + write(buf, LogPrefix) ; + if WriteLogLevelVar then + write(buf, " " & LOG_NAME(Level) ) ; + end if ; +--xx if (NumAlertLogIDsVar > NumPredefinedAlIDsVar) and WriteLogNameVar then -- print hierarchy names even when silent + if FoundAlertHierVar and WriteLogNameVar then +-- write(buf, " in " & justify(AlertLogPtr(AlertLogID).Name.all & ",", LEFT, AlertLogJustifyAmountVar) ) ; + write(buf, " in " & LeftJustify(AlertLogPtr(AlertLogID).Name.all & ",", AlertLogJustifyAmountVar) ) ; + end if ; + write(buf, " " & Message) ; + if WriteLogTimeVar then + write(buf, " at " & to_string(NOW, 1 ns)) ; + end if ; + writeline(buf) ; + end procedure LocalLog ; + + ------------------------------------------------------------ + procedure log ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType := ALWAYS ; + Enable : boolean := FALSE -- override internal enable + ) is + begin + if Level = ALWAYS or Enable then + LocalLog(AlertLogID, Message, Level) ; + elsif AlertLogPtr(AlertLogID).LogEnabled(Level) then + LocalLog(AlertLogID, Message, Level) ; + end if ; + end procedure log ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- AlertLog Structure Creation and Interaction Methods + + ------------------------------------------------------------ + procedure SetAlertLogName(Name : string ) is + ------------------------------------------------------------ + begin + Deallocate(AlertLogPtr(ALERTLOG_BASE_ID).Name) ; + AlertLogPtr(ALERTLOG_BASE_ID).Name := new string'(Name) ; + end procedure SetAlertLogName ; + + ------------------------------------------------------------ + impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string is + ------------------------------------------------------------ + begin + return AlertLogPtr(AlertLogID).Name.all ; + end function GetAlertLogName ; + + ------------------------------------------------------------ + -- PT Local + procedure NewAlertLogRec(AlertLogID : AlertLogIDType ; Name : string ; ParentID : AlertLogIDType) is + ------------------------------------------------------------ + variable AlertEnabled : AlertEnableType ; + variable AlertStopCount : AlertCountType ; + variable LogEnabled : LogEnableType ; + begin + if AlertLogID = ALERTLOG_BASE_ID then + AlertEnabled := (TRUE, TRUE, TRUE) ; + LogEnabled := (others => FALSE) ; + AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ; + else + if ParentID < ALERTLOG_BASE_ID then + AlertEnabled := AlertLogPtr(ALERTLOG_BASE_ID).AlertEnabled ; + LogEnabled := AlertLogPtr(ALERTLOG_BASE_ID).LogEnabled ; + else + AlertEnabled := AlertLogPtr(ParentID).AlertEnabled ; + LogEnabled := AlertLogPtr(ParentID).LogEnabled ; + end if ; + AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ; + end if ; + AlertLogPtr(AlertLogID) := new AlertLogRecType ; + AlertLogPtr(AlertLogID).Name := new string'(NAME) ; + AlertLogPtr(AlertLogID).ParentID := ParentID ; + AlertLogPtr(AlertLogID).AlertCount := (0, 0, 0) ; + AlertLogPtr(AlertLogID).AlertEnabled := AlertEnabled ; + AlertLogPtr(AlertLogID).AlertStopCount := AlertStopCount ; + AlertLogPtr(AlertLogID).LogEnabled := LogEnabled ; +-- AlertLogPtr(AlertLogID) := new AlertLogRecType'( +-- Name => new string'(NAME), +-- ParentID => ParentID, +-- AlertCount => (0, 0, 0), +-- AlertEnabled => AlertEnabled, +-- AlertStopCount => AlertStopCount, +-- LogEnabled => LogEnabled +-- ) ; + end procedure NewAlertLogRec ; + + ------------------------------------------------------------ + -- PT Local + -- Construct initial data structure + procedure LocalInitialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is + ------------------------------------------------------------ + begin + if NumAllocatedAlertLogIDsVar /= 0 then + Alert(ALERT_DEFAULT_ID, "AlertLogPkg: Initialize, data structure already initialized", FAILURE) ; + return ; + end if ; + -- Initialize Pointer + AlertLogPtr := new AlertLogArrayType(ALERTLOG_BASE_ID to ALERTLOG_BASE_ID + NewNumAlertLogIDs) ; + NumAllocatedAlertLogIDsVar := NewNumAlertLogIDs ; + -- Create BASE AlertLogID (if it differs from DEFAULT + if ALERTLOG_BASE_ID /= ALERT_DEFAULT_ID then + NewAlertLogRec(ALERTLOG_BASE_ID, "AlertLogTop", ALERTLOG_BASE_ID) ; + end if ; + -- Create DEFAULT AlertLogID + NewAlertLogRec(ALERT_DEFAULT_ID, "Default", ALERTLOG_BASE_ID) ; + NumAlertLogIDsVar := ALERT_DEFAULT_ID ; + -- Create OSVVM AlertLogID (if it differs from DEFAULT + if OSVVM_ALERTLOG_ID /= ALERT_DEFAULT_ID then + NewAlertLogRec(OSVVM_ALERTLOG_ID, "OSVVM", ALERTLOG_BASE_ID) ; + NumAlertLogIDsVar := NumAlertLogIDsVar + 1 ; + end if ; + if OSVVM_SCOREBOARD_ALERTLOG_ID /= OSVVM_ALERTLOG_ID then + NewAlertLogRec(OSVVM_SCOREBOARD_ALERTLOG_ID, "OSVVM Scoreboard", ALERTLOG_BASE_ID) ; + NumAlertLogIDsVar := NumAlertLogIDsVar + 1 ; + end if ; + end procedure LocalInitialize ; + + ------------------------------------------------------------ + -- Construct initial data structure + procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is + ------------------------------------------------------------ + begin + LocalInitialize(NewNumAlertLogIDs) ; + end procedure Initialize ; + + ------------------------------------------------------------ + -- PT Local + -- Constructs initial data structure using constant below + impure function LocalInitialize return boolean is + ------------------------------------------------------------ + begin + LocalInitialize(MIN_NUM_AL_IDS) ; + return TRUE ; + end function LocalInitialize ; + + constant CONSTRUCT_ALERT_DATA_STRUCTURE : boolean := LocalInitialize ; + + ------------------------------------------------------------ + procedure Deallocate is + ------------------------------------------------------------ + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + Deallocate(AlertLogPtr(i).Name) ; + Deallocate(AlertLogPtr(i)) ; + end loop ; + deallocate(AlertLogPtr) ; + -- Free up space used by protected types within AlertLogPkg + AlertPrefixVar.Deallocate ; + LogPrefixVar.Deallocate ; + ReportPrefixVar.Deallocate ; + DoneNameVar.Deallocate ; + PassNameVar.Deallocate ; + FailNameVar.Deallocate ; + -- Restore variables to their initial state + NumAlertLogIDsVar := 0 ; + NumAllocatedAlertLogIDsVar := 0 ; + GlobalAlertEnabledVar := TRUE ; -- Allows turn off and on + AffirmCheckCountVar := 0 ; +--?? AffirmPassedCountVar := 0 ; + FailOnWarningVar := TRUE ; + FailOnDisabledErrorsVar := TRUE ; + ReportHierarchyVar := TRUE ; + FoundReportHierVar := FALSE ; + FoundAlertHierVar := FALSE ; + WriteAlertLevelVar := TRUE ; + WriteAlertNameVar := TRUE ; + WriteAlertTimeVar := TRUE ; + WriteLogLevelVar := TRUE ; + WriteLogNameVar := TRUE ; + WriteLogTimeVar := TRUE ; + end procedure Deallocate ; + + ------------------------------------------------------------ + -- PT Local. + procedure GrowAlertStructure (NewNumAlertLogIDs : AlertLogIDType) is + ------------------------------------------------------------ + variable oldAlertLogPtr : AlertLogArrayPtrType ; + begin + if NumAllocatedAlertLogIDsVar = 0 then + Initialize (NewNumAlertLogIDs) ; -- Construct initial structure + else + oldAlertLogPtr := AlertLogPtr ; + AlertLogPtr := new AlertLogArrayType(ALERTLOG_BASE_ID to NewNumAlertLogIDs) ; + AlertLogPtr(ALERTLOG_BASE_ID to NumAlertLogIDsVar) := oldAlertLogPtr(ALERTLOG_BASE_ID to NumAlertLogIDsVar) ; + deallocate(oldAlertLogPtr) ; + end if ; + NumAllocatedAlertLogIDsVar := NewNumAlertLogIDs ; + end procedure GrowAlertStructure ; + + ------------------------------------------------------------ + -- Sets a AlertLogPtr to a particular size + -- Use for small bins to save space or large bins to + -- suppress the resize and copy as a CovBin autosizes. + procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) is + ------------------------------------------------------------ + variable oldAlertLogPtr : AlertLogArrayPtrType ; + begin + if NewNumAlertLogIDs > NumAllocatedAlertLogIDsVar then + GrowAlertStructure(NewNumAlertLogIDs) ; + end if; + end procedure SetNumAlertLogIDs ; + + ------------------------------------------------------------ + -- PT Local + impure function GetNextAlertLogID return AlertLogIDType is + ------------------------------------------------------------ + variable NewNumAlertLogIDs : AlertLogIDType ; + begin + NewNumAlertLogIDs := NumAlertLogIDsVar + 1 ; + if NewNumAlertLogIDs > NumAllocatedAlertLogIDsVar then + GrowAlertStructure(NumAllocatedAlertLogIDsVar + MIN_NUM_AL_IDS) ; + end if ; + NumAlertLogIDsVar := NewNumAlertLogIDs ; + return NumAlertLogIDsVar ; + end function GetNextAlertLogID ; + + ------------------------------------------------------------ + impure function FindAlertLogID(Name : string ) return AlertLogIDType is + ------------------------------------------------------------ + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + if Name = AlertLogPtr(i).Name.all then + return i ; + end if ; + end loop ; + return ALERTLOG_ID_NOT_FOUND ; -- not found + end function FindAlertLogID ; + + ------------------------------------------------------------ + impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is + ------------------------------------------------------------ + variable CurParentID : AlertLogIDType ; + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + CurParentID := AlertLogPtr(i).ParentID ; + if Name = AlertLogPtr(i).Name.all and + (CurParentID = ParentID or CurParentID = ALERTLOG_ID_NOT_ASSIGNED or ParentID = ALERTLOG_ID_NOT_ASSIGNED) + then + return i ; + end if ; + end loop ; + return ALERTLOG_ID_NOT_FOUND ; -- not found + end function FindAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType is + ------------------------------------------------------------ + variable ResultID : AlertLogIDType ; + begin + ResultID := FindAlertLogID(Name, ParentID) ; + if ResultID /= ALERTLOG_ID_NOT_FOUND then + -- found it, set ParentID + if AlertLogPtr(ResultID).ParentID = ALERTLOG_ID_NOT_ASSIGNED then + AlertLogPtr(ResultID).ParentID := ParentID ; + -- else -- do not update as ParentIDs are either same or input ParentID = ALERTLOG_ID_NOT_ASSIGNED + end if ; + else + ResultID := GetNextAlertLogID ; + NewAlertLogRec(ResultID, Name, ParentID) ; + FoundAlertHierVar := TRUE ; + if CreateHierarchy then + FoundReportHierVar := TRUE ; + end if ; + end if ; + return ResultID ; + end function GetAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogPtr(AlertLogID).ParentID ; + end function GetAlertLogParentID ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- Accessor Methods + ------------------------------------------------------------ + + ------------------------------------------------------------ + procedure SetGlobalAlertEnable (A : boolean := TRUE) is + ------------------------------------------------------------ + begin + GlobalAlertEnabledVar := A ; + end procedure SetGlobalAlertEnable ; + + ------------------------------------------------------------ + impure function GetGlobalAlertEnable return boolean is + ------------------------------------------------------------ + begin + return GlobalAlertEnabledVar ; + end function GetGlobalAlertEnable ; + + ------------------------------------------------------------ + procedure IncAffirmCount is + ------------------------------------------------------------ + begin + if GlobalAlertEnabledVar then + AffirmCheckCountVar := AffirmCheckCountVar + 1 ; + end if ; + end procedure IncAffirmCount ; + + ------------------------------------------------------------ + impure function GetAffirmCount return natural is + ------------------------------------------------------------ + begin + return AffirmCheckCountVar ; + end function GetAffirmCount ; + +--?? ------------------------------------------------------------ +--?? procedure IncAffirmPassCount is +--?? ------------------------------------------------------------ +--?? begin +--?? if GlobalAlertEnabledVar then +--?? AffirmCheckCountVar := AffirmCheckCountVar + 1 ; +--?? AffirmPassedCountVar := AffirmPassedCountVar + 1 ; +--?? end if ; +--?? end procedure IncAffirmPassCount ; +--?? +--?? ------------------------------------------------------------ +--?? impure function GetAffirmPassCount return natural is +--?? ------------------------------------------------------------ +--?? begin +--?? return AffirmPassedCountVar ; +--?? end function GetAffirmPassCount ; + + ------------------------------------------------------------ + -- PT LOCAL + procedure SetOneStopCount( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Level : AlertType ; + Count : integer + ) is + begin + if AlertLogPtr(AlertLogID).AlertStopCount(Level) = integer'right then + AlertLogPtr(AlertLogID).AlertStopCount(Level) := Count ; + else + AlertLogPtr(AlertLogID).AlertStopCount(Level) := + AlertLogPtr(AlertLogID).AlertStopCount(Level) + Count ; + end if ; + end procedure SetOneStopCount ; + + ------------------------------------------------------------ + procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is + ------------------------------------------------------------ + begin + SetOneStopCount(AlertLogID, Level, Count) ; + if AlertLogID /= ALERTLOG_BASE_ID then + SetAlertStopCount(AlertLogPtr(AlertLogID).ParentID, Level, Count) ; + end if ; + end procedure SetAlertStopCount ; + + ------------------------------------------------------------ + impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is + ------------------------------------------------------------ + begin + return AlertLogPtr(AlertLogID).AlertStopCount(Level) ; + end function GetAlertStopCount ; + + ------------------------------------------------------------ + procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is + ------------------------------------------------------------ + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + AlertLogPtr(i).AlertEnabled(Level) := Enable ; + end loop ; + end procedure SetAlertEnable ; + + ------------------------------------------------------------ + procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogPtr(AlertLogID).AlertEnabled(Level) := Enable ; + if DescendHierarchy then + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + SetAlertEnable(i, Level, Enable, DescendHierarchy) ; + end if ; + end loop ; + end if ; + end procedure SetAlertEnable ; + + ------------------------------------------------------------ + impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogPtr(AlertLogID).AlertEnabled(Level) ; + end function GetAlertEnable ; + + ------------------------------------------------------------ + procedure SetLogEnable(Level : LogType ; Enable : boolean) is + ------------------------------------------------------------ + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + AlertLogPtr(i).LogEnabled(Level) := Enable ; + end loop ; + end procedure SetLogEnable ; + + ------------------------------------------------------------ + procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogPtr(AlertLogID).LogEnabled(Level) := Enable ; + if DescendHierarchy then + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + SetLogEnable(i, Level, Enable, DescendHierarchy) ; + end if ; + end loop ; + end if ; + end procedure SetLogEnable ; + + ------------------------------------------------------------ + impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is + ------------------------------------------------------------ + begin + if Level = ALWAYS then + return TRUE ; + else + return AlertLogPtr(AlertLogID).LogEnabled(Level) ; + end if ; + end function GetLogEnable ; + + ------------------------------------------------------------ + -- PT Local + procedure PrintLogLevels( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Prefix : string ; + IndentAmount : integer + ) is + variable buf : line ; + begin + write(buf, Prefix & " " & LeftJustify(AlertLogPtr(AlertLogID).Name.all, ReportJustifyAmountVar - IndentAmount)) ; + for i in LogIndexType loop + if AlertLogPtr(AlertLogID).LogEnabled(i) then +-- write(buf, " " & to_string(AlertLogPtr(AlertLogID).LogEnabled(i)) ) ; + write(buf, " " & to_string(i)) ; + end if ; + end loop ; + WriteLine(buf) ; + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + PrintLogLevels( + AlertLogID => i, + Prefix => Prefix & " ", + IndentAmount => IndentAmount + 2 + ) ; + end if ; + end loop ; + end procedure PrintLogLevels ; + + ------------------------------------------------------------ + procedure ReportLogEnables is + ------------------------------------------------------------ + begin + if ReportJustifyAmountVar <= 0 then + SetJustify ; + end if ; + PrintLogLevels(ALERTLOG_BASE_ID, "", 0) ; + end procedure ReportLogEnables ; + + ------------------------------------------------------------ + procedure SetAlertLogOptions ( + ------------------------------------------------------------ + FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + begin + if FailOnWarning /= OPT_INIT_PARM_DETECT then + FailOnWarningVar := IsEnabled(FailOnWarning) ; + end if ; + if FailOnDisabledErrors /= OPT_INIT_PARM_DETECT then + FailOnDisabledErrorsVar := IsEnabled(FailOnDisabledErrors) ; + end if ; + if ReportHierarchy /= OPT_INIT_PARM_DETECT then + ReportHierarchyVar := IsEnabled(ReportHierarchy) ; + end if ; + if WriteAlertLevel /= OPT_INIT_PARM_DETECT then + WriteAlertLevelVar := IsEnabled(WriteAlertLevel) ; + end if ; + if WriteAlertName /= OPT_INIT_PARM_DETECT then + WriteAlertNameVar := IsEnabled(WriteAlertName) ; + end if ; + if WriteAlertTime /= OPT_INIT_PARM_DETECT then + WriteAlertTimeVar := IsEnabled(WriteAlertTime) ; + end if ; + if WriteLogLevel /= OPT_INIT_PARM_DETECT then + WriteLogLevelVar := IsEnabled(WriteLogLevel) ; + end if ; + if WriteLogName /= OPT_INIT_PARM_DETECT then + WriteLogNameVar := IsEnabled(WriteLogName) ; + end if ; + if WriteLogTime /= OPT_INIT_PARM_DETECT then + WriteLogTimeVar := IsEnabled(WriteLogTime) ; + end if ; + if AlertPrefix /= OSVVM_STRING_INIT_PARM_DETECT then + AlertPrefixVar.Set(AlertPrefix) ; + end if ; + if LogPrefix /= OSVVM_STRING_INIT_PARM_DETECT then + LogPrefixVar.Set(LogPrefix) ; + end if ; + if ReportPrefix /= OSVVM_STRING_INIT_PARM_DETECT then + ReportPrefixVar.Set(ReportPrefix) ; + end if ; + if DoneName /= OSVVM_STRING_INIT_PARM_DETECT then + DoneNameVar.Set(DoneName) ; + end if ; + if PassName /= OSVVM_STRING_INIT_PARM_DETECT then + PassNameVar.Set(PassName) ; + end if ; + if FailName /= OSVVM_STRING_INIT_PARM_DETECT then + FailNameVar.Set(FailName) ; + end if ; + end procedure SetAlertLogOptions ; + + ------------------------------------------------------------ + procedure ReportAlertLogOptions is + ------------------------------------------------------------ + variable buf : line ; + begin + -- Boolean Values + swrite(buf, "ReportAlertLogOptions" & LF ) ; + swrite(buf, "---------------------" & LF ) ; + swrite(buf, "FailOnWarningVar: " & to_string(FailOnWarningVar ) & LF ) ; + swrite(buf, "FailOnDisabledErrorsVar: " & to_string(FailOnDisabledErrorsVar ) & LF ) ; + swrite(buf, "ReportHierarchyVar: " & to_string(ReportHierarchyVar ) & LF ) ; + swrite(buf, "FoundReportHierVar: " & to_string(FoundReportHierVar ) & LF ) ; -- Not set by user + swrite(buf, "FoundAlertHierVar: " & to_string(FoundAlertHierVar ) & LF ) ; -- Not set by user + swrite(buf, "WriteAlertLevelVar: " & to_string(WriteAlertLevelVar ) & LF ) ; + swrite(buf, "WriteAlertNameVar: " & to_string(WriteAlertNameVar ) & LF ) ; + swrite(buf, "WriteAlertTimeVar: " & to_string(WriteAlertTimeVar ) & LF ) ; + swrite(buf, "WriteLogLevelVar: " & to_string(WriteLogLevelVar ) & LF ) ; + swrite(buf, "WriteLogNameVar: " & to_string(WriteLogNameVar ) & LF ) ; + swrite(buf, "WriteLogTimeVar: " & to_string(WriteLogTimeVar ) & LF ) ; + + -- String + swrite(buf, "AlertPrefixVar: " & string'(AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX)) & LF ) ; + swrite(buf, "LogPrefixVar: " & string'(LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX)) & LF ) ; + swrite(buf, "ReportPrefixVar: " & ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) & LF ) ; + swrite(buf, "DoneNameVar: " & ResolveOsvvmDoneName(DoneNameVar.GetOpt) & LF ) ; + swrite(buf, "PassNameVar: " & ResolveOsvvmPassName(PassNameVar.GetOpt) & LF ) ; + swrite(buf, "FailNameVar: " & ResolveOsvvmFailName(FailNameVar.GetOpt) & LF ) ; + writeline(buf) ; + end procedure ReportAlertLogOptions ; + + ------------------------------------------------------------ + impure function GetAlertLogFailOnWarning return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(FailOnWarningVar) ; + end function GetAlertLogFailOnWarning ; + + ------------------------------------------------------------ + impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(FailOnDisabledErrorsVar) ; + end function GetAlertLogFailOnDisabledErrors ; + + ------------------------------------------------------------ + impure function GetAlertLogReportHierarchy return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(ReportHierarchyVar) ; + end function GetAlertLogReportHierarchy ; + + ------------------------------------------------------------ + impure function GetAlertLogFoundReportHier return boolean is + ------------------------------------------------------------ + begin + return FoundReportHierVar ; + end function GetAlertLogFoundReportHier ; + + ------------------------------------------------------------ + impure function GetAlertLogFoundAlertHier return boolean is + ------------------------------------------------------------ + begin + return FoundAlertHierVar ; + end function GetAlertLogFoundAlertHier ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteAlertLevelVar) ; + end function GetAlertLogWriteAlertLevel ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertName return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteAlertNameVar) ; + end function GetAlertLogWriteAlertName ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertTime return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteAlertTimeVar) ; + end function GetAlertLogWriteAlertTime ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogLevel return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteLogLevelVar) ; + end function GetAlertLogWriteLogLevel ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogName return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteLogNameVar) ; + end function GetAlertLogWriteLogName ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogTime return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteLogTimeVar) ; + end function GetAlertLogWriteLogTime ; + + ------------------------------------------------------------ + impure function GetAlertLogAlertPrefix return string is + ------------------------------------------------------------ + begin + return AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; + end function GetAlertLogAlertPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogLogPrefix return string is + ------------------------------------------------------------ + begin + return LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ; + end function GetAlertLogLogPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogReportPrefix return string is + ------------------------------------------------------------ + begin + return ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ; + end function GetAlertLogReportPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogDoneName return string is + ------------------------------------------------------------ + begin + return ResolveOsvvmDoneName(DoneNameVar.GetOpt) ; + end function GetAlertLogDoneName ; + + ------------------------------------------------------------ + impure function GetAlertLogPassName return string is + ------------------------------------------------------------ + begin + return ResolveOsvvmPassName(PassNameVar.GetOpt) ; + end function GetAlertLogPassName ; + + ------------------------------------------------------------ + impure function GetAlertLogFailName return string is + ------------------------------------------------------------ + begin + return ResolveOsvvmFailName(FailNameVar.GetOpt) ; + end function GetAlertLogFailName ; + + end protected body AlertLogStructPType ; + + + + shared variable AlertLogStruct : AlertLogStructPType ; + +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// + + ------------------------------------------------------------ + procedure Alert( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Message : string ; + Level : AlertType := ERROR + ) is + begin + AlertLogStruct.Alert(AlertLogID, Message, Level) ; + end procedure alert ; + + ------------------------------------------------------------ + procedure Alert( Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; + end procedure alert ; + + ------------------------------------------------------------ + procedure IncAlertCount( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Level : AlertType := ERROR + ) is + begin + AlertLogStruct.IncAlertCount(AlertLogID, Level) ; + end procedure IncAlertCount ; + + ------------------------------------------------------------ + procedure IncAlertCount( Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + AlertLogStruct.IncAlertCount(ALERT_DEFAULT_ID, Level) ; + end procedure IncAlertCount ; + + + ------------------------------------------------------------ + procedure AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if condition then + AlertLogStruct.Alert(AlertLogID , Message, Level) ; + end if ; + end procedure AlertIf ; + + ------------------------------------------------------------ + procedure AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if condition then + AlertLogStruct.Alert(ALERT_DEFAULT_ID , Message, Level) ; + end if ; + end procedure AlertIf ; + + ------------------------------------------------------------ + -- useful in a loop: exit when AlertIf( not ReadValid, failure, "Read Failed") ; + impure function AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is + ------------------------------------------------------------ + begin + if condition then + AlertLogStruct.Alert(AlertLogID , Message, Level) ; + end if ; + return condition ; + end function AlertIf ; + + ------------------------------------------------------------ + impure function AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is + ------------------------------------------------------------ + begin + if condition then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; + end if ; + return condition ; + end function AlertIf ; + + ------------------------------------------------------------ + procedure AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if not condition then + AlertLogStruct.Alert(AlertLogID, Message, Level) ; + end if ; + end procedure AlertIfNot ; + + ------------------------------------------------------------ + procedure AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if not condition then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; + end if ; + end procedure AlertIfNot ; + + ------------------------------------------------------------ + -- useful in a loop: exit when AlertIfNot( not ReadValid, failure, "Read Failed") ; + impure function AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is + ------------------------------------------------------------ + begin + if not condition then + AlertLogStruct.Alert(AlertLogID, Message, Level) ; + end if ; + return not condition ; + end function AlertIfNot ; + + ------------------------------------------------------------ + impure function AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is + ------------------------------------------------------------ + begin + if not condition then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; + end if ; + return not condition ; + end function AlertIfNot ; + + + ------------------------------------------------------------ + -- AlertIfEqual with AlertLogID + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + + ------------------------------------------------------------ + -- AlertIfEqual without AlertLogID + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + + ------------------------------------------------------------ + -- AlertIfNotEqual with AlertLogID + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + + ------------------------------------------------------------ + -- AlertIfNotEqual without AlertLogID + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + + ------------------------------------------------------------ + -- Local + procedure LocalAlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string ; Level : AlertType ; Valid : out boolean ) is + -- Simple diff. + ------------------------------------------------------------ + variable Buf1, Buf2 : line ; + variable File1Done, File2Done : boolean ; + variable LineCount : integer := 0 ; + begin + ReadLoop : loop + File1Done := EndFile(File1) ; + File2Done := EndFile(File2) ; + exit ReadLoop when File1Done or File2Done ; + + ReadLine(File1, Buf1) ; + ReadLine(File2, Buf2) ; + LineCount := LineCount + 1 ; + + if Buf1.all /= Buf2.all then + AlertLogStruct.Alert(AlertLogID , Message & " File miscompare on line " & to_string(LineCount), Level) ; + exit ReadLoop ; + end if ; + end loop ReadLoop ; + if File1Done /= File2Done then + if not File1Done then + AlertLogStruct.Alert(AlertLogID , Message & " File1 longer than File2 " & to_string(LineCount), Level) ; + end if ; + if not File2Done then + AlertLogStruct.Alert(AlertLogID , Message & " File2 longer than File1 " & to_string(LineCount), Level) ; + end if ; + end if; + if File1Done and File2Done then + Valid := TRUE ; + else + Valid := FALSE ; + end if ; + end procedure LocalAlertIfDiff ; + + ------------------------------------------------------------ + -- Local + procedure LocalAlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string ; Level : AlertType ; Valid : out boolean ) is + -- Open files and call AlertIfDiff[text, ...] + ------------------------------------------------------------ + file FileID1, FileID2 : text ; + variable status1, status2 : file_open_status ; + begin + Valid := FALSE ; + file_open(status1, FileID1, Name1, READ_MODE) ; + file_open(status2, FileID2, Name2, READ_MODE) ; + if status1 = OPEN_OK and status2 = OPEN_OK then + LocalAlertIfDiff (AlertLogID, FileID1, FileID2, Message & " " & Name1 & " /= " & Name2 & ", ", Level, Valid) ; + else + if status1 /= OPEN_OK then + AlertLogStruct.Alert(AlertLogID , Message & " File, " & Name1 & ", did not open", Level) ; + end if ; + if status2 /= OPEN_OK then + AlertLogStruct.Alert(AlertLogID , Message & " File, " & Name2 & ", did not open", Level) ; + end if ; + end if; + end procedure LocalAlertIfDiff ; + + ------------------------------------------------------------ + procedure AlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) is + -- Open files and call AlertIfDiff[text, ...] + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (AlertLogID, Name1, Name2, Message, Level, Valid) ; + end procedure AlertIfDiff ; + + ------------------------------------------------------------ + procedure AlertIfDiff (Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (ALERT_DEFAULT_ID, Name1, Name2, Message, Level, Valid) ; + end procedure AlertIfDiff ; + + ------------------------------------------------------------ + procedure AlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) is + -- Simple diff. + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (AlertLogID, File1, File2, Message, Level, Valid ) ; + end procedure AlertIfDiff ; + + ------------------------------------------------------------ + procedure AlertIfDiff (file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (ALERT_DEFAULT_ID, File1, File2, Message, Level, Valid ) ; + end procedure AlertIfDiff ; + + ------------------------------------------------------------ + procedure AffirmIf( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + condition : boolean ; + ReceivedMessage : string ; + ExpectedMessage : string ; + Enable : boolean := FALSE -- override internal enable + ) is + begin + AlertLogStruct.IncAffirmCount ; -- increment check count + if condition then + -- passed + AlertLogStruct.Log(AlertLogID, ReceivedMessage, PASSED, Enable) ; +-- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count + else + AlertLogStruct.Alert(AlertLogID, ReceivedMessage & ExpectedMessage, ERROR) ; + end if ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + procedure AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, condition, ReceivedMessage, ExpectedMessage, Enable) ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, condition, ReceivedMessage, ExpectedMessage, Enable) ; + return condition ; + end function AffirmIf ; + + ------------------------------------------------------------ + impure function AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, condition, ReceivedMessage, ExpectedMessage, Enable) ; + return condition ; + end function AffirmIf ; + + + ------------------------------------------------------------ + procedure AffirmIf( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + condition : boolean ; + Message : string ; + Enable : boolean := FALSE -- override internal enable + ) is + begin + AlertLogStruct.IncAffirmCount ; -- increment check count + if condition then + -- passed + AlertLogStruct.Log(AlertLogID, Message, PASSED, Enable) ; +-- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count + else + AlertLogStruct.Alert(AlertLogID, Message, ERROR) ; + end if ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + procedure AffirmIf(condition : boolean ; Message : string ; Enable : boolean := FALSE) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, condition, Message, Enable) ; + end procedure AffirmIf; + + ------------------------------------------------------------ + -- useful in a loop: exit when AffirmIf( ID, not ReadValid, "Read Failed") ; + impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, condition, Message, Enable) ; + return condition ; + end function AffirmIf ; + + ------------------------------------------------------------ + impure function AffirmIf( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, condition, Message, Enable) ; + return condition ; + end function AffirmIf ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; + end procedure AffirmIfNot ; + + ------------------------------------------------------------ + procedure AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; + end procedure AffirmIfNot ; + + ------------------------------------------------------------ + -- useful in a loop: exit when AffirmIfNot( not ReadValid, failure, "Read Failed") ; + impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; + return not condition ; + end function AffirmIfNot ; + + ------------------------------------------------------------ + impure function AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; + return not condition ; + end function AffirmIfNot ; + + ------------------------------------------------------------ + procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, not condition, Message, Enable) ; + end procedure AffirmIfNot ; + + ------------------------------------------------------------ + procedure AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, not condition, Message, Enable) ; + end procedure AffirmIfNot ; + + ------------------------------------------------------------ + -- useful in a loop: exit when AffirmIfNot( not ReadValid, failure, "Read Failed") ; + impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, not condition, Message, Enable) ; + return not condition ; + end function AffirmIfNot ; + + ------------------------------------------------------------ + impure function AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, not condition, Message, Enable) ; + return not condition ; + end function AffirmIfNot ; + + + ------------------------------------------------------------ + ------------------------------------------------------------ + procedure AffirmPassed( AlertLogID : AlertLogIDType ; Message : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, TRUE, Message, Enable) ; + end procedure AffirmPassed ; + + ------------------------------------------------------------ + procedure AffirmPassed( Message : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, TRUE, Message, Enable) ; + end procedure AffirmPassed ; + + ------------------------------------------------------------ + procedure AffirmError( AlertLogID : AlertLogIDType ; Message : string ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, FALSE, Message, FALSE) ; + end procedure AffirmError ; + + ------------------------------------------------------------ + procedure AffirmError( Message : string ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, FALSE, Message, FALSE) ; + end procedure AffirmError ; + + -- With AlertLogID + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, ??(Received ?= Expected), + Message & " Received : " & to_hstring(Received), + " ?= Expected : " & to_hstring(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, ??(Received ?= Expected), + Message & " Received : " & to_hstring(Received), + " ?= Expected : " & to_hstring(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, ??(Received ?= Expected), + Message & " Received : " & to_hstring(Received), + " ?= Expected : " & to_hstring(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & to_string(Received, 4), + " = Expected : " & to_string(Expected, 4), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & Received, + " = Expected : " & Expected, + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + -- Without AlertLogID + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & to_string(Received, 4), + " = Expected : " & to_string(Expected, 4), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & Received, + " = Expected : " & Expected, + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) is + -- Open files and call AffirmIfDiff[text, ...] + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (AlertLogID, Name1, Name2, Message, ERROR, Valid) ; + if Valid then + AlertLogStruct.Log(AlertLogID, Message & " " & Name1 & " = " & Name2, PASSED, Enable) ; + end if ; + end procedure AffirmIfDiff ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (ALERT_DEFAULT_ID, Name1, Name2, Message, ERROR, Valid) ; + if Valid then + AlertLogStruct.Log(ALERT_DEFAULT_ID, Message & " " & Name1 & " = " & Name2, PASSED, Enable) ; + end if ; + end procedure AffirmIfDiff ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) is + -- Simple diff. + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (AlertLogID, File1, File2, Message, ERROR, Valid ) ; + if Valid then + AlertLogStruct.Log(AlertLogID, Message, PASSED, Enable) ; + end if ; + end procedure AffirmIfDiff ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (ALERT_DEFAULT_ID, File1, File2, Message, ERROR, Valid ) ; + if Valid then + AlertLogStruct.Log(ALERT_DEFAULT_ID, Message, PASSED, Enable) ; + end if ; + end procedure AffirmIfDiff ; + + ------------------------------------------------------------ + procedure SetAlertLogJustify is + ------------------------------------------------------------ + begin + AlertLogStruct.SetJustify ; + end procedure SetAlertLogJustify ; + + ------------------------------------------------------------ + procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportAlerts(Name, AlertCount) ; + end procedure ReportAlerts ; + + ------------------------------------------------------------ + procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, TRUE) ; + end procedure ReportAlerts ; + + ------------------------------------------------------------ + procedure ReportNonZeroAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, FALSE) ; + end procedure ReportNonZeroAlerts ; + + ------------------------------------------------------------ + procedure ClearAlerts is + ------------------------------------------------------------ + begin + AlertLogStruct.ClearAlerts ; + end procedure ClearAlerts ; + + ------------------------------------------------------------ + function "ABS" (L : AlertCountType) return AlertCountType is + ------------------------------------------------------------ + variable Result : AlertCountType ; + begin + Result(FAILURE) := ABS( L(FAILURE) ) ; + Result(ERROR) := ABS( L(ERROR) ) ; + Result(WARNING) := ABS( L(WARNING) ); + return Result ; + end function "ABS" ; + + ------------------------------------------------------------ + function "+" (L, R : AlertCountType) return AlertCountType is + ------------------------------------------------------------ + variable Result : AlertCountType ; + begin + Result(FAILURE) := L(FAILURE) + R(FAILURE) ; + Result(ERROR) := L(ERROR) + R(ERROR) ; + Result(WARNING) := L(WARNING) + R(WARNING) ; + return Result ; + end function "+" ; + + ------------------------------------------------------------ + function "-" (L, R : AlertCountType) return AlertCountType is + ------------------------------------------------------------ + variable Result : AlertCountType ; + begin + Result(FAILURE) := L(FAILURE) - R(FAILURE) ; + Result(ERROR) := L(ERROR) - R(ERROR) ; + Result(WARNING) := L(WARNING) - R(WARNING) ; + return Result ; + end function "-" ; + + ------------------------------------------------------------ + function "-" (R : AlertCountType) return AlertCountType is + ------------------------------------------------------------ + variable Result : AlertCountType ; + begin + Result(FAILURE) := - R(FAILURE) ; + Result(ERROR) := - R(ERROR) ; + Result(WARNING) := - R(WARNING) ; + return Result ; + end function "-" ; + + ------------------------------------------------------------ + impure function SumAlertCount(AlertCount: AlertCountType) return integer is + ------------------------------------------------------------ + begin + -- Using ABS ensures correct expected error handling. + return abs(AlertCount(FAILURE)) + abs(AlertCount(ERROR)) + abs(AlertCount(WARNING)) ; + end function SumAlertCount ; + + ------------------------------------------------------------ + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertCount(AlertLogID) ; + end function GetAlertCount ; + + ------------------------------------------------------------ + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is + ------------------------------------------------------------ + begin + return SumAlertCount(AlertLogStruct.GetAlertCount(AlertLogID)) ; + end function GetAlertCount ; + + ------------------------------------------------------------ + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetEnabledAlertCount(AlertLogID) ; + end function GetEnabledAlertCount ; + + ------------------------------------------------------------ + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is + ------------------------------------------------------------ + begin + return SumAlertCount(AlertLogStruct.GetEnabledAlertCount(AlertLogID)) ; + end function GetEnabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount return AlertCountType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetDisabledAlertCount ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount return integer is + ------------------------------------------------------------ + begin + return SumAlertCount(AlertLogStruct.GetDisabledAlertCount) ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetDisabledAlertCount(AlertLogID) ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer is + ------------------------------------------------------------ + begin + return SumAlertCount(AlertLogStruct.GetDisabledAlertCount(AlertLogID)) ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + procedure Log( + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType := ALWAYS ; + Enable : boolean := FALSE -- override internal enable + ) is + begin + AlertLogStruct.Log(AlertLogID, Message, Level, Enable) ; + end procedure log ; + + ------------------------------------------------------------ + procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) is + ------------------------------------------------------------ + begin + AlertLogStruct.Log(LOG_DEFAULT_ID, Message, Level, Enable) ; + end procedure log ; + + ------------------------------------------------------------ + procedure SetAlertLogName(Name : string ) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertLogName(Name) ; + end procedure SetAlertLogName ; + + ------------------------------------------------------------ + impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogName(AlertLogID) ; + end GetAlertLogName ; + + ------------------------------------------------------------ + procedure DeallocateAlertLogStruct is + ------------------------------------------------------------ + begin + AlertLogStruct.Deallocate ; + end procedure DeallocateAlertLogStruct ; + + ------------------------------------------------------------ + procedure InitializeAlertLogStruct is + ------------------------------------------------------------ + begin + AlertLogStruct.Initialize ; + end procedure InitializeAlertLogStruct ; + + ------------------------------------------------------------ + impure function FindAlertLogID(Name : string ) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogStruct.FindAlertLogID(Name) ; + end function FindAlertLogID ; + + ------------------------------------------------------------ + impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogStruct.FindAlertLogID(Name, ParentID) ; + end function FindAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogID(Name, ParentID, CreateHierarchy ) ; + end function GetAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogParentID(AlertLogID) ; + end function GetAlertLogParentID ; + + ------------------------------------------------------------ + procedure SetGlobalAlertEnable (A : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetGlobalAlertEnable(A) ; + end procedure SetGlobalAlertEnable ; + + ------------------------------------------------------------ + -- Set using constant. Set before code runs. + impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean is + ------------------------------------------------------------ + begin + AlertLogStruct.SetGlobalAlertEnable(A) ; + return A ; + end function SetGlobalAlertEnable ; + + ------------------------------------------------------------ + impure function GetGlobalAlertEnable return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetGlobalAlertEnable ; + end function GetGlobalAlertEnable ; + + ------------------------------------------------------------ + procedure IncAffirmCount is + ------------------------------------------------------------ + begin + AlertLogStruct.IncAffirmCount ; + end procedure IncAffirmCount ; + + ------------------------------------------------------------ + impure function GetAffirmCount return natural is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAffirmCount ; + end function GetAffirmCount ; + +--?? ------------------------------------------------------------ +--?? procedure IncAffirmPassCount is +--?? ------------------------------------------------------------ +--?? begin +--?? AlertLogStruct.IncAffirmPassCount ; +--?? end procedure IncAffirmPassCount ; +--?? +--?? ------------------------------------------------------------ +--?? impure function GetAffirmPassCount return natural is +--?? ------------------------------------------------------------ +--?? begin +--?? return AlertLogStruct.GetAffirmPassCount ; +--?? end function GetAffirmPassCount ; + + ------------------------------------------------------------ + procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertStopCount(AlertLogID, Level, Count) ; + end procedure SetAlertStopCount ; + + ------------------------------------------------------------ + procedure SetAlertStopCount(Level : AlertType ; Count : integer) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertStopCount(ALERTLOG_BASE_ID, Level, Count) ; + end procedure SetAlertStopCount ; + + ------------------------------------------------------------ + impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertStopCount(AlertLogID, Level) ; + end function GetAlertStopCount ; + + ------------------------------------------------------------ + impure function GetAlertStopCount(Level : AlertType) return integer is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertStopCount(ALERTLOG_BASE_ID, Level) ; + end function GetAlertStopCount ; + + ------------------------------------------------------------ + procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertEnable(Level, Enable) ; + end procedure SetAlertEnable ; + + ------------------------------------------------------------ + procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertEnable(AlertLogID, Level, Enable, DescendHierarchy) ; + end procedure SetAlertEnable ; + + ------------------------------------------------------------ + impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertEnable(AlertLogID, Level) ; + end function GetAlertEnable ; + + ------------------------------------------------------------ + impure function GetAlertEnable(Level : AlertType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertEnable(ALERT_DEFAULT_ID, Level) ; + end function GetAlertEnable ; + + ------------------------------------------------------------ + procedure SetLogEnable(Level : LogType ; Enable : boolean) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetLogEnable(Level, Enable) ; + end procedure SetLogEnable ; + + ------------------------------------------------------------ + procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetLogEnable(AlertLogID, Level, Enable, DescendHierarchy) ; + end procedure SetLogEnable ; + + ------------------------------------------------------------ + impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetLogEnable(AlertLogID, Level) ; + end function GetLogEnable ; + + ------------------------------------------------------------ + impure function GetLogEnable(Level : LogType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetLogEnable(LOG_DEFAULT_ID, Level) ; + end function GetLogEnable ; + + ------------------------------------------------------------ + procedure ReportLogEnables is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportLogEnables ; + end ReportLogEnables ; + + ------------------------------------------------------------ + procedure SetAlertLogOptions ( + ------------------------------------------------------------ + FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + begin + AlertLogStruct.SetAlertLogOptions ( + FailOnWarning => FailOnWarning , + FailOnDisabledErrors => FailOnDisabledErrors, + ReportHierarchy => ReportHierarchy , + WriteAlertLevel => WriteAlertLevel , + WriteAlertName => WriteAlertName , + WriteAlertTime => WriteAlertTime , + WriteLogLevel => WriteLogLevel , + WriteLogName => WriteLogName , + WriteLogTime => WriteLogTime , + AlertPrefix => AlertPrefix , + LogPrefix => LogPrefix , + ReportPrefix => ReportPrefix , + DoneName => DoneName , + PassName => PassName , + FailName => FailName + ); + end procedure SetAlertLogOptions ; + + ------------------------------------------------------------ + procedure ReportAlertLogOptions is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportAlertLogOptions ; + end procedure ReportAlertLogOptions ; + + ------------------------------------------------------------ + impure function GetAlertLogFailOnWarning return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFailOnWarning ; + end function GetAlertLogFailOnWarning ; + + ------------------------------------------------------------ + impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFailOnDisabledErrors ; + end function GetAlertLogFailOnDisabledErrors ; + + ------------------------------------------------------------ + impure function GetAlertLogReportHierarchy return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogReportHierarchy ; + end function GetAlertLogReportHierarchy ; + + ------------------------------------------------------------ + impure function GetAlertLogFoundReportHier return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFoundReportHier ; + end function GetAlertLogFoundReportHier ; + + ------------------------------------------------------------ + impure function GetAlertLogFoundAlertHier return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFoundAlertHier ; + end function GetAlertLogFoundAlertHier ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteAlertLevel ; + end function GetAlertLogWriteAlertLevel ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertName return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteAlertName ; + end function GetAlertLogWriteAlertName ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertTime return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteAlertTime ; + end function GetAlertLogWriteAlertTime ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogLevel return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteLogLevel ; + end function GetAlertLogWriteLogLevel ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogName return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteLogName ; + end function GetAlertLogWriteLogName ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogTime return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteLogTime ; + end function GetAlertLogWriteLogTime ; + + ------------------------------------------------------------ + impure function GetAlertLogAlertPrefix return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogAlertPrefix ; + end function GetAlertLogAlertPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogLogPrefix return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogLogPrefix ; + end function GetAlertLogLogPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogReportPrefix return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogReportPrefix ; + end function GetAlertLogReportPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogDoneName return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogDoneName ; + end function GetAlertLogDoneName ; + + ------------------------------------------------------------ + impure function GetAlertLogPassName return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogPassName ; + end function GetAlertLogPassName ; + + ------------------------------------------------------------ + impure function GetAlertLogFailName return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFailName ; + end function GetAlertLogFailName ; + + ------------------------------------------------------------ + function IsLogEnableType (Name : String) return boolean is + ------------------------------------------------------------ + -- type LogType is (ALWAYS, DEBUG, FINAL, INFO, PASSED) ; -- NEVER + begin + if Name = "PASSED" then return TRUE ; + elsif Name = "DEBUG" then return TRUE ; + elsif Name = "FINAL" then return TRUE ; + elsif Name = "INFO" then return TRUE ; + end if ; + return FALSE ; + end function IsLogEnableType ; + + ------------------------------------------------------------ + procedure ReadLogEnables (file AlertLogInitFile : text) is + -- Preferred Read format + -- Line 1: instance1_name log_enable log_enable log_enable + -- Line 2: instance2_name log_enable log_enable log_enable + -- when reading multiple log_enables on a line, they must be separated by a space + -- + --- Also supports alternate format from Lyle/.... + -- Line 1: instance1_name + -- Line 2: log enable + -- Line 3: instance2_name + -- Line 4: log enable + -- + ------------------------------------------------------------ + type ReadStateType is (GET_ID, GET_ENABLE) ; + variable ReadState : ReadStateType := GET_ID ; + variable buf : line ; + variable Empty : boolean ; + variable MultiLineComment : boolean := FALSE ; + variable Name : string(1 to 80) ; + variable NameLen : integer ; + variable AlertLogID : AlertLogIDType ; + variable ReadAnEnable : boolean ; + variable LogLevel : LogType ; + begin + ReadState := GET_ID ; + ReadLineLoop : while not EndFile(AlertLogInitFile) loop + ReadLine(AlertLogInitFile, buf) ; + if ReadAnEnable then + -- Read one or more enable values, next line read AlertLog name + -- Note that any newline with ReadAnEnable TRUE will result in + -- searching for another AlertLogID name - this includes multi-line comments. + ReadState := GET_ID ; + end if ; + + ReadNameLoop : loop + EmptyOrCommentLine(buf, Empty, MultiLineComment) ; + next ReadLineLoop when Empty ; + + case ReadState is + when GET_ID => + sread(buf, Name, NameLen) ; + exit ReadNameLoop when NameLen = 0 ; + AlertLogID := GetAlertLogID(Name(1 to NameLen), ALERTLOG_ID_NOT_ASSIGNED) ; + ReadState := GET_ENABLE ; + ReadAnEnable := FALSE ; + + when GET_ENABLE => + sread(buf, Name, NameLen) ; + exit ReadNameLoop when NameLen = 0 ; + ReadAnEnable := TRUE ; + if not IsLogEnableType(Name(1 to NameLen)) then + Alert(OSVVM_ALERTLOG_ID, "AlertLogPkg.ReadLogEnables: Found Invalid LogEnable: " & Name(1 to NameLen)) ; + exit ReadNameLoop ; + end if ; + LogLevel := LogType'value(Name(1 to NameLen)) ; + SetLogEnable(AlertLogID, LogLevel, TRUE) ; + end case ; + end loop ReadNameLoop ; + end loop ReadLineLoop ; + end procedure ReadLogEnables ; + + ------------------------------------------------------------ + procedure ReadLogEnables (FileName : string) is + ------------------------------------------------------------ + file AlertLogInitFile : text open READ_MODE is FileName ; + begin + ReadLogEnables(AlertLogInitFile) ; + end procedure ReadLogEnables ; + + ------------------------------------------------------------ + function PathTail (A : string) return string is + ------------------------------------------------------------ + alias aA : string(1 to A'length) is A ; + variable LenA : integer := A'length ; + begin + if aA(LenA) = ':' then + LenA := LenA - 1 ; + end if ; + for i in LenA downto 1 loop + if aA(i) = ':' then + return aA(i+1 to LenA) ; + end if ; + end loop ; + return aA(1 to LenA) ; + end function PathTail ; + + -- ------------------------------------------------------------ + -- Deprecated + -- + + ------------------------------------------------------------ + -- deprecated + procedure AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) is + begin + AlertIf( AlertLogID, condition, Message, Level) ; + end procedure AlertIf ; + + ------------------------------------------------------------ + -- deprecated + impure function AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean is + begin + return AlertIf( AlertLogID, condition, Message, Level) ; + end function AlertIf ; + + ------------------------------------------------------------ + -- deprecated + procedure AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) is + begin + AlertIfNot( AlertLogID, condition, Message, Level) ; + end procedure AlertIfNot ; + + ------------------------------------------------------------ + -- deprecated + impure function AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean is + begin + return AlertIfNot( AlertLogID, condition, Message, Level) ; + end function AlertIfNot ; + + ------------------------------------------------------------ + -- deprecated + procedure AffirmIf( + AlertLogID : AlertLogIDType ; + condition : boolean ; + Message : string ; + LogLevel : LogType ; -- := PASSED + AlertLevel : AlertType := ERROR + ) is + begin + AlertLogStruct.IncAffirmCount ; -- increment check count + if condition then + -- passed + AlertLogStruct.Log(AlertLogID, Message, LogLevel) ; -- call log +-- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count + else + AlertLogStruct.Alert(AlertLogID, Message, AlertLevel) ; -- signal failure + end if ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + -- deprecated + procedure AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; AlertLevel : AlertType ) is + begin + AffirmIf(AlertLogID, condition, Message, PASSED, AlertLevel) ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + -- deprecated + procedure AffirmIf(condition : boolean ; Message : string ; LogLevel : LogType ; AlertLevel : AlertType := ERROR) is + begin + AffirmIf(ALERT_DEFAULT_ID, condition, Message, LogLevel, AlertLevel) ; + end procedure AffirmIf; + + ------------------------------------------------------------ + -- deprecated + procedure AffirmIf(condition : boolean ; Message : string ; AlertLevel : AlertType ) is + begin + AffirmIf(ALERT_DEFAULT_ID, condition, Message, PASSED, AlertLevel) ; + end procedure AffirmIf; + end package body AlertLogPkg ; \ No newline at end of file From 92b931e28a469679cfa783f412774c8ba9d9c9c3 Mon Sep 17 00:00:00 2001 From: JimLewis Date: Thu, 1 Mar 2018 22:42:10 -0800 Subject: [PATCH 3/8] Updated how PercentCov is calcuated to support a coverage goal (AtLeast parameter) of 0. --- CoveragePkg.vhd | 10112 +++++++++++++++++++++++----------------------- 1 file changed, 5069 insertions(+), 5043 deletions(-) diff --git a/CoveragePkg.vhd b/CoveragePkg.vhd index c7e814e..f029ba0 100644 --- a/CoveragePkg.vhd +++ b/CoveragePkg.vhd @@ -1,5044 +1,5070 @@ --- --- File Name: CoveragePkg.vhd --- Design Unit Name: CoveragePkg --- Revision: STANDARD VERSION --- --- Maintainer: Jim Lewis email: jim@synthworks.com --- Contributor(s): --- Jim Lewis SynthWorks --- Matthias Alles Creonic. Inspired GetMinBinVal, GetMinPoint, GetCov --- Jerry Kaczynski Aldec. Inspired GetBin function --- Sebastian Dunst Inspired GetBinName function --- ... Aldec Worked on VendorCov functional coverage interface --- --- Package Defines --- Functional coverage modeling utilities and data structure --- --- Developed by/for: --- SynthWorks Design Inc. --- VHDL Training Classes --- 11898 SW 128th Ave. Tigard, Or 97223 --- http://www.SynthWorks.com --- --- Latest standard version available at: --- http://www.SynthWorks.com/downloads --- --- Revision History: For more details, see CoveragePkg_release_notes.pdf --- Date Version Description --- 06/2010: 0.1 Initial revision --- 09/2010 Release in SynthWorks' VHDL Testbenches and Verification classes --- 02/2011: 1.0 Changed CoverBinType to facilitage long term support of cross coverage --- 02/2011: 1.1 Added GetMinCov, GetMaxCov, CountCovHoles, GetCovHole --- 04/2011: 2.0 Added protected type based data structure: CovPType --- 06/2011: 2.1 Removed signal based coverage modeling --- 07/2011: 2.2 Added randomization with coverage goals (AtLeast), weight, and percentage thresholds --- 11/2011: 2.2a Changed constants ALL_RANGE, ZERO_BIN, and ONE_BIN to have a 1 index --- 12/2011: 2.2b Fixed minor inconsistencies on interface declarations. --- 01/2012: 2.3 Added Function GetBin from Jerry K. Made write for RangeArrayType visible --- 01/2012: 2.4 Added Merging of bins --- 04/2013: 2013.04 Thresholding, CovTarget, Merging off by default, --- 5/2013 2013.05 Release with updated RandomPkg. Minimal changes. --- 1/2014 2014.01 Merging of Cov Models, LastIndex --- 7/2014 2014.07 Bin Naming (for requirements tracking), WriteBin with Pass/Fail, GenBin[integer_vector] --- 12/2014 2014.07a Fix memory leak in deallocate. Removed initialied pointers which can lead to leaks. --- 01/2015 2015.01 Use AlertLogPkg to count assertions and filter log messages --- 06/2015 2015.06 AddCross[CovMatrix?Type], Mirroring for WriteBin --- 01/2016 2016.01 Fixes for pure functions. Added bounds checking on ICover --- 03/2016 2016.03 Added GetBinName(Index) to retrieve a bin's name --- 11/2016 2016.11 Added VendorCovApiPkg and calls to bind it in. --- 05/2017 2017.05 Updated WriteBin name printing --- ClearCov (deprecates SetCovZero) --- --- --- Development Notes: --- The coverage procedures are named ICover to avoid conflicts with --- future language changes which may add cover as a keyword --- Procedure WriteBin writes each CovBin on a separate line, as such --- it was inappropriate to overload either textio write or to_string --- In the notes VHDL-2008 notes refers to --- composites with unconstrained elements --- --- --- Copyright (c) 2010 - 2017 by SynthWorks Design Inc. All rights reserved. --- --- Verbatim copies of this source file may be used and --- distributed without restriction. --- --- This source file is free software; you can redistribute it --- and/or modify it under the terms of the ARTISTIC License --- as published by The Perl Foundation; either version 2.0 of --- the License, or (at your option) any later version. --- --- This source is distributed in the hope that it will be --- useful, but WITHOUT ANY WARRANTY; without even the implied --- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --- PURPOSE. See the Artistic License for details. --- --- You should have received a copy of the license with this source. --- If not download it from, --- http://www.perlfoundation.org/artistic_license_2_0 --- --- Credits: --- CovBinBaseType is inspired by a structure proposed in the --- paper "Functional Coverage - without SystemVerilog!" --- by Alan Fitch and Doug Smith. Presented at DVCon 2010 --- However the approach in their paper uses entities and --- architectures where this approach relies on functions --- and procedures, so the usage models differ greatly however. --- - -library ieee ; -use ieee.std_logic_1164.all ; -use ieee.numeric_std.all ; -use ieee.math_real.all ; -use std.textio.all ; - --- comment out following 2 lines with VHDL-2008. Leave in for VHDL-2002 --- library ieee_proposed ; -- remove with VHDL-2008 --- use ieee_proposed.standard_additions.all ; -- remove with VHDL-2008 - -use work.TextUtilPkg.all ; -use work.TranscriptPkg.all ; -use work.AlertLogPkg.all ; -use work.RandomBasePkg.all ; -use work.RandomPkg.all ; -use work.NamePkg.all ; -use work.MessagePkg.all ; -use work.OsvvmGlobalPkg.all ; -use work.VendorCovApiPkg.all ; - -package CoveragePkg is - - -- CovPType allocates bins that are multiples of MIN_NUM_BINS - constant MIN_NUM_BINS : integer := 2**7 ; -- power of 2 - - type RangeType is record - min : integer ; - max : integer ; - end record ; - type RangeArrayType is array (integer range <>) of RangeType ; - constant ALL_RANGE : RangeArrayType := (1=>(Integer'left, Integer'right)) ; - - procedure write ( file f : text ; BinVal : RangeArrayType ) ; - procedure write ( variable buf : inout line ; constant BinVal : in RangeArrayType) ; - - -- CovBinBaseType.action values. - -- Note that coverage counting depends on these values - constant COV_COUNT : integer := 1 ; - constant COV_IGNORE : integer := 0 ; - constant COV_ILLEGAL : integer := -1 ; - - -- type OsvvmOptionsType is (OPT_DEFAULT, FALSE, TRUE) ; - alias CovOptionsType is work.OsvvmGlobalPkg.OsvvmOptionsType ; - constant COV_OPT_INIT_PARM_DETECT : CovOptionsType := work.OsvvmGlobalPkg.OPT_INIT_PARM_DETECT ; - -- For backward compatibility. Don't add to other packages. - alias DISABLED is work.OsvvmGlobalPkg.DISABLED [return work.OsvvmGlobalPkg.OsvvmOptionsType ]; - alias ENABLED is work.OsvvmGlobalPkg.ENABLED [return work.OsvvmGlobalPkg.OsvvmOptionsType ]; - --- Deprecated - -- Used for easy manual entry. Order: min, max, action - -- Intentionally did not use a record to allow other input - -- formats in the future with VHDL-2008 unconstrained arrays - -- of unconstrained elements - -- type CovBinManualType is array (natural range <>) of integer_vector(0 to 2) ; - - type CovBinBaseType is record - BinVal : RangeArrayType(1 to 1) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovBinType is array (natural range <>) of CovBinBaseType ; - - constant ALL_BIN : CovBinType := (0 => ( BinVal => ALL_RANGE, Action => COV_COUNT, Count => 0, AtLeast => 1, Weight => 1 )) ; - constant ALL_COUNT : CovBinType := (0 => ( BinVal => ALL_RANGE, Action => COV_COUNT, Count => 0, AtLeast => 1, Weight => 1 )) ; - constant ALL_ILLEGAL : CovBinType := (0 => ( BinVal => ALL_RANGE, Action => COV_ILLEGAL, Count => 0, AtLeast => 0, Weight => 0 )) ; - constant ALL_IGNORE : CovBinType := (0 => ( BinVal => ALL_RANGE, Action => COV_IGNORE, Count => 0, AtLeast => 0, Weight => 0 )) ; - constant ZERO_BIN : CovBinType := (0 => ( BinVal => (1=>(0,0)), Action => COV_COUNT, Count => 0, AtLeast => 1, Weight => 1 )) ; - constant ONE_BIN : CovBinType := (0 => ( BinVal => (1=>(1,1)), Action => COV_COUNT, Count => 0, AtLeast => 1, Weight => 1 )) ; - constant NULL_BIN : CovBinType(work.RandomPkg.NULL_RANGE_TYPE) := (others => ( BinVal => ALL_RANGE, Action => integer'high, Count => 0, AtLeast => integer'high, Weight => integer'high )) ; - - type CountModeType is (COUNT_FIRST, COUNT_ALL) ; - type IllegalModeType is (ILLEGAL_ON, ILLEGAL_FAILURE, ILLEGAL_OFF) ; - type WeightModeType is (AT_LEAST, WEIGHT, REMAIN, REMAIN_EXP, REMAIN_SCALED, REMAIN_WEIGHT ) ; - - - -- In VHDL-2008 CovMatrix?BaseType and CovMatrix?Type will be subsumed - -- by CovBinBaseType and CovBinType with RangeArrayType as an unconstrained array. - type CovMatrix2BaseType is record - BinVal : RangeArrayType(1 to 2) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovMatrix2Type is array (natural range <>) of CovMatrix2BaseType ; - - type CovMatrix3BaseType is record - BinVal : RangeArrayType(1 to 3) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovMatrix3Type is array (natural range <>) of CovMatrix3BaseType ; - - type CovMatrix4BaseType is record - BinVal : RangeArrayType(1 to 4) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovMatrix4Type is array (natural range <>) of CovMatrix4BaseType ; - - type CovMatrix5BaseType is record - BinVal : RangeArrayType(1 to 5) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovMatrix5Type is array (natural range <>) of CovMatrix5BaseType ; - - type CovMatrix6BaseType is record - BinVal : RangeArrayType(1 to 6) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovMatrix6Type is array (natural range <>) of CovMatrix6BaseType ; - - type CovMatrix7BaseType is record - BinVal : RangeArrayType(1 to 7) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovMatrix7Type is array (natural range <>) of CovMatrix7BaseType ; - - type CovMatrix8BaseType is record - BinVal : RangeArrayType(1 to 8) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovMatrix8Type is array (natural range <>) of CovMatrix8BaseType ; - - type CovMatrix9BaseType is record - BinVal : RangeArrayType(1 to 9) ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - end record ; - type CovMatrix9Type is array (natural range <>) of CovMatrix9BaseType ; - - ------------------------------------------------------------ VendorCov - -- VendorCov Conversion for Vendor supported functional coverage modeling - function ToVendorCovBinVal (BinVal : RangeArrayType) return VendorCovRangeArrayType ; - - ------------------------------------------------------------ - function ToMinPoint (A : RangeArrayType) return integer ; - function ToMinPoint (A : RangeArrayType) return integer_vector ; - -- BinVal to Minimum Point - - ------------------------------------------------------------ - procedure ToRandPoint( - -- BinVal to Random Point - -- better as a function, however, inout not supported on functions - ------------------------------------------------------------ - variable RV : inout RandomPType ; - constant BinVal : in RangeArrayType ; - variable result : out integer - ) ; - - ------------------------------------------------------------ - procedure ToRandPoint( - -- BinVal to Random Point - ------------------------------------------------------------ - variable RV : inout RandomPType ; - constant BinVal : in RangeArrayType ; - variable result : out integer_vector - ) ; - - - ------------------------------------------------------------------------------------------ - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - ------------------------------------------------------------------------------------------ - type CovPType is protected - procedure FileOpenWriteBin (FileName : string; OpenKind : File_Open_Kind ) ; - procedure FileCloseWriteBin ; - procedure SetAlertLogID (A : AlertLogIDType) ; - procedure SetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) ; - impure function GetAlertLogID return AlertLogIDType ; - - -- procedure FileOpenWriteCovDb (FileName : string; OpenKind : File_Open_Kind ) ; - -- procedure FileCloseWriteCovDb ; - procedure SetIllegalMode (A : IllegalModeType) ; - procedure SetWeightMode (A : WeightModeType; Scale : real := 1.0) ; - procedure SetName (Name : String) ; - impure function SetName (Name : String) return string ; - impure function GetName return String ; - impure function GetCovModelName return String ; - procedure SetMessage (Message : String) ; - procedure DeallocateName ; -- clear name - procedure DeallocateMessage ; -- clear message - procedure SetThresholding(A : boolean := TRUE ) ; -- 2.5 - procedure SetCovThreshold (Percent : real) ; - procedure SetCovTarget (Percent : real) ; -- 2.5 - impure function GetCovTarget return real ; -- 2.5 - procedure SetMerging(A : boolean := TRUE ) ; -- 2.5 - procedure SetCountMode (A : CountModeType) ; - procedure InitSeed (S : string ) ; - impure function InitSeed (S : string ) return string ; - procedure InitSeed (I : integer ) ; - procedure SetSeed (RandomSeedIn : RandomSeedType ) ; - impure function GetSeed return RandomSeedType ; - - ------------------------------------------------------------ - procedure SetReportOptions ( - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - - procedure SetBinSize (NewNumBins : integer) ; - - ------------------------------------------------------------ - procedure AddBins ( - ------------------------------------------------------------ - Name : String ; - AtLeast : integer ; - Weight : integer ; - CovBin : CovBinType - ) ; - procedure AddBins ( Name : String ; AtLeast : integer ; CovBin : CovBinType ) ; - procedure AddBins ( Name : String ; CovBin : CovBinType) ; - procedure AddBins ( AtLeast : integer ; Weight : integer ; CovBin : CovBinType ) ; - procedure AddBins ( AtLeast : integer ; CovBin : CovBinType ) ; - procedure AddBins ( CovBin : CovBinType ) ; - - ------------------------------------------------------------ - procedure AddCross( - ------------------------------------------------------------ - Name : string ; - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) ; - - ------------------------------------------------------------ - procedure AddCross( - Name : string ; - AtLeast : integer ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) ; - - ------------------------------------------------------------ - procedure AddCross( - Name : string ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) ; - - ------------------------------------------------------------ - procedure AddCross( - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) ; - - ------------------------------------------------------------ - procedure AddCross( - AtLeast : integer ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) ; - - ------------------------------------------------------------ - procedure AddCross( - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) ; - - - procedure Deallocate ; - - procedure ICoverLast ; - procedure ICover( CovPoint : integer) ; - procedure ICover( CovPoint : integer_vector) ; - - procedure ClearCov ; - procedure SetCovZero ; - - impure function IsInitialized return boolean ; - impure function GetNumBins return integer ; - impure function GetMinIndex return integer ; - impure function GetMinCov return real ; -- PercentCov - impure function GetMinCount return integer ; -- Count - impure function GetMaxIndex return integer ; - impure function GetMaxCov return real ; -- PercentCov - impure function GetMaxCount return integer ; -- Count - impure function CountCovHoles ( PercentCov : real ) return integer ; - impure function CountCovHoles return integer ; - impure function IsCovered return boolean ; - impure function IsCovered ( PercentCov : real ) return boolean ; - impure function GetCov ( PercentCov : real ) return real ; - impure function GetCov return real ; -- PercentCov of entire model/all bins - impure function GetItemCount return integer ; - impure function GetTotalCovGoal ( PercentCov : real ) return integer ; - impure function GetTotalCovGoal return integer ; - impure function GetLastIndex return integer ; - - -- Return BinVal - impure function GetBinVal ( BinIndex : integer ) return RangeArrayType ; - impure function GetLastBinVal return RangeArrayType ; - impure function RandCovBinVal ( PercentCov : real ) return RangeArrayType ; - impure function RandCovBinVal return RangeArrayType ; - impure function GetMinBinVal return RangeArrayType ; - impure function GetMaxBinVal return RangeArrayType ; - impure function GetHoleBinVal ( ReqHoleNum : integer ; PercentCov : real ) return RangeArrayType ; - impure function GetHoleBinVal ( PercentCov : real ) return RangeArrayType ; - impure function GetHoleBinVal ( ReqHoleNum : integer := 1 ) return RangeArrayType ; - - -- Return Points - impure function RandCovPoint return integer ; - impure function RandCovPoint ( PercentCov : real ) return integer ; - impure function RandCovPoint return integer_vector ; - impure function RandCovPoint ( PercentCov : real ) return integer_vector ; - impure function GetPoint ( BinIndex : integer ) return integer ; - impure function GetPoint ( BinIndex : integer ) return integer_vector ; - impure function GetMinPoint return integer ; - impure function GetMinPoint return integer_vector ; - impure function GetMaxPoint return integer ; - impure function GetMaxPoint return integer_vector ; - - -- GetBin returns an internal value of the coverage data structure - -- The return value may change as the package evolves - -- Use it only for debugging. - -- GetBinInfo is a for development only. - impure function GetBinInfo ( BinIndex : integer ) return CovBinBaseType ; - impure function GetBinValLength return integer ; - impure function GetBin ( BinIndex : integer ) return CovBinBaseType ; - impure function GetBin ( BinIndex : integer ) return CovMatrix2BaseType ; - impure function GetBin ( BinIndex : integer ) return CovMatrix3BaseType ; - impure function GetBin ( BinIndex : integer ) return CovMatrix4BaseType ; - impure function GetBin ( BinIndex : integer ) return CovMatrix5BaseType ; - impure function GetBin ( BinIndex : integer ) return CovMatrix6BaseType ; - impure function GetBin ( BinIndex : integer ) return CovMatrix7BaseType ; - impure function GetBin ( BinIndex : integer ) return CovMatrix8BaseType ; - impure function GetBin ( BinIndex : integer ) return CovMatrix9BaseType ; - impure function GetBinName ( BinIndex : integer; DefaultName : string := "" ) return string ; - - ------------------------------------------------------------ - procedure WriteBin ( - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - - ------------------------------------------------------------ - procedure WriteBin ( -- With LogLevel - LogLevel : LogType ; - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - - ------------------------------------------------------------ - procedure WriteBin ( - FileName : string; - OpenKind : File_Open_Kind := APPEND_MODE ; - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - - ------------------------------------------------------------ - procedure WriteBin ( -- With LogLevel - LogLevel : LogType ; - FileName : string; - OpenKind : File_Open_Kind := APPEND_MODE ; - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - - procedure WriteCovHoles ( LogLevel : LogType := ALWAYS ) ; - procedure WriteCovHoles ( PercentCov : real ) ; - procedure WriteCovHoles ( LogLevel : LogType ; PercentCov : real ) ; - procedure WriteCovHoles ( FileName : string; OpenKind : File_Open_Kind := APPEND_MODE ) ; - procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; OpenKind : File_Open_Kind := APPEND_MODE ) ; - procedure WriteCovHoles ( FileName : string; PercentCov : real ; OpenKind : File_Open_Kind := APPEND_MODE ) ; - procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; PercentCov : real ; OpenKind : File_Open_Kind := APPEND_MODE ) ; - procedure DumpBin (LogLevel : LogType := DEBUG) ; -- Development only - - procedure ReadCovDb (FileName : string; Merge : boolean := FALSE) ; - procedure WriteCovDb (FileName : string; OpenKind : File_Open_Kind := WRITE_MODE ) ; - impure function GetErrorCount return integer ; - - -- These support usage of cross coverage constants - -- Also support the older AddBins(GenCross(...)) methodology - -- which has been replaced by AddCross - procedure AddCross (CovBin : CovMatrix2Type ; Name : String := "") ; - procedure AddCross (CovBin : CovMatrix3Type ; Name : String := "") ; - procedure AddCross (CovBin : CovMatrix4Type ; Name : String := "") ; - procedure AddCross (CovBin : CovMatrix5Type ; Name : String := "") ; - procedure AddCross (CovBin : CovMatrix6Type ; Name : String := "") ; - procedure AddCross (CovBin : CovMatrix7Type ; Name : String := "") ; - procedure AddCross (CovBin : CovMatrix8Type ; Name : String := "") ; - procedure AddCross (CovBin : CovMatrix9Type ; Name : String := "") ; - ------------------------------------------------------------- --- Remaining are Deprecated --- - -- Deprecated. Replaced by SetName with multi-line support - procedure SetItemName (ItemNameIn : String) ; -- deprecated - - -- Deprecated. Consistency across packages - impure function CovBinErrCnt return integer ; - --- Deprecated. Due to name changes to promote greater consistency - -- Maintained for backward compatibility. - -- RandCovHole replaced by RandCovBinVal - impure function RandCovHole ( PercentCov : real ) return RangeArrayType ; -- Deprecated - impure function RandCovHole return RangeArrayType ; -- Deprecated - - -- GetCovHole replaced by GetHoleBinVal - impure function GetCovHole ( ReqHoleNum : integer ; PercentCov : real ) return RangeArrayType ; - impure function GetCovHole ( PercentCov : real ) return RangeArrayType ; - impure function GetCovHole ( ReqHoleNum : integer := 1 ) return RangeArrayType ; - - --- Deprecated/ Subsumed by versions with PercentCov Parameter - -- Maintained for backward compatibility only and - -- may be removed in the future. - impure function GetMinCov return integer ; - impure function GetMaxCov return integer ; - impure function CountCovHoles ( AtLeast : integer ) return integer ; - impure function IsCovered ( AtLeast : integer ) return boolean ; - impure function RandCovBinVal ( AtLeast : integer ) return RangeArrayType ; - impure function RandCovHole ( AtLeast : integer ) return RangeArrayType ; -- Deprecated - impure function RandCovPoint (AtLeast : integer ) return integer ; - impure function RandCovPoint (AtLeast : integer ) return integer_vector ; - impure function GetHoleBinVal ( ReqHoleNum : integer ; AtLeast : integer ) return RangeArrayType ; - impure function GetCovHole ( ReqHoleNum : integer ; AtLeast : integer ) return RangeArrayType ; - - procedure WriteCovHoles ( AtLeast : integer ) ; - procedure WriteCovHoles ( LogLevel : LogType ; AtLeast : integer ) ; - procedure WriteCovHoles ( FileName : string; AtLeast : integer ; OpenKind : File_Open_Kind := APPEND_MODE ) ; - procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; AtLeast : integer ; OpenKind : File_Open_Kind := APPEND_MODE ) ; - - -- Replaced by a more appropriately named AddCross - procedure AddBins (CovBin : CovMatrix2Type ; Name : String := "") ; - procedure AddBins (CovBin : CovMatrix3Type ; Name : String := "") ; - procedure AddBins (CovBin : CovMatrix4Type ; Name : String := "") ; - procedure AddBins (CovBin : CovMatrix5Type ; Name : String := "") ; - procedure AddBins (CovBin : CovMatrix6Type ; Name : String := "") ; - procedure AddBins (CovBin : CovMatrix7Type ; Name : String := "") ; - procedure AddBins (CovBin : CovMatrix8Type ; Name : String := "") ; - procedure AddBins (CovBin : CovMatrix9Type ; Name : String := "") ; - - end protected CovPType ; - ------------------------------------------------------------------------------------------ - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - ------------------------------------------------------------------------------------------ - - - ------------------------------------------------------------ - -- Experimental. Intended primarily for development. - procedure CompareBins ( - ------------------------------------------------------------ - variable Bin1 : inout CovPType ; - variable Bin2 : inout CovPType ; - variable ErrorCount : inout integer - ) ; - - ------------------------------------------------------------ - -- Experimental. Intended primarily for development. - procedure CompareBins ( - ------------------------------------------------------------ - variable Bin1 : inout CovPType ; - variable Bin2 : inout CovPType - ) ; - - -- - -- Support for AddBins and AddCross - -- - - ------------------------------------------------------------ - function GenBin( - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Min, Max : integer ; - NumBin : integer - ) return CovBinType ; - - -- Each item in range in a separate CovBin - function GenBin(AtLeast : integer ; Min, Max, NumBin : integer ) return CovBinType ; - function GenBin(Min, Max, NumBin : integer ) return CovBinType ; - function GenBin(Min, Max : integer) return CovBinType ; - function GenBin(A : integer) return CovBinType ; - - ------------------------------------------------------------ - function GenBin( - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - A : integer_vector - ) return CovBinType ; - - function GenBin ( AtLeast : integer ; A : integer_vector ) return CovBinType ; - function GenBin ( A : integer_vector ) return CovBinType ; - - - ------------------------------------------------------------ - function IllegalBin ( Min, Max, NumBin : integer ) return CovBinType ; - ------------------------------------------------------------ - - -- All items in range in a single CovBin - function IllegalBin ( Min, Max : integer ) return CovBinType ; - function IllegalBin ( A : integer ) return CovBinType ; - - --- IgnoreBin should never have an AtLeast parameter - ------------------------------------------------------------ - function IgnoreBin (Min, Max, NumBin : integer) return CovBinType ; - ------------------------------------------------------------ - function IgnoreBin (Min, Max : integer) return CovBinType ; -- All items in range in a single CovBin - function IgnoreBin (A : integer) return CovBinType ; - - - -- With VHDL-2008, there will be one GenCross that returns CovBinType - -- and has inputs initialized to NULL_BIN - see AddCross - ------------------------------------------------------------ - function GenCross( -- 2 - -- Cross existing bins - -- Use AddCross for adding values directly to coverage database - -- Use GenCross for constants - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2 : CovBinType - ) return CovMatrix2Type ; - - function GenCross(AtLeast : integer ; Bin1, Bin2 : CovBinType) return CovMatrix2Type ; - function GenCross(Bin1, Bin2 : CovBinType) return CovMatrix2Type ; - - - ------------------------------------------------------------ - function GenCross( -- 3 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3 : CovBinType - ) return CovMatrix3Type ; - - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3 : CovBinType ) return CovMatrix3Type ; - function GenCross( Bin1, Bin2, Bin3 : CovBinType ) return CovMatrix3Type ; - - - ------------------------------------------------------------ - function GenCross( -- 4 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4 : CovBinType - ) return CovMatrix4Type ; - - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4 : CovBinType ) return CovMatrix4Type ; - function GenCross( Bin1, Bin2, Bin3, Bin4 : CovBinType ) return CovMatrix4Type ; - - - ------------------------------------------------------------ - function GenCross( -- 5 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType - ) return CovMatrix5Type ; - - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType ) return CovMatrix5Type ; - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType ) return CovMatrix5Type ; - - - ------------------------------------------------------------ - function GenCross( -- 6 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType - ) return CovMatrix6Type ; - - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType ) return CovMatrix6Type ; - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType ) return CovMatrix6Type ; - - - ------------------------------------------------------------ - function GenCross( -- 7 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType - ) return CovMatrix7Type ; - - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType ) return CovMatrix7Type ; - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType ) return CovMatrix7Type ; - - - ------------------------------------------------------------ - function GenCross( -- 8 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType - ) return CovMatrix8Type ; - - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType ) return CovMatrix8Type ; - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType ) return CovMatrix8Type ; - - - ------------------------------------------------------------ - function GenCross( -- 9 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType - ) return CovMatrix9Type ; - - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType ) return CovMatrix9Type ; - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType ) return CovMatrix9Type ; - - - ------------------------------------------------------------ - -- Utilities. Remove if added to std.standard - function to_integer ( B : boolean ) return integer ; - function to_integer ( SL : std_logic ) return integer ; - function to_integer_vector ( BV : boolean_vector ) return integer_vector ; - function to_integer_vector ( SLV : std_logic_vector ) return integer_vector ; - - - ------------------------------------------------------------ - ------------------------------------------------------------ --- Deprecated: These are not part of the coverage model - - procedure increment( signal Count : inout integer ) ; - procedure increment( signal Count : inout integer ; enable : boolean ) ; - procedure increment( signal Count : inout integer ; enable : std_ulogic ) ; - - - - -end package CoveragePkg ; - ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// - -package body CoveragePkg is - ------------------------------------------------------------ - function inside ( - -- package local - ------------------------------------------------------------ - CovPoint : integer_vector ; - BinVal : RangeArrayType - ) return boolean is - alias iCovPoint : integer_vector(BinVal'range) is CovPoint ; - begin - for i in BinVal'range loop - if not (iCovPoint(i) >= BinVal(i).min and iCovPoint(i) <= BinVal(i).max) then - return FALSE ; - end if ; - end loop ; - return TRUE ; - end function inside ; - - - ------------------------------------------------------------ - function inside ( - -- package local, used by InsertBin - -- True when BinVal1 is inside BinVal2 - ------------------------------------------------------------ - BinVal1 : RangeArrayType ; - BinVal2 : RangeArrayType - ) return boolean is - alias iBinVal2 : RangeArrayType(BinVal1'range) is BinVal2 ; - begin - for i in BinVal1'range loop - if not (BinVal1(i).min >= iBinVal2(i).min and BinVal1(i).max <= iBinVal2(i).max) then - return FALSE ; - end if ; - end loop ; - return TRUE ; - end function inside ; - - - ------------------------------------------------------------ - procedure write ( - variable buf : inout line ; - CovPoint : integer_vector - ) is - -- package local. called by ICover - ------------------------------------------------------------ - alias iCovPoint : integer_vector(1 to CovPoint'length) is CovPoint ; - begin - write(buf, "(" & integer'image(iCovPoint(1)) ) ; - for i in 2 to iCovPoint'right loop - write(buf, "," & integer'image(iCovPoint(i)) ) ; - end loop ; - swrite(buf, ")") ; - end procedure write ; - - ------------------------------------------------------------ - procedure write ( file f : text ; BinVal : RangeArrayType ) is - -- called by WriteBin and WriteCovHoles - ------------------------------------------------------------ - begin - for i in BinVal'range loop - if BinVal(i).min = BinVal(i).max then - write(f, "(" & integer'image(BinVal(i).min) & ") " ) ; - elsif (BinVal(i).min = integer'left) and (BinVal(i).max = integer'right) then - write(f, "(ALL) " ) ; - else - write(f, "(" & integer'image(BinVal(i).min) & " to " & - integer'image(BinVal(i).max) & ") " ) ; - end if ; - end loop ; - end procedure write ; - - ------------------------------------------------------------ - procedure write ( - -- called by WriteBin and WriteCovHoles - ------------------------------------------------------------ - variable buf : inout line ; - constant BinVal : in RangeArrayType - ) is - ------------------------------------------------------------ - begin - for i in BinVal'range loop - if BinVal(i).min = BinVal(i).max then - write(buf, "(" & integer'image(BinVal(i).min) & ") " ) ; - elsif (BinVal(i).min = integer'left) and (BinVal(i).max = integer'right) then - swrite(buf, "(ALL) " ) ; - else - write(buf, "(" & integer'image(BinVal(i).min) & " to " & - integer'image(BinVal(i).max) & ") " ) ; - end if ; - end loop ; - end procedure write ; - - - ------------------------------------------------------------ - procedure WriteBinVal ( - -- package local for now - ------------------------------------------------------------ - variable buf : inout line ; - constant BinVal : in RangeArrayType - ) is - begin - for i in BinVal'range loop - write(buf, BinVal(i).min) ; - write(buf, ' ') ; - write(buf, BinVal(i).max) ; - write(buf, ' ') ; - end loop ; - end procedure WriteBinVal ; - - - ------------------------------------------------------------ - -- package local for now - procedure read ( - -- if public, also create one that does not use valid flag - ------------------------------------------------------------ - variable buf : inout line ; - variable BinVal : out RangeArrayType ; - variable Valid : out boolean - ) is - variable ReadValid : boolean ; - begin - for i in BinVal'range loop - read(buf, BinVal(i).min, ReadValid) ; - exit when not ReadValid ; - read(buf, BinVal(i).max, ReadValid) ; - exit when not ReadValid ; - end loop ; - Valid := ReadValid ; - end procedure read ; - - - -- ------------------------------------------------------------ - function BinLengths ( - -- package local, used by AddCross, GenCross - -- ------------------------------------------------------------ - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) return integer_vector is - variable result : integer_vector(1 to 20) := (others => 0 ) ; - variable i : integer := result'left ; - variable Len : integer ; - begin - loop - case i is - when 1 => Len := Bin1'length ; - when 2 => Len := Bin2'length ; - when 3 => Len := Bin3'length ; - when 4 => Len := Bin4'length ; - when 5 => Len := Bin5'length ; - when 6 => Len := Bin6'length ; - when 7 => Len := Bin7'length ; - when 8 => Len := Bin8'length ; - when 9 => Len := Bin9'length ; - when 10 => Len := Bin10'length ; - when 11 => Len := Bin11'length ; - when 12 => Len := Bin12'length ; - when 13 => Len := Bin13'length ; - when 14 => Len := Bin14'length ; - when 15 => Len := Bin15'length ; - when 16 => Len := Bin16'length ; - when 17 => Len := Bin17'length ; - when 18 => Len := Bin18'length ; - when 19 => Len := Bin19'length ; - when 20 => Len := Bin20'length ; - when others => Len := 0 ; - end case ; - result(i) := Len ; - exit when Len = 0 ; - i := i + 1 ; - exit when i = 21 ; - end loop ; - return result(1 to (i-1)) ; - end function BinLengths ; - - - -- ------------------------------------------------------------ - function CalcNumCrossBins ( BinLens : integer_vector ) return integer is - -- package local, used by AddCross - -- ------------------------------------------------------------ - variable result : integer := 1 ; - begin - for i in BinLens'range loop - result := result * BinLens(i) ; - end loop ; - return result ; - end function CalcNumCrossBins ; - - - -- ------------------------------------------------------------ - procedure IncBinIndex ( - -- package local, used by AddCross - -- ------------------------------------------------------------ - variable BinIndex : inout integer_vector ; - constant BinLens : in integer_vector - ) is - alias aBinIndex : integer_vector(1 to BinIndex'length) is BinIndex ; - alias aBinLens : integer_vector(aBinIndex'range) is BinLens ; - begin - -- increment right most one, then if overflow, increment next - -- assumes bins numbered from 1 to N. - assured by ConcatenateBins - for i in aBinIndex'reverse_range loop - aBinIndex(i) := aBinIndex(i) + 1 ; - exit when aBinIndex(i) <= aBinLens(i) ; - aBinIndex(i) := 1 ; - end loop ; - end procedure IncBinIndex ; - - - -- ------------------------------------------------------------ - function ConcatenateBins ( - -- package local, used by AddCross and GenCross - -- ------------------------------------------------------------ - BinIndex : integer_vector ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) return CovBinType is - alias aBin1 : CovBinType (1 to Bin1'length) is Bin1 ; - alias aBin2 : CovBinType (1 to Bin2'length) is Bin2 ; - alias aBin3 : CovBinType (1 to Bin3'length) is Bin3 ; - alias aBin4 : CovBinType (1 to Bin4'length) is Bin4 ; - alias aBin5 : CovBinType (1 to Bin5'length) is Bin5 ; - alias aBin6 : CovBinType (1 to Bin6'length) is Bin6 ; - alias aBin7 : CovBinType (1 to Bin7'length) is Bin7 ; - alias aBin8 : CovBinType (1 to Bin8'length) is Bin8 ; - alias aBin9 : CovBinType (1 to Bin9'length) is Bin9 ; - alias aBin10 : CovBinType (1 to Bin10'length) is Bin10 ; - alias aBin11 : CovBinType (1 to Bin11'length) is Bin11 ; - alias aBin12 : CovBinType (1 to Bin12'length) is Bin12 ; - alias aBin13 : CovBinType (1 to Bin13'length) is Bin13 ; - alias aBin14 : CovBinType (1 to Bin14'length) is Bin14 ; - alias aBin15 : CovBinType (1 to Bin15'length) is Bin15 ; - alias aBin16 : CovBinType (1 to Bin16'length) is Bin16 ; - alias aBin17 : CovBinType (1 to Bin17'length) is Bin17 ; - alias aBin18 : CovBinType (1 to Bin18'length) is Bin18 ; - alias aBin19 : CovBinType (1 to Bin19'length) is Bin19 ; - alias aBin20 : CovBinType (1 to Bin20'length) is Bin20 ; - alias aBinIndex : integer_vector(1 to BinIndex'length) is BinIndex ; - variable result : CovBinType(aBinIndex'range) ; - begin - for i in aBinIndex'range loop - case i is - when 1 => result(i) := aBin1(aBinIndex(i)) ; - when 2 => result(i) := aBin2(aBinIndex(i)) ; - when 3 => result(i) := aBin3(aBinIndex(i)) ; - when 4 => result(i) := aBin4(aBinIndex(i)) ; - when 5 => result(i) := aBin5(aBinIndex(i)) ; - when 6 => result(i) := aBin6(aBinIndex(i)) ; - when 7 => result(i) := aBin7(aBinIndex(i)) ; - when 8 => result(i) := aBin8(aBinIndex(i)) ; - when 9 => result(i) := aBin9(aBinIndex(i)) ; - when 10 => result(i) := aBin10(aBinIndex(i)) ; - when 11 => result(i) := aBin11(aBinIndex(i)) ; - when 12 => result(i) := aBin12(aBinIndex(i)) ; - when 13 => result(i) := aBin13(aBinIndex(i)) ; - when 14 => result(i) := aBin14(aBinIndex(i)) ; - when 15 => result(i) := aBin15(aBinIndex(i)) ; - when 16 => result(i) := aBin16(aBinIndex(i)) ; - when 17 => result(i) := aBin17(aBinIndex(i)) ; - when 18 => result(i) := aBin18(aBinIndex(i)) ; - when 19 => result(i) := aBin19(aBinIndex(i)) ; - when 20 => result(i) := aBin20(aBinIndex(i)) ; - when others => - -- pure functions cannot use alert and/or print - report "CoveragePkg.AddCross: More than 20 bins not supported" - severity FAILURE ; - end case ; - end loop ; - return result ; - end function ConcatenateBins ; - - - ------------------------------------------------------------ - function MergeState( CrossBins : CovBinType) return integer is - -- package local, Used by AddCross, GenCross - ------------------------------------------------------------ - variable resultState : integer ; - begin - resultState := COV_COUNT ; - for i in CrossBins'range loop - if CrossBins(i).action = COV_ILLEGAL then - return COV_ILLEGAL ; - end if ; - if CrossBins(i).action = COV_IGNORE then - resultState := COV_IGNORE ; - end if ; - end loop ; - return resultState ; - end function MergeState ; - - - ------------------------------------------------------------ - function MergeBinVal( CrossBins : CovBinType) return RangeArrayType is - -- package local, Used by AddCross, GenCross - ------------------------------------------------------------ - alias aCrossBins : CovBinType(1 to CrossBins'length) is CrossBins ; - variable BinVal : RangeArrayType(aCrossBins'range) ; - begin - for i in aCrossBins'range loop - BinVal(i to i) := aCrossBins(i).BinVal ; - end loop ; - return BinVal ; - end function MergeBinVal ; - - - ------------------------------------------------------------ - function MergeAtLeast( - -- package local, Used by AddCross, GenCross - ------------------------------------------------------------ - Action : in integer ; - AtLeast : in integer ; - CrossBins : in CovBinType - ) return integer is - variable Result : integer := AtLeast ; - begin - if Action /= COV_COUNT then - return 0 ; - end if ; - for i in CrossBins'range loop - if CrossBins(i).Action = Action then - Result := maximum (Result, CrossBins(i).AtLeast) ; - end if ; - end loop ; - return result ; - end function MergeAtLeast ; - - - ------------------------------------------------------------ - function MergeWeight( - -- package local, Used by AddCross, GenCross - ------------------------------------------------------------ - Action : in integer ; - Weight : in integer ; - CrossBins : in CovBinType - ) return integer is - variable Result : integer := Weight ; - begin - if Action /= COV_COUNT then - return 0 ; - end if ; - for i in CrossBins'range loop - if CrossBins(i).Action = Action then - Result := maximum (Result, CrossBins(i).Weight) ; - end if ; - end loop ; - return result ; - end function MergeWeight ; - - - ------------------------------------------------------------ VendorCov - -- VendorCov Conversion for Vendor supported functional coverage modeling - function ToVendorCovBinVal (BinVal : RangeArrayType) return VendorCovRangeArrayType is - ------------------------------------------------------------ - variable VendorCovBinVal : VendorCovRangeArrayType(BinVal'range); - begin -- VendorCov - for ArrIdx in BinVal'LEFT to BinVal'RIGHT loop -- VendorCov - VendorCovBinVal(ArrIdx) := (min => BinVal(ArrIdx).min, -- VendorCov - max => BinVal(ArrIdx).max) ; -- VendorCov - end loop; -- VendorCov - return VendorCovBinVal ; - end function ToVendorCovBinVal ; - - - ------------------------------------------------------------ - function ToMinPoint (A : RangeArrayType) return integer is - -- Used in testing - ------------------------------------------------------------ - begin - return A(A'left).min ; - end function ToMinPoint ; - - - ------------------------------------------------------------ - function ToMinPoint (A : RangeArrayType) return integer_vector is - -- Used in testing - ------------------------------------------------------------ - variable result : integer_vector(A'range) ; - begin - for i in A'range loop - result(i) := A(i).min ; - end loop ; - return result ; - end function ToMinPoint ; - - - ------------------------------------------------------------ - procedure ToRandPoint( - ------------------------------------------------------------ - variable RV : inout RandomPType ; - constant BinVal : in RangeArrayType ; - variable result : out integer - ) is - begin - result := RV.RandInt(BinVal(BinVal'left).min, BinVal(BinVal'left).max) ; - end procedure ToRandPoint ; - - - ------------------------------------------------------------ - procedure ToRandPoint( - ------------------------------------------------------------ - variable RV : inout RandomPType ; - constant BinVal : in RangeArrayType ; - variable result : out integer_vector - ) is - variable VectorVal : integer_vector(BinVal'range) ; - begin - for i in BinVal'range loop - VectorVal(i) := RV.RandInt(BinVal(i).min, BinVal(i).max) ; - end loop ; - result := VectorVal ; - end procedure ToRandPoint ; - - ------------------------------------------------------------ - -- Local. Get first word from a string - function GetWord (Message : string) return string is - ------------------------------------------------------------ - alias aMessage : string( 1 to Message'length) is Message ; - begin - for i in aMessage'range loop - if aMessage(i) = ' ' or aMessage(i) = HT then - return aMessage(1 to i-1) ; - end if ; - end loop ; - return aMessage ; - end function GetWord ; - - ------------------------------------------------------------ - -- Local -- long term move to MessagePkg? Used by WriteCovDb - procedure WriteMessage ( file f : text ; variable Message : inout MessagePType ) is - ------------------------------------------------------------ - variable buf : line ; - begin - for i in 1 to Message.GetCount loop - write(buf, string'(Message.Get(i))) ; - writeline(f, buf) ; - end loop ; - end procedure WriteMessage ; - - ------------------------------------------------------------------------------------------ - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - ------------------------------------------------------------------------------------------ - type CovPType is protected body - - -- Name Data Structure - variable CovNameVar : NamePType ; - variable CovMessageVar : MessagePType ; - - -- Handle into Vendor Data Structure -- VendorCov - variable VendorCovHandleVar : VendorCovHandleType := 0 ; -- VendorCov - - -- CoverageBin Data Structures - type RangeArrayPtrType is access RangeArrayType ; - - type CovBinBaseTempType is record - BinVal : RangeArrayPtrType ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - PercentCov : real ; - OrderCount : integer ; - Name : line ; - end record CovBinBaseTempType ; - type CovBinTempType is array (natural range <>) of CovBinBaseTempType ; - type CovBinPtrType is access CovBinTempType ; - - variable CovBinPtr : CovBinPtrType ; - variable NumBins : integer := 0 ; - variable BinValLength : integer := 1 ; - variable OrderCount : integer := 0 ; -- for statistics - variable ItemCount : integer := 0 ; -- Count of randomizations - variable LastIndex : integer := 1 ; -- Index of last randomization - - -- Internal Modes and Names - variable IllegalMode : IllegalModeType := ILLEGAL_ON ; - variable IllegalModeLevel : AlertType := ERROR ; - variable WeightMode : WeightModeType := AT_LEAST ; - variable WeightScale : real := 1.0 ; - - variable ThresholdingEnable : boolean := FALSE ; -- thresholding disabled by default - variable CovThreshold : real := 45.0 ; - variable CovTarget : real := 100.0 ; - - variable MergingEnable : boolean := FALSE ; -- merging disabled by default - variable CountMode : CountModeType := COUNT_FIRST ; - - -- Randomization Variable - variable RV : RandomPType ; - variable RvSeedInit : boolean := FALSE ; - - file WriteBinFile : text ; - variable WriteBinFileInit : boolean := FALSE ; - variable UsingLocalFile : boolean := FALSE ; - variable AlertLogIDVar : AlertLogIDType := OSVVM_ALERTLOG_ID ; - - -- file WriteCovDbFile : text ; - -- variable WriteCovDbFileInit : boolean := FALSE ; - - -- Local WriteBin and WriteCovHoles formatting settings, defaults determined by CoverageGlobals - variable WritePassFailVar : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - variable WriteBinInfoVar : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - variable WriteCountVar : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - variable WriteAnyIllegalVar : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - variable WritePrefixVar : NamePType ; - variable PassNameVar : NamePType ; - variable FailNameVar : NamePType ; - - - ------------------------------------------------------------ - procedure FileOpenWriteBin (FileName : string; OpenKind : File_Open_Kind ) is - ------------------------------------------------------------ - begin - WriteBinFileInit := TRUE ; - file_open( WriteBinFile , FileName , OpenKind ); - end procedure FileOpenWriteBin ; - - ------------------------------------------------------------ - procedure FileCloseWriteBin is - ------------------------------------------------------------ - begin - WriteBinFileInit := FALSE ; - file_close( WriteBinFile) ; - end procedure FileCloseWriteBin ; - - ------------------------------------------------------------ - procedure SetAlertLogID (A : AlertLogIDType) is - ------------------------------------------------------------ - begin - AlertLogIDVar := A ; - end procedure SetAlertLogID ; - - ------------------------------------------------------------ - procedure SetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogIDVar := GetAlertLogID(Name, ParentID, CreateHierarchy) ; - if not RvSeedInit then -- Init seed if not initialized - RV.InitSeed(Name) ; - RvSeedInit := TRUE ; - end if ; - end procedure SetAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogID return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogIDVar ; - end function GetAlertLogID ; - - --- ------------------------------------------------------------ --- procedure FileOpen (FileName : string; OpenKind : File_Open_Kind ) is --- ------------------------------------------------------------ --- begin --- WriteCovDbFileInit := TRUE ; --- file_open( WriteCovDbFile , FileName , OpenKind ); --- end procedure FileOpenWriteCovDb ; --- --- ------------------------------------------------------------ --- procedure FileCloseWriteCovDb is --- ------------------------------------------------------------ --- begin --- WriteCovDbFileInit := FALSE ; --- file_close( WriteCovDbFile ); --- end procedure FileCloseWriteCovDb ; - - ------------------------------------------------------------ - procedure SetName (Name : String) is - ------------------------------------------------------------ - begin - CovNameVar.Set(Name) ; - -- Update if name updated after model created -- VendorCov - if IsInitialized then -- VendorCov - VendorCovSetName(VendorCovHandleVar, Name) ; -- VendorCov - end if ; -- VendorCov - if not RvSeedInit then -- Init seed if not initialized - RV.InitSeed(Name) ; - RvSeedInit := TRUE ; - end if ; - end procedure SetName ; - - ------------------------------------------------------------ - impure function SetName (Name : String) return string is - ------------------------------------------------------------ - begin - SetName(Name) ; -- call procedure above - return Name ; - end function SetName ; - - ------------------------------------------------------------ - impure function GetName return String is - ------------------------------------------------------------ - begin - return CovNameVar.Get("") ; - end function GetName ; - - ------------------------------------------------------------ - impure function GetCovModelName return String is - ------------------------------------------------------------ - begin - if CovNameVar.IsSet then - -- return Name if set - return CovNameVar.Get ; - elsif AlertLogIDVar /= OSVVM_ALERTLOG_ID then - -- otherwise return AlertLogName if it is set - return GetAlertLogName(AlertLogIDVar) ; - elsif CovMessageVar.IsSet then - -- otherwise Get the first word of the Message if it is set - return GetWord(string'(CovMessageVar.Get(1))) ; - else - return "" ; - end if ; - end function GetCovModelName ; - - ------------------------------------------------------------ - impure function GetNamePlus(prefix, suffix : string) return String is - ------------------------------------------------------------ - begin - if CovNameVar.IsSet then - -- return Name if set - return prefix & CovNameVar.Get & suffix ; - elsif AlertLogIDVar = OSVVM_ALERTLOG_ID and CovMessageVar.IsSet then - -- If AlertLogID not set, then use Message - return prefix & GetWord(string'(CovMessageVar.Get(1))) & suffix ; - else - return "" ; - end if ; - end function GetNamePlus ; - - ------------------------------------------------------------ - procedure SetMessage (Message : String) is - ------------------------------------------------------------ - begin - CovMessageVar.Set(Message) ; - -- VendorCov update if name updated after model created - if IsInitialized then -- VendorCov - -- Refine this? If CovNameVar or AlertLogIDName is set, -- VendorCov - -- it may be set to the same name again. -- VendorCov - VendorCovSetName(VendorCovHandleVar, GetCovModelName) ; -- VendorCov - end if ; -- VendorCov - if not RvSeedInit then -- Init seed if not initialized - RV.InitSeed(Message) ; - RvSeedInit := TRUE ; - end if ; - end procedure SetMessage ; - - ------------------------------------------------------------ - procedure SetIllegalMode (A : IllegalModeType) is - ------------------------------------------------------------ - begin - IllegalMode := A ; - if IllegalMode = ILLEGAL_FAILURE then - IllegalModeLevel := FAILURE ; - else - IllegalModeLevel := ERROR ; - end if ; - end procedure SetIllegalMode ; - - ------------------------------------------------------------ - procedure SetWeightMode (A : WeightModeType; Scale : real := 1.0) is - ------------------------------------------------------------ - variable buf : line ; - begin - WeightMode := A ; - WeightScale := Scale ; - - if (WeightMode = REMAIN_EXP) and (WeightScale > 2.0) then - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.SetWeightMode:" & - " WeightScale > 2.0 and large Counts can cause RandCovPoint to fail due to integer values out of range", WARNING) ; - end if ; - if (WeightScale < 1.0) and (WeightMode = REMAIN_WEIGHT or WeightMode = REMAIN_SCALED) then - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.SetWeightMode:" & - " WeightScale must be > 1.0 when WeightMode = REMAIN_WEIGHT or WeightMode = REMAIN_SCALED", FAILURE) ; - WeightScale := 1.0 ; - end if; - if WeightScale <= 0.0 then - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.SetWeightMode:" & - " WeightScale must be > 0.0", FAILURE) ; - WeightScale := 1.0 ; - end if; - end procedure SetWeightMode ; - - ------------------------------------------------------------ - -- pt local for now -- file formal parameter not allowed with a public method - procedure WriteBinName ( file f : text ; S : string ; Prefix : string := "%% " ) is - ------------------------------------------------------------ - variable MessageCount : integer ; - variable MessageIndex : integer := 1 ; - variable buf : line ; - begin - MessageCount := CovMessageVar.GetCount ; - if MessageCount = 0 then - write(buf, Prefix & S & GetCovModelName) ; -- Print name when no message - writeline(f, buf) ; - else - if CovNameVar.IsSet then - -- Print Name if set - write(buf, Prefix & S & CovNameVar.Get) ; - elsif AlertLogIDVar /= OSVVM_ALERTLOG_ID then - -- otherwise Print AlertLogName if it is set - write(buf, Prefix & S & GetAlertLogName(AlertLogIDVar)) ; - else - -- otherwise print the first line of the message - MessageIndex := 2 ; - write(buf, Prefix & S & string'(CovMessageVar.Get(1))) ; - end if ; - writeline(f, buf) ; - for i in MessageIndex to MessageCount loop - write(buf, Prefix & string'(CovMessageVar.Get(i))) ; - writeline(f, buf) ; - end loop ; - end if ; - end procedure WriteBinName ; - - ------------------------------------------------------------ - procedure DeallocateMessage is - ------------------------------------------------------------ - begin - CovMessageVar.Deallocate ; - end procedure DeallocateMessage ; - - ------------------------------------------------------------ - procedure DeallocateName is - ------------------------------------------------------------ - begin - CovNameVar.Clear ; - end procedure DeallocateName ; - - ------------------------------------------------------------ - procedure SetThresholding (A : boolean := TRUE ) is - ------------------------------------------------------------ - begin - ThresholdingEnable := A ; - end procedure SetThresholding ; - - ------------------------------------------------------------ - procedure SetCovThreshold (Percent : real) is - ------------------------------------------------------------ - begin - ThresholdingEnable := TRUE ; - if Percent >= 0.0 then - CovThreshold := Percent + 0.0001 ; -- used in less than - else - CovThreshold := 0.0001 ; -- used in less than - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.SetCovThreshold:" & - " Invalid Threshold Value " & real'image(Percent), FAILURE) ; - end if ; - end procedure SetCovThreshold ; - - ------------------------------------------------------------ - procedure SetCovTarget (Percent : real) is - ------------------------------------------------------------ - begin - CovTarget := Percent ; - end procedure SetCovTarget ; - - ------------------------------------------------------------ - impure function GetCovTarget return real is - ------------------------------------------------------------ - begin - return CovTarget ; - end function GetCovTarget ; - - ------------------------------------------------------------ - procedure SetMerging (A : boolean := TRUE ) is - ------------------------------------------------------------ - begin - MergingEnable := A ; - end procedure SetMerging ; - - ------------------------------------------------------------ - procedure SetCountMode (A : CountModeType) is - ------------------------------------------------------------ - begin - CountMode := A ; - end procedure SetCountMode ; - - ------------------------------------------------------------ - procedure InitSeed (S : string ) is - ------------------------------------------------------------ - begin - RV.InitSeed(S) ; - RvSeedInit := TRUE ; - end procedure InitSeed ; - - ------------------------------------------------------------ - impure function InitSeed (S : string ) return string is - ------------------------------------------------------------ - begin - RV.InitSeed(S) ; - RvSeedInit := TRUE ; - return S ; - end function InitSeed ; - - ------------------------------------------------------------ - procedure InitSeed (I : integer ) is - ------------------------------------------------------------ - begin - RV.InitSeed(I) ; - RvSeedInit := TRUE ; - end procedure InitSeed ; - - ------------------------------------------------------------ - procedure SetSeed (RandomSeedIn : RandomSeedType ) is - ------------------------------------------------------------ - begin - RV.SetSeed(RandomSeedIn) ; - RvSeedInit := TRUE ; - end procedure SetSeed ; - - ------------------------------------------------------------ - impure function GetSeed return RandomSeedType is - ------------------------------------------------------------ - begin - return RV.GetSeed ; - end function GetSeed ; - - ------------------------------------------------------------ - procedure SetReportOptions ( - ------------------------------------------------------------ - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - begin - if WritePassFail /= COV_OPT_INIT_PARM_DETECT then - WritePassFailVar := WritePassFail ; - end if ; - if WriteBinInfo /= COV_OPT_INIT_PARM_DETECT then - WriteBinInfoVar := WriteBinInfo ; - end if ; - if WriteCount /= COV_OPT_INIT_PARM_DETECT then - WriteCountVar := WriteCount ; - end if ; - if WriteAnyIllegal /= COV_OPT_INIT_PARM_DETECT then - WriteAnyIllegalVar := WriteAnyIllegal ; - end if ; - if WritePrefix /= OSVVM_STRING_INIT_PARM_DETECT then - WritePrefixVar.Set(WritePrefix) ; - end if ; - if PassName /= OSVVM_STRING_INIT_PARM_DETECT then - PassNameVar.Set(PassName) ; - end if ; - if FailName /= OSVVM_STRING_INIT_PARM_DETECT then - FailNameVar.Set(FailName) ; - end if ; - end procedure SetReportOptions ; - - - ------------------------------------------------------------ - procedure SetBinSize (NewNumBins : integer) is - -- Sets a CovBin to a particular size - -- Use for small bins to save space or large bins to - -- suppress the resize and copy as a CovBin autosizes. - ------------------------------------------------------------ - variable oldCovBinPtr : CovBinPtrType ; - begin - if CovBinPtr = NULL then - CovBinPtr := new CovBinTempType(1 to NewNumBins) ; - elsif NewNumBins > CovBinPtr'length then - -- make message bigger - oldCovBinPtr := CovBinPtr ; - CovBinPtr := new CovBinTempType(1 to NewNumBins) ; - CovBinPtr.all(1 to NumBins) := oldCovBinPtr.all(1 to NumBins) ; - deallocate(oldCovBinPtr) ; - end if ; - end procedure SetBinSize ; - - ------------------------------------------------------------ - -- pt local - procedure CheckBinValLength( CurBinValLength : integer ; Caller : string ) is - begin - if NumBins = 0 then - BinValLength := CurBinValLength ; -- number of points in cross - else - AlertIf(AlertLogIDVar, BinValLength /= CurBinValLength, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg." & Caller & ":" & - " Cross coverage bins of different dimensions prohibited", FAILURE) ; - end if; - end procedure CheckBinValLength ; - - ------------------------------------------------------------ - -- pt local - impure function NormalizeNumBins( ReqNumBins : integer ) return integer is - variable NormNumBins : integer := MIN_NUM_BINS ; - begin - while NormNumBins < ReqNumBins loop - NormNumBins := NormNumBins + MIN_NUM_BINS ; - end loop ; - return NormNumBins ; - end function NormalizeNumBins ; - - - ------------------------------------------------------------ - -- pt local - procedure GrowBins (ReqNumBins : integer) is - variable oldCovBinPtr : CovBinPtrType ; - variable NewNumBins : integer ; - begin - NewNumBins := NumBins + ReqNumBins ; - if CovBinPtr = NULL then - CovBinPtr := new CovBinTempType(1 to NormalizeNumBins(NewNumBins)) ; - elsif NewNumBins > CovBinPtr'length then - -- make message bigger - oldCovBinPtr := CovBinPtr ; - CovBinPtr := new CovBinTempType(1 to NormalizeNumBins(NewNumBins)) ; - CovBinPtr.all(1 to NumBins) := oldCovBinPtr.all(1 to NumBins) ; - deallocate(oldCovBinPtr) ; - end if ; - end procedure GrowBins ; - - - ------------------------------------------------------------ - -- pt local, called by InsertBin - -- Finds index of bin if it is inside an existing bins - procedure FindBinInside( - BinVal : RangeArrayType ; - Position : out integer ; - FoundInside : out boolean - ) is - begin - Position := NumBins + 1 ; - FoundInside := FALSE ; - FindLoop : for i in NumBins downto 1 loop - -- skip this CovBin if CovPoint is not in it - next FindLoop when not inside(BinVal, CovBinPtr(i).BinVal.all) ; - Position := i ; - FoundInside := TRUE ; - exit ; - end loop ; - end procedure FindBinInside ; - - ------------------------------------------------------------ - -- pt local - -- Inserts values into a new bin. - -- Called by InsertBin - procedure InsertNewBin( - BinVal : RangeArrayType ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - Name : string ; - PercentCov : real := 0.0 - ) is - begin - if (not IsInitialized) then -- VendorCov - if (BinVal'length > 1) then -- Cross Bin -- VendorCov - VendorCovHandleVar := VendorCovCrossCreate(GetCovModelName) ; -- VendorCov - else -- VendorCov - VendorCovHandleVar := VendorCovPointCreate(GetCovModelName); -- VendorCov - end if; -- VendorCov - end if; -- VendorCov - VendorCovBinAdd(VendorCovHandleVar, ToVendorCovBinVal(BinVal), Action, AtLeast, Name) ; -- VendorCov - NumBins := NumBins + 1 ; - CovBinPtr.all(NumBins).BinVal := new RangeArrayType'(BinVal) ; - CovBinPtr.all(NumBins).Action := Action ; - CovBinPtr.all(NumBins).Count := Count ; - CovBinPtr.all(NumBins).AtLeast := AtLeast ; - CovBinPtr.all(NumBins).Weight := Weight ; - CovBinPtr.all(NumBins).Name := new String'(Name) ; - CovBinPtr.all(NumBins).PercentCov := PercentCov ; - CovBinPtr.all(NumBins).OrderCount := 0 ; --- Metrics for evaluating randomization order Temp - end procedure InsertNewBin ; - - - ------------------------------------------------------------ - -- pt local - -- Inserts values into a new bin. - -- Called by InsertBin - procedure MergeBin ( - Position : Natural ; - Count : integer ; - AtLeast : integer ; - Weight : integer - ) is - begin - CovBinPtr.all(Position).Count := CovBinPtr.all(Position).Count + Count ; - CovBinPtr.all(Position).AtLeast := CovBinPtr.all(Position).AtLeast + AtLeast ; - CovBinPtr.all(Position).Weight := CovBinPtr.all(Position).Weight + Weight ; - CovBinPtr.all(Position).PercentCov := - real(CovBinPtr.all(Position).Count)*100.0/maximum(real(CovBinPtr.all(Position).AtLeast), 1.0) ; - end procedure MergeBin ; - - - ------------------------------------------------------------ - -- pt local - -- All insertion comes here - -- Enforces the general insertion use model: - -- Earlier bins supercede later bins - except with COUNT_ALL - -- Add Illegal and Ignore bins first to remove regions of larger count bins - -- Later ignore bins can be used to miss an illegal catch-all - -- Add Illegal bins last as a catch-all to find things that missed other bins - procedure InsertBin( - BinVal : RangeArrayType ; - Action : integer ; - Count : integer ; - AtLeast : integer ; - Weight : integer ; - Name : string ; - PercentCov : real := 0.0 - ) is - variable Position : integer ; - variable FoundInside : boolean ; - begin - if not MergingEnable then - InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; - - else -- handle merging --- future optimization, FindBinInside only checks against Ignore and Illegal bins - FindBinInside(BinVal, Position, FoundInside) ; - - if not FoundInside then - InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; - - elsif Action = COV_COUNT then --- when check only ignore and illegal bins, only action is to drop - if CovBinPtr.all(Position).Action /= COV_COUNT then - null ; -- drop count bin when it is inside a Illegal or Ignore bin - - elsif CovBinPtr.all(Position).BinVal.all = BinVal and CovBinPtr.all(Position).Name.all = Name then - -- Bins match, so merge the count values - MergeBin (Position, Count, AtLeast, Weight) ; - else - -- Bins overlap, but do not match, insert new bin - InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; - end if; - - elsif Action = COV_IGNORE then --- when check only ignore and illegal bins, only action is to report error - if CovBinPtr.all(Position).Action = COV_COUNT then - InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; - else - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.InsertBin (AddBins/AddCross):" & - " ignore bin dropped. It is a subset of prior bin", ERROR) ; - end if; - - elsif Action = COV_ILLEGAL then --- when check only ignore and illegal bins, only action is to report error - if CovBinPtr.all(Position).Action = COV_COUNT then - InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; - else - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.InsertBin (AddBins/AddCross):" & - " illegal bin dropped. It is a subset of prior bin", ERROR) ; - end if; - end if ; - end if ; -- merging enabled - end procedure InsertBin ; - - - ------------------------------------------------------------ - procedure AddBins ( - ------------------------------------------------------------ - Name : String ; - AtLeast : integer ; - Weight : integer ; - CovBin : CovBinType - ) is - variable calcAtLeast : integer ; - variable calcWeight : integer ; - begin - CheckBinValLength( 1, "AddBins") ; - - GrowBins(CovBin'length) ; - for i in CovBin'range loop - if CovBin(i).Action = COV_COUNT then - calcAtLeast := maximum(AtLeast, CovBin(i).AtLeast) ; - calcWeight := maximum(Weight, CovBin(i).Weight) ; - else - calcAtLeast := 0 ; - calcWeight := 0 ; - end if ; - InsertBin( - BinVal => CovBin(i).BinVal, - Action => CovBin(i).Action, - Count => CovBin(i).Count, - AtLeast => calcAtLeast, - Weight => calcWeight, - Name => Name - ) ; - end loop ; - end procedure AddBins ; - - - ------------------------------------------------------------ - procedure AddBins ( Name : String ; AtLeast : integer ; CovBin : CovBinType ) is - ------------------------------------------------------------ - begin - AddBins(Name, AtLeast, 0, CovBin) ; - end procedure AddBins ; - - - ------------------------------------------------------------ - procedure AddBins (Name : String ; CovBin : CovBinType) is - ------------------------------------------------------------ - begin - AddBins(Name, 0, 0, CovBin) ; - end procedure AddBins ; - - - ------------------------------------------------------------ - procedure AddBins ( AtLeast : integer ; Weight : integer ; CovBin : CovBinType ) is - ------------------------------------------------------------ - begin - AddBins("", AtLeast, Weight, CovBin) ; - end procedure AddBins ; - - - ------------------------------------------------------------ - procedure AddBins ( AtLeast : integer ; CovBin : CovBinType ) is - ------------------------------------------------------------ - begin - AddBins("", AtLeast, 0, CovBin) ; - end procedure AddBins ; - - - ------------------------------------------------------------ - procedure AddBins ( CovBin : CovBinType ) is - ------------------------------------------------------------ - begin - AddBins("", 0, 0, CovBin) ; - end procedure AddBins ; - - - ------------------------------------------------------------ - procedure AddCross( - ------------------------------------------------------------ - Name : string ; - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) is - constant BIN_LENS : integer_vector := - BinLengths( - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 - ) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable calcAction, calcCount, calcAtLeast, calcWeight : integer ; - variable calcBinVal : RangeArrayType(BinIndex'range) ; - begin - CheckBinValLength( BIN_LENS'length, "AddCross") ; - - GrowBins(NUM_NEW_BINS) ; - calcCount := 0 ; - for MatrixIndex in 1 to NUM_NEW_BINS loop - CrossBins := ConcatenateBins(BinIndex, - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 - ) ; - calcAction := MergeState(CrossBins) ; - calcBinVal := MergeBinVal(CrossBins) ; - calcAtLeast := MergeAtLeast( calcAction, AtLeast, CrossBins) ; - calcWeight := MergeWeight ( calcAction, Weight, CrossBins) ; - InsertBin(calcBinVal, calcAction, calcCount, calcAtLeast, calcWeight, Name) ; - IncBinIndex( BinIndex, BIN_LENS) ; -- increment right most one, then if overflow, increment next - end loop ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross( - ------------------------------------------------------------ - Name : string ; - AtLeast : integer ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) is - begin - AddCross(Name, AtLeast, 0, - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 - ) ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross( - ------------------------------------------------------------ - Name : string ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) is - begin - AddCross(Name, 0, 0, - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 - ) ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross( - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) is - begin - AddCross("", AtLeast, Weight, - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 - ) ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross( - ------------------------------------------------------------ - AtLeast : integer ; - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) is - begin - AddCross("", AtLeast, 0, - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 - ) ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross( - ------------------------------------------------------------ - Bin1, Bin2 : CovBinType ; - Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, - Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN - ) is - begin - AddCross("", 0, 0, - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, - Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 - ) ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure Deallocate is - ------------------------------------------------------------ - begin - for i in 1 to NumBins loop - deallocate(CovBinPtr(i).BinVal) ; - deallocate(CovBinPtr(i).Name) ; - end loop ; - deallocate(CovBinPtr) ; - DeallocateName ; - DeallocateMessage ; - -- Restore internal variables to their default values - NumBins := 0 ; - OrderCount := 0 ; - BinValLength := 1 ; - IllegalMode := ILLEGAL_ON ; - WeightMode := AT_LEAST ; - WeightScale := 1.0 ; - ThresholdingEnable := FALSE ; - CovThreshold := 45.0 ; - CovTarget := 100.0 ; - MergingEnable := FALSE ; - CountMode := COUNT_FIRST ; - AlertLogIDVar := OSVVM_ALERTLOG_ID ; - -- RvSeedInit := FALSE ; - WritePassFailVar := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfoVar := COV_OPT_INIT_PARM_DETECT ; - WriteCountVar := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegalVar := COV_OPT_INIT_PARM_DETECT ; - WritePrefixVar.deallocate ; - PassNameVar.deallocate ; - FailNameVar.deallocate ; - end procedure deallocate ; - - - ------------------------------------------------------------ - -- Local - procedure ICoverIndex( Index : integer ; CovPoint : integer_vector ) is - ------------------------------------------------------------ - variable buf : line ; - begin - -- Update Count, PercentCov - CovBinPtr(Index).Count := CovBinPtr(Index).Count + CovBinPtr(Index).action ; - VendorCovBinInc(VendorCovHandleVar, Index); -- VendorCov - CovBinPtr(Index).PercentCov := real(CovBinPtr(Index).Count)*100.0/maximum(real(CovBinPtr(Index).AtLeast), 1.0) ; - -- OrderCount handling - Statistics - OrderCount := OrderCount + 1 ; - CovBinPtr(Index).OrderCount := OrderCount + CovBinPtr(Index).OrderCount ; - if CovBinPtr(Index).action = COV_ILLEGAL then - if IllegalMode /= ILLEGAL_OFF then - if CovPoint = NULL_INTV then - alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.ICoverLast:" & - " Value randomized is in an illegal bin.", IllegalModeLevel) ; - else - write(buf, CovPoint) ; - alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.ICover:" & - " Value " & buf.all & " is in an illegal bin.", IllegalModeLevel) ; - deallocate(buf) ; - end if ; - else - IncAlertCount(AlertLogIDVar, ERROR) ; -- silent alert. - end if ; - end if ; - end procedure ICoverIndex ; - - - ------------------------------------------------------------ - procedure ICoverLast is - ------------------------------------------------------------ - begin - ICoverIndex(LastIndex, NULL_INTV) ; - end procedure ICoverLast ; - - - ------------------------------------------------------------ - procedure ICover ( CovPoint : integer) is - ------------------------------------------------------------ - begin - ICover((1=> CovPoint)) ; - end procedure ICover ; - - - ------------------------------------------------------------ - procedure ICover( CovPoint : integer_vector) is - ------------------------------------------------------------ - begin - if CovPoint'length /= BinValLength then - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg." & - " ICover: CovPoint length = " & to_string(CovPoint'length) & - " does not match Coverage Bin dimensions = " & to_string(BinValLength), FAILURE) ; - elsif CountMode = COUNT_FIRST and inside(CovPoint, CovBinPtr(LastIndex).BinVal.all) then - ICoverIndex(LastIndex, CovPoint) ; - else - CovLoop : for i in 1 to NumBins loop - -- skip this CovBin if CovPoint is not in it - next CovLoop when not inside(CovPoint, CovBinPtr(i).BinVal.all) ; - -- Mark Covered - ICoverIndex(i, CovPoint) ; - exit CovLoop when CountMode = COUNT_FIRST ; -- only find first one - end loop CovLoop ; - end if ; - end procedure ICover ; - - - ------------------------------------------------------------ - procedure ClearCov is - ------------------------------------------------------------ - begin - for i in 1 to NumBins loop - CovBinPtr(i).Count := 0 ; - CovBinPtr(i).PercentCov := 0.0 ; - CovBinPtr(i).OrderCount := 0 ; - end loop ; - OrderCount := 0 ; - end procedure ClearCov ; - - ------------------------------------------------------------ - -- deprecated - procedure SetCovZero is - ------------------------------------------------------------ - begin - ClearCov ; - end procedure SetCovZero ; - - ------------------------------------------------------------ - impure function IsInitialized return boolean is - ------------------------------------------------------------ - begin - return NumBins > 0 ; - end function IsInitialized ; - - - ------------------------------------------------------------ - impure function GetNumBins return integer is - ------------------------------------------------------------ - begin - return NumBins ; - end function GetNumBins ; - - - ------------------------------------------------------------ - impure function GetMinIndex return integer is - ------------------------------------------------------------ - variable MinCov : real := real'right ; -- big number - variable MinIndex : integer := NumBins ; - begin - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < MinCov then - MinCov := CovBinPtr(i).PercentCov ; - MinIndex := i ; - end if ; - end loop CovLoop ; - return MinIndex ; - end function GetMinIndex ; - - - ------------------------------------------------------------ - impure function GetMinCov return real is - ------------------------------------------------------------ - variable MinCov : real := real'right ; -- big number - begin - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < MinCov then - MinCov := CovBinPtr(i).PercentCov ; - end if ; - end loop CovLoop ; - return MinCov ; - end function GetMinCov ; - - - ------------------------------------------------------------ - impure function GetMinCount return integer is - ------------------------------------------------------------ - variable MinCount : integer := integer'right ; -- big number - begin - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < MinCount then - MinCount := CovBinPtr(i).Count ; - end if ; - end loop CovLoop ; - return MinCount ; - end function GetMinCount ; - - - ------------------------------------------------------------ - impure function GetMaxIndex return integer is - ------------------------------------------------------------ - variable MaxCov : real := 0.0 ; - variable MaxIndex : integer := NumBins ; - begin - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov > MaxCov then - MaxCov := CovBinPtr(i).PercentCov ; - MaxIndex := i ; - end if ; - end loop CovLoop ; - return MaxIndex ; - end function GetMaxIndex ; - - - ------------------------------------------------------------ - impure function GetMaxCov return real is - ------------------------------------------------------------ - variable MaxCov : real := 0.0 ; - begin - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov > MaxCov then - MaxCov := CovBinPtr(i).PercentCov ; - end if ; - end loop CovLoop ; - return MaxCov ; - end function GetMaxCov ; - - - ------------------------------------------------------------ - impure function GetMaxCount return integer is - ------------------------------------------------------------ - variable MaxCount : integer := 0 ; - begin - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count > MaxCount then - MaxCount := CovBinPtr(i).Count ; - end if ; - end loop CovLoop ; - return MaxCount ; - end function GetMaxCount ; - - - ------------------------------------------------------------ - impure function CountCovHoles ( PercentCov : real ) return integer is - ------------------------------------------------------------ - variable HoleCount : integer := 0 ; - begin - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < PercentCov then - HoleCount := HoleCount + 1 ; - end if ; - end loop CovLoop ; - return HoleCount ; - end function CountCovHoles ; - - - ------------------------------------------------------------ - impure function CountCovHoles return integer is - ------------------------------------------------------------ - begin - return CountCovHoles(CovTarget) ; - end function CountCovHoles ; - - - ------------------------------------------------------------ - impure function IsCovered ( PercentCov : real ) return boolean is - ------------------------------------------------------------ - begin - -- AlertIf(NumBins < 1, OSVVM_ALERTLOG_ID, "CoveragePkg.IsCovered: Empty Coverage Model", failure) ; - return CountCovHoles(PercentCov) = 0 ; - end function IsCovered ; - - - ------------------------------------------------------------ - impure function IsCovered return boolean is - ------------------------------------------------------------ - begin - -- AlertIf(NumBins < 1, OSVVM_ALERTLOG_ID, "CoveragePkg.IsCovered: Empty Coverage Model", failure) ; - return CountCovHoles(CovTarget) = 0 ; - end function IsCovered ; - - - ------------------------------------------------------------ - impure function GetCov ( PercentCov : real ) return real is - ------------------------------------------------------------ - variable TotalCovGoal, TotalCovCount, ScaledCovGoal : integer := 0 ; - begin - BinLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT then - ScaledCovGoal := integer(ceil(PercentCov * real(CovBinPtr(i).AtLeast)/100.0)) ; - TotalCovGoal := TotalCovGoal + ScaledCovGoal ; - if CovBinPtr(i).Count <= ScaledCovGoal then - TotalCovCount := TotalCovCount + CovBinPtr(i).Count ; - else - -- do not count the extra values that exceed their cov goal - TotalCovCount := TotalCovCount + ScaledCovGoal ; - end if ; - end if ; - end loop BinLoop ; - return 100.0 * real(TotalCovCount) / real(TotalCovGoal) ; - end function GetCov ; - - - ------------------------------------------------------------ - impure function GetCov return real is - ------------------------------------------------------------ - variable TotalCovGoal, TotalCovCount : integer := 0 ; - begin - return GetCov( CovTarget ) ; - end function GetCov ; - - - ------------------------------------------------------------ - impure function GetItemCount return integer is - ------------------------------------------------------------ - begin - return ItemCount ; - end function GetItemCount ; - - - ------------------------------------------------------------ - impure function GetTotalCovGoal ( PercentCov : real ) return integer is - ------------------------------------------------------------ - variable TotalCovGoal, ScaledCovGoal : integer := 0 ; - begin - BinLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT then - ScaledCovGoal := integer(ceil(PercentCov * real(CovBinPtr(i).AtLeast)/100.0)) ; - TotalCovGoal := TotalCovGoal + ScaledCovGoal ; - end if ; - end loop BinLoop ; - return TotalCovGoal ; - end function GetTotalCovGoal ; - - - ------------------------------------------------------------ - impure function GetTotalCovGoal return integer is - ------------------------------------------------------------ - begin - return GetTotalCovGoal(CovTarget) ; - end function GetTotalCovGoal ; - - - ------------------------------------------------------------ - impure function GetLastIndex return integer is - ------------------------------------------------------------ - begin - return LastIndex ; - end function GetLastIndex ; - - - ------------------------------------------------------------ - impure function GetHoleBinVal ( ReqHoleNum : integer ; PercentCov : real ) return RangeArrayType is - ------------------------------------------------------------ - variable HoleCount : integer := 0 ; - variable buf : line ; - begin - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < PercentCov then - HoleCount := HoleCount + 1 ; - if HoleCount = ReqHoleNum then - return CovBinPtr(i).BinVal.all ; - end if ; - end if ; - end loop CovLoop ; - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.GetHoleBinVal:" & - " did not find a coverage hole. HoleCount = " & integer'image(HoleCount) & - " ReqHoleNum = " & integer'image(ReqHoleNum), ERROR - ) ; - return CovBinPtr(NumBins).BinVal.all ; - - end function GetHoleBinVal ; - - ------------------------------------------------------------ - impure function GetHoleBinVal ( PercentCov : real ) return RangeArrayType is - ------------------------------------------------------------ - begin - return GetHoleBinVal(1, PercentCov) ; - end function GetHoleBinVal ; - - - ------------------------------------------------------------ - impure function GetHoleBinVal ( ReqHoleNum : integer := 1 ) return RangeArrayType is - ------------------------------------------------------------ - begin - return GetHoleBinVal(ReqHoleNum, CovTarget) ; - end function GetHoleBinVal ; - - - ------------------------------------------------------------ - impure function CalcWeight ( BinIndex : integer ; MaxCovPercent : real ) return integer is - -- pt local - ------------------------------------------------------------ - begin - case WeightMode is - when AT_LEAST => -- AtLeast - return CovBinPtr(BinIndex).AtLeast ; - - when WEIGHT => -- Weight - return CovBinPtr(BinIndex).Weight ; - - when REMAIN => -- (Adjust * AtLeast) - Count - return integer( Ceil( MaxCovPercent * real(CovBinPtr(BinIndex).AtLeast)/100.0)) - - CovBinPtr(BinIndex).Count ; - - when REMAIN_EXP => -- Weight * (REMAIN **WeightScale) - -- Experimental may be removed --- CAUTION: for large numbers and/or WeightScale > 2.0, result can be > 2**31 (max integer value) - -- both Weight and WeightScale default to 1 - return CovBinPtr(BinIndex).Weight * - integer( Ceil ( - ( (MaxCovPercent * real(CovBinPtr(BinIndex).AtLeast)/100.0) - - real(CovBinPtr(BinIndex).Count) ) ** WeightScale ) ); - - when REMAIN_SCALED => -- (WeightScale * Adjust * AtLeast) - Count - -- Experimental may be removed - -- Biases remainder toward AT_LEAST value. - -- WeightScale must be > 1.0 - return integer( Ceil( WeightScale * MaxCovPercent * real(CovBinPtr(BinIndex).AtLeast)/100.0)) - - CovBinPtr(BinIndex).Count ; - - when REMAIN_WEIGHT => -- Weight * ((WeightScale * Adjust * AtLeast) - Count) - -- Experimental may be removed - -- WeightScale must be > 1.0 - return CovBinPtr(BinIndex).Weight * ( - integer( Ceil( WeightScale * MaxCovPercent * real(CovBinPtr(BinIndex).AtLeast)/100.0)) - - CovBinPtr(BinIndex).Count) ; - - end case ; - end function CalcWeight ; - - - ------------------------------------------------------------ - impure function RandHoleIndex ( CovTargetPercent : real ) return integer is - -- pt local - ------------------------------------------------------------ - variable WeightVec : integer_vector(0 to NumBins-1) ; -- Prep for change to DistInt - variable MaxCovPercent : real ; - variable MinCovPercent : real ; - begin - ItemCount := ItemCount + 1 ; - MinCovPercent := GetMinCov ; - if ThresholdingEnable then - MaxCovPercent := MinCovPercent + CovThreshold ; - if MinCovPercent < CovTargetPercent then - -- Clip at CovTargetPercent until reach CovTargetPercent - MaxCovPercent := minimum(MaxCovPercent, CovTargetPercent); - end if ; - else - if MinCovPercent < CovTargetPercent then - MaxCovPercent := CovTargetPercent ; - else - -- Done, Enable all bins - MaxCovPercent := GetMaxCov + 1.0 ; - -- MaxCovPercent := real'right ; -- weight scale issues - end if ; - end if ; - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < MaxCovPercent then - -- Calculate Weight based on WeightMode - -- Scale to current percentage goal: MaxCov which can be < or > 100.0 - WeightVec(i-1) := CalcWeight(i, MaxCovPercent) ; - else - WeightVec(i-1) := 0 ; - end if ; - end loop CovLoop ; - -- DistInt returns integer range 0 to Numbins-1 - -- Caution: DistInt can fail when sum(WeightVec) > 2**31 - -- See notes in CalcWeight for REMAIN_EXP - LastIndex := 1 + RV.DistInt( WeightVec ) ; -- return range 1 to NumBins - return LastIndex ; - end function RandHoleIndex ; - - - ------------------------------------------------------------ - impure function GetBinVal ( BinIndex : integer ) return RangeArrayType is - ------------------------------------------------------------ - begin - return CovBinPtr( BinIndex ).BinVal.all ; - end function GetBinVal ; - - - ------------------------------------------------------------ - impure function GetLastBinVal return RangeArrayType is - ------------------------------------------------------------ - begin - return CovBinPtr( LastIndex ).BinVal.all ; - end function GetLastBinVal ; - - - ------------------------------------------------------------ - impure function RandCovBinVal ( PercentCov : real ) return RangeArrayType is - ------------------------------------------------------------ - begin - return CovBinPtr( RandHoleIndex(PercentCov) ).BinVal.all ; -- GetBinVal - end function RandCovBinVal ; - - - ------------------------------------------------------------ - impure function RandCovBinVal return RangeArrayType is - ------------------------------------------------------------ - begin - -- use global coverage target - return CovBinPtr( RandHoleIndex( CovTarget ) ).BinVal.all ; -- GetBinVal - end function RandCovBinVal ; - - - ------------------------------------------------------------ - impure function GetMinBinVal return RangeArrayType is - ------------------------------------------------------------ - begin - -- use global coverage target - return GetBinVal( GetMinIndex ) ; - end function GetMinBinVal ; - - - ------------------------------------------------------------ - impure function GetMaxBinVal return RangeArrayType is - ------------------------------------------------------------ - begin - -- use global coverage target - return GetBinVal( GetMaxIndex ) ; - end function GetMaxBinVal ; - - - ------------------------------------------------------------ --- impure function RandCovPoint( BinVal : RangeArrayType ) return integer_vector is - impure function ToRandPoint( BinVal : RangeArrayType ) return integer_vector is - -- pt local - ------------------------------------------------------------ - variable CovPoint : integer_vector(BinVal'range) ; - variable normCovPoint : integer_vector(1 to BinVal'length) ; - begin - for i in BinVal'range loop - CovPoint(i) := RV.RandInt(BinVal(i).min, BinVal(i).max) ; - end loop ; - normCovPoint := CovPoint ; - return normCovPoint ; - end function ToRandPoint ; - - - ------------------------------------------------------------ - impure function ToRandPoint( BinVal : RangeArrayType ) return integer is - -- pt local - ------------------------------------------------------------ - begin - return RV.RandInt(BinVal(BinVal'left).min, BinVal(BinVal'left).max) ; - end function ToRandPoint ; - - - ------------------------------------------------------------ - impure function RandCovPoint return integer is - ------------------------------------------------------------ - begin - return ToRandPoint(RandCovBinVal(CovTarget)) ; - end function RandCovPoint ; - - - ------------------------------------------------------------ - impure function RandCovPoint ( PercentCov : real ) return integer is - ------------------------------------------------------------ - begin - return ToRandPoint(RandCovBinVal(PercentCov)) ; - end function RandCovPoint ; - - - ------------------------------------------------------------ - impure function RandCovPoint return integer_vector is - ------------------------------------------------------------ - begin - return ToRandPoint(RandCovBinVal(CovTarget)) ; - end function RandCovPoint ; - - - ------------------------------------------------------------ - impure function RandCovPoint ( PercentCov : real ) return integer_vector is - ------------------------------------------------------------ - begin - return ToRandPoint(RandCovBinVal(PercentCov)) ; - end function RandCovPoint ; - - - ------------------------------------------------------------ - impure function GetPoint ( BinIndex : integer ) return integer is - ------------------------------------------------------------ - begin - return ToRandPoint(GetBinVal(BinIndex)) ; - end function GetPoint ; - - - ------------------------------------------------------------ - impure function GetPoint ( BinIndex : integer ) return integer_vector is - ------------------------------------------------------------ - begin - return ToRandPoint(GetBinVal(BinIndex)) ; - end function GetPoint ; - - - ------------------------------------------------------------ - impure function GetMinPoint return integer is - ------------------------------------------------------------ - begin - return ToRandPoint(GetBinVal( GetMinIndex )) ; - end function GetMinPoint ; - - - ------------------------------------------------------------ - impure function GetMinPoint return integer_vector is - ------------------------------------------------------------ - begin - return ToRandPoint(GetBinVal( GetMinIndex )) ; - end function GetMinPoint ; - - - ------------------------------------------------------------ - impure function GetMaxPoint return integer is - ------------------------------------------------------------ - begin - return ToRandPoint(GetBinVal( GetMaxIndex )) ; - end function GetMaxPoint ; - - - ------------------------------------------------------------ - impure function GetMaxPoint return integer_vector is - ------------------------------------------------------------ - begin - return ToRandPoint(GetBinVal( GetMaxIndex )) ; - end function GetMaxPoint ; - - - -- ------------------------------------------------------------ - -- Intended as a stand in until we get a more general GetBin - impure function GetBinInfo ( BinIndex : integer ) return CovBinBaseType is - -- ------------------------------------------------------------ - variable result : CovBinBaseType ; - begin - result.BinVal := ALL_RANGE; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBinInfo ; - - - -- ------------------------------------------------------------ - -- Intended as a stand in until we get a more general GetBin - impure function GetBinValLength return integer is - -- ------------------------------------------------------------ - begin - return BinValLength ; - end function GetBinValLength ; - - --- Eventually the multiple GetBin functions will be replaced by a --- a single GetBin that returns CovBinBaseType with BinVal as an --- unconstrained element - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovBinBaseType is - -- ------------------------------------------------------------ - variable result : CovBinBaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovMatrix2BaseType is - -- ------------------------------------------------------------ - variable result : CovMatrix2BaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovMatrix3BaseType is - -- ------------------------------------------------------------ - variable result : CovMatrix3BaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovMatrix4BaseType is - -- ------------------------------------------------------------ - variable result : CovMatrix4BaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovMatrix5BaseType is - -- ------------------------------------------------------------ - variable result : CovMatrix5BaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovMatrix6BaseType is - -- ------------------------------------------------------------ - variable result : CovMatrix6BaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovMatrix7BaseType is - -- ------------------------------------------------------------ - variable result : CovMatrix7BaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovMatrix8BaseType is - -- ------------------------------------------------------------ - variable result : CovMatrix8BaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - - -- ------------------------------------------------------------ - impure function GetBin ( BinIndex : integer ) return CovMatrix9BaseType is - -- ------------------------------------------------------------ - variable result : CovMatrix9BaseType ; - begin - result.BinVal := CovBinPtr(BinIndex).BinVal.all; - result.Action := CovBinPtr(BinIndex).Action; - result.Count := CovBinPtr(BinIndex).Count; - result.AtLeast := CovBinPtr(BinIndex).AtLeast; - result.Weight := CovBinPtr(BinIndex).Weight; - return result ; - end function GetBin ; - - -- ------------------------------------------------------------ - impure function GetBinName ( BinIndex : integer; DefaultName : string := "" ) return string is - -- ------------------------------------------------------------ - begin - if CovBinPtr(BinIndex).Name.all /= "" then - return CovBinPtr(BinIndex).Name.all ; - else - return DefaultName ; - end if; - end function GetBinName; - - ------------------------------------------------------------ - -- pt local for now -- file formal parameter not allowed with method - procedure WriteBin ( - file f : text ; - WritePassFail : CovOptionsType ; - WriteBinInfo : CovOptionsType ; - WriteCount : CovOptionsType ; - WriteAnyIllegal : CovOptionsType ; - WritePrefix : string ; - PassName : string ; - FailName : string - ) is - ------------------------------------------------------------ - variable buf : line ; - begin - if NumBins < 1 then - if WriteBinFileInit or UsingLocalFile then - swrite(buf, WritePrefix & " " & FailName & " ") ; - swrite(buf, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteBin: Coverage model is empty. Nothing to print.") ; - writeline(f, buf) ; - end if ; - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteBin:" & - " Coverage model is empty. Nothing to print.", FAILURE) ; - return ; - end if ; - -- Models with Bins - WriteBinName(f, "WriteBin: ", WritePrefix) ; - for i in 1 to NumBins loop -- CovBinPtr.all'range - if CovBinPtr(i).action = COV_COUNT or - (CovBinPtr(i).action = COV_ILLEGAL and IsEnabled(WriteAnyIllegal)) or - CovBinPtr(i).count < 0 -- Illegal bin with errors - then - -- WriteBin Info - swrite(buf, WritePrefix) ; - if CovBinPtr(i).Name.all /= "" then - swrite(buf, CovBinPtr(i).Name.all & " ") ; - end if ; - if IsEnabled(WritePassFail) then - -- For illegal bins, AtLeast = 0 and count is negative. - if CovBinPtr(i).count >= CovBinPtr(i).AtLeast then - swrite(buf, PassName & ' ') ; - else - swrite(buf, FailName & ' ') ; - end if ; - end if ; - if IsEnabled(WriteBinInfo) then - if CovBinPtr(i).action = COV_COUNT then - swrite(buf, "Bin:") ; - else - swrite(buf, "Illegal Bin:") ; - end if; - write(buf, CovBinPtr(i).BinVal.all) ; - end if ; - if IsEnabled(WriteCount) then - write(buf, " Count = " & integer'image(abs(CovBinPtr(i).count))) ; - write(buf, " AtLeast = " & integer'image(CovBinPtr(i).AtLeast)) ; - if WeightMode = WEIGHT or WeightMode = REMAIN_WEIGHT then - -- Print Weight only when it is used - write(buf, " Weight = " & integer'image(CovBinPtr(i).Weight)) ; - end if ; - end if ; - writeline(f, buf) ; - end if ; - end loop ; - swrite(buf, "") ; - writeline(f, buf) ; - end procedure WriteBin ; - - ------------------------------------------------------------ - procedure WriteBin ( - ------------------------------------------------------------ - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - constant rWritePassFail : CovOptionsType := ResolveCovWritePassFail(WritePassFail, WritePassFailVar) ; - constant rWriteBinInfo : CovOptionsType := ResolveCovWriteBinInfo(WriteBinInfo, WriteBinInfoVar ) ; - constant rWriteCount : CovOptionsType := ResolveCovWriteCount(WriteCount, WriteCountVar ) ; - constant rWriteAnyIllegal : CovOptionsType := ResolveCovWriteAnyIllegal(WriteAnyIllegal, WriteAnyIllegalVar) ; - constant rWritePrefix : string := ResolveOsvvmWritePrefix(WritePrefix, WritePrefixVar.GetOpt) ; - constant rPassName : string := ResolveOsvvmPassName(PassName, PassNameVar.GetOpt ) ; - constant rFailName : string := ResolveOsvvmFailName(FailName, FailNameVar.GetOpt ) ; - begin - if WriteBinFileInit then - -- Write to Local WriteBinFile - Deprecated, recommend use TranscriptFile instead - WriteBin ( - f => WriteBinFile, - WritePassFail => rWritePassFail, - WriteBinInfo => rWriteBinInfo, - WriteCount => rWriteCount, - WriteAnyIllegal => rWriteAnyIllegal, - WritePrefix => rWritePrefix, - PassName => rPassName, - FailName => rFailName - ) ; - elsif IsTranscriptEnabled then - -- Write to TranscriptFile - WriteBin ( - f => TranscriptFile, - WritePassFail => rWritePassFail, - WriteBinInfo => rWriteBinInfo, - WriteCount => rWriteCount, - WriteAnyIllegal => rWriteAnyIllegal, - WritePrefix => rWritePrefix, - PassName => rPassName, - FailName => rFailName - ) ; - if IsTranscriptMirrored then - -- Mirrored to OUTPUT - WriteBin ( - f => OUTPUT, - WritePassFail => rWritePassFail, - WriteBinInfo => rWriteBinInfo, - WriteCount => rWriteCount, - WriteAnyIllegal => rWriteAnyIllegal, - WritePrefix => rWritePrefix, - PassName => rPassName, - FailName => rFailName - ) ; - end if ; - else - -- Default Write to OUTPUT - WriteBin ( - f => OUTPUT, - WritePassFail => rWritePassFail, - WriteBinInfo => rWriteBinInfo, - WriteCount => rWriteCount, - WriteAnyIllegal => rWriteAnyIllegal, - WritePrefix => rWritePrefix, - PassName => rPassName, - FailName => rFailName - ) ; - end if ; - - end procedure WriteBin ; - - - ------------------------------------------------------------ - procedure WriteBin ( -- With LogLevel - ------------------------------------------------------------ - LogLevel : LogType ; - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - WriteBin ( - WritePassFail => WritePassFail, - WriteBinInfo => WriteBinInfo, - WriteCount => WriteCount, - WriteAnyIllegal => WriteAnyIllegal, - WritePrefix => WritePrefix, - PassName => PassName, - FailName => FailName - ) ; - end if ; - end procedure WriteBin ; -- With LogLevel - - - ------------------------------------------------------------ - procedure WriteBin ( - ------------------------------------------------------------ - FileName : string; - OpenKind : File_Open_Kind := APPEND_MODE ; - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - file LocalWriteBinFile : text open OpenKind is FileName ; - constant rWritePassFail : CovOptionsType := ResolveCovWritePassFail(WritePassFail, WritePassFailVar) ; - constant rWriteBinInfo : CovOptionsType := ResolveCovWriteBinInfo(WriteBinInfo, WriteBinInfoVar ) ; - constant rWriteCount : CovOptionsType := ResolveCovWriteCount(WriteCount, WriteCountVar ) ; - constant rWriteAnyIllegal : CovOptionsType := ResolveCovWriteAnyIllegal(WriteAnyIllegal, WriteAnyIllegalVar) ; - constant rWritePrefix : string := ResolveOsvvmWritePrefix(WritePrefix, WritePrefixVar.GetOpt) ; - constant rPassName : string := ResolveOsvvmPassName(PassName, PassNameVar.GetOpt ) ; - constant rFailName : string := ResolveOsvvmFailName(FailName, FailNameVar.GetOpt ) ; - begin - UsingLocalFile := TRUE ; - WriteBin ( - f => LocalWriteBinFile, - WritePassFail => rWritePassFail, - WriteBinInfo => rWriteBinInfo, - WriteCount => rWriteCount, - WriteAnyIllegal => rWriteAnyIllegal, - WritePrefix => rWritePrefix, - PassName => rPassName, - FailName => rFailName - ); - UsingLocalFile := FALSE ; - end procedure WriteBin ; - - - ------------------------------------------------------------ - procedure WriteBin ( -- With LogLevel - ------------------------------------------------------------ - LogLevel : LogType ; - FileName : string; - OpenKind : File_Open_Kind := APPEND_MODE ; - WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; - WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - UsingLocalFile := TRUE ; - WriteBin ( - FileName => FileName, - OpenKind => OpenKind, - WritePassFail => WritePassFail, - WriteBinInfo => WriteBinInfo, - WriteCount => WriteCount, - WriteAnyIllegal => WriteAnyIllegal, - WritePrefix => WritePrefix, - PassName => PassName, - FailName => FailName - ) ; - UsingLocalFile := FALSE ; - end if ; - end procedure WriteBin ; -- With LogLevel - - - ------------------------------------------------------------ - -- Development only - -- pt local for now -- file formal parameter not allowed with method - procedure DumpBin ( file f : text ) is - ------------------------------------------------------------ - variable buf : line ; - begin - WriteBinName(f, "DumpBin: ") ; - -- if NumBins < 1 then - -- Write(f, "%%FATAL, Coverage Model is empty. Nothing to print." & LF ) ; - -- end if ; - for i in 1 to NumBins loop -- CovBinPtr.all'range - swrite(buf, "%% ") ; - if CovBinPtr(i).Name.all /= "" then - swrite(buf, CovBinPtr(i).Name.all & " ") ; - end if ; - swrite(buf, "Bin:") ; - write(buf, CovBinPtr(i).BinVal.all) ; - case CovBinPtr(i).action is - when COV_COUNT => swrite(buf, " Count = ") ; - when COV_IGNORE => swrite(buf, " Ignore = ") ; - when COV_ILLEGAL => swrite(buf, " Illegal = ") ; - when others => swrite(buf, " BOGUS BOGUS BOGUS = ") ; - end case ; - write(buf, CovBinPtr(i).count) ; - -- write(f, " Count = " & integer'image(CovBinPtr(i).count)) ; - write(buf, " AtLeast = " & integer'image(CovBinPtr(i).AtLeast)) ; - write(buf, " Weight = " & integer'image(CovBinPtr(i).Weight)) ; - write(buf, " OrderCount = " & integer'image(CovBinPtr(i).OrderCount)) ; - if CovBinPtr(i).count > 0 then - write(buf, " Normalized OrderCount = " & integer'image(CovBinPtr(i).OrderCount/CovBinPtr(i).count)) ; - end if ; - writeline(f, buf) ; - end loop ; - swrite(buf, "") ; - writeline(f,buf) ; - end procedure DumpBin ; - - - ------------------------------------------------------------ - procedure DumpBin (LogLevel : LogType := DEBUG) is - ------------------------------------------------------------ - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - if WriteBinFileInit then - -- Write to Local WriteBinFile - Deprecated, recommend use TranscriptFile instead - DumpBin(WriteBinFile) ; - elsif IsTranscriptEnabled then - -- Write to TranscriptFile - DumpBin(TranscriptFile) ; - if IsTranscriptMirrored then - -- Mirrored to OUTPUT - DumpBin(OUTPUT) ; - end if ; - else - -- Default Write to OUTPUT - DumpBin(OUTPUT) ; - end if ; - end if ; - end procedure DumpBin ; - - - ------------------------------------------------------------ - -- pt local - procedure WriteCovHoles ( file f : text; PercentCov : real := 100.0 ) is - ------------------------------------------------------------ - variable buf : line ; - begin - if NumBins < 1 then - if WriteBinFileInit or UsingLocalFile then - -- Duplicate Alert in specified file - swrite(buf, "%% Alert FAILURE " & GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteCovHoles:" & - " coverage model empty. Nothing to print.") ; - writeline(f, buf) ; - end if ; - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteCovHoles:" & - " coverage model empty. Nothing to print.", FAILURE) ; - return ; - end if ; - -- Models with Bins - WriteBinName(f, "WriteCovHoles: ") ; - CovLoop : for i in 1 to NumBins loop - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < PercentCov then - swrite(buf, "%% ") ; - if CovBinPtr(i).Name.all /= "" then - swrite(buf, CovBinPtr(i).Name.all & " ") ; - end if ; - swrite(buf, "Bin:") ; - write(buf, CovBinPtr(i).BinVal.all) ; - write(buf, " Count = " & integer'image(CovBinPtr(i).Count)) ; - write(buf, " AtLeast = " & integer'image(CovBinPtr(i).AtLeast)) ; - if WeightMode = WEIGHT or WeightMode = REMAIN_WEIGHT then - -- Print Weight only when it is used - write(buf, " Weight = " & integer'image(CovBinPtr(i).Weight)) ; - end if ; - writeline(f, buf) ; - end if ; - end loop CovLoop ; - swrite(buf, "") ; - writeline(f, buf) ; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - procedure WriteCovHoles ( PercentCov : real ) is - ------------------------------------------------------------ - begin - if WriteBinFileInit then - -- Write to Local WriteBinFile - Deprecated, recommend use TranscriptFile instead - WriteCovHoles(WriteBinFile, PercentCov) ; - elsif IsTranscriptEnabled then - -- Write to TranscriptFile - WriteCovHoles(TranscriptFile, PercentCov) ; - if IsTranscriptMirrored then - -- Mirrored to OUTPUT - WriteCovHoles(OUTPUT, PercentCov) ; - end if ; - else - -- Default Write to OUTPUT - WriteCovHoles(OUTPUT, PercentCov) ; - end if; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - procedure WriteCovHoles ( LogLevel : LogType := ALWAYS ) is - ------------------------------------------------------------ - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - WriteCovHoles(CovTarget) ; - end if; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - procedure WriteCovHoles ( LogLevel : LogType ; PercentCov : real ) is - ------------------------------------------------------------ - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - WriteCovHoles(PercentCov) ; - end if; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - procedure WriteCovHoles ( FileName : string; OpenKind : File_Open_Kind := APPEND_MODE ) is - ------------------------------------------------------------ - file CovHoleFile : text open OpenKind is FileName ; - begin - UsingLocalFile := TRUE ; - WriteCovHoles(CovHoleFile, CovTarget) ; - UsingLocalFile := FALSE ; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; OpenKind : File_Open_Kind := APPEND_MODE ) is - ------------------------------------------------------------ - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - WriteCovHoles(FileName, OpenKind) ; - end if; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - procedure WriteCovHoles ( FileName : string; PercentCov : real ; OpenKind : File_Open_Kind := APPEND_MODE ) is - ------------------------------------------------------------ - file CovHoleFile : text open OpenKind is FileName ; - begin - UsingLocalFile := TRUE ; - WriteCovHoles(CovHoleFile, PercentCov) ; - UsingLocalFile := FALSE ; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; PercentCov : real ; OpenKind : File_Open_Kind := APPEND_MODE ) is - ------------------------------------------------------------ - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - WriteCovHoles(FileName, PercentCov, OpenKind) ; - end if; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - -- pt local - impure function FindExactBin ( - -- find an exact match to a bin wrt BinVal, Action, AtLeast, Weight, and Name - ------------------------------------------------------------ - Merge : boolean ; - BinVal : RangeArrayType ; - Action : integer ; - AtLeast : integer ; - Weight : integer ; - Name : string - ) return integer is - begin - if Merge then - for i in 1 to NumBins loop - if (BinVal = CovBinPtr(i).BinVal.all) and (Action = CovBinPtr(i).Action) and - (AtLeast = CovBinPtr(i).AtLeast) and (Weight = CovBinPtr(i).Weight) and - (Name = CovBinPtr(i).Name.all) then - return i ; - end if; - end loop ; - end if ; - return 0 ; - end function FindExactBin ; - - - ------------------------------------------------------------ - -- pt local - procedure read ( - ------------------------------------------------------------ - buf : inout line ; - NamePtr : inout line ; - NameLength : in integer ; - ReadValid : out boolean - ) is - variable Name : string(1 to NameLength) ; - begin - if NameLength > 0 then - read(buf, Name, ReadValid) ; - NamePtr := new string'(Name) ; - else - ReadValid := TRUE ; - NamePtr := new string'("") ; - end if ; - end procedure read ; - - - ------------------------------------------------------------ - -- pt local - procedure ReadCovVars (file CovDbFile : text; Good : out boolean ) is - ------------------------------------------------------------ - variable buf : line ; - variable Empty : boolean ; - variable MultiLineComment : boolean := FALSE ; - variable ReadValid : boolean ; - variable GoodLoop1 : boolean ; - variable iSeed : RandomSeedType ; - variable iIllegalMode : integer ; - variable iWeightMode : integer ; - variable iWeightScale : real ; - variable iCovThreshold : real ; - variable iCountMode : integer ; - variable iNumberOfMessages : integer ; - variable iThresholdingEnable : boolean ; - variable iCovTarget : real ; - variable iMergingEnable : boolean ; - begin - -- ReadLoop0 : while not EndFile(CovDbFile) loop - ReadLoop0 : loop -- allows emulation of "return when" - -- ReadLine to Get Coverage Model Name, skip blank and comment lines, fails when file empty - exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: No Coverage Data to read", FAILURE) ; - ReadLine(CovDbFile, buf) ; - EmptyOrCommentLine(buf, Empty, MultiLineComment) ; - next when Empty ; - - if buf.all /= "Coverage_Model_Not_Named" then - SetName(buf.all) ; - end if ; - - exit ReadLoop0 ; - end loop ReadLoop0 ; - - - -- ReadLoop1 : while not EndFile(CovDbFile) loop - ReadLoop1 : loop - -- ReadLine to Get Variables, skip blank and comment lines, fails when file empty - exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Coverage DB File Incomplete", FAILURE) ; - ReadLine(CovDbFile, buf) ; - EmptyOrCommentLine(buf, Empty, MultiLineComment) ; - next when Empty ; - - read(buf, iSeed, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading Seed", FAILURE) ; - RV.SetSeed( iSeed ) ; - RvSeedInit := TRUE ; - - read(buf, iCovThreshold, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading CovThreshold", FAILURE) ; - CovThreshold := iCovThreshold ; - - read(buf, iIllegalMode, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading IllegalMode", FAILURE) ; - SetIllegalMode(IllegalModeType'val( iIllegalMode )) ; - - read(buf, iWeightMode, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading WeightMode", FAILURE) ; - WeightMode := WeightModeType'val( iWeightMode ) ; - - read(buf, iWeightScale, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading WeightScale", FAILURE) ; - WeightScale := iWeightScale ; - - read(buf, iCountMode, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading CountMode", FAILURE) ; - CountMode := CountModeType'val( iCountMode ) ; - - read(buf, iThresholdingEnable, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading CountMode", FAILURE) ; - ThresholdingEnable := iThresholdingEnable ; - - read(buf, iCovTarget, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading CountMode", FAILURE) ; - CovTarget := iCovTarget ; - - read(buf, iMergingEnable, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading CountMode", FAILURE) ; - MergingEnable := iMergingEnable ; - - exit ReadLoop1 ; - end loop ReadLoop1 ; - - GoodLoop1 := ReadValid ; - - -- ReadLoop2 : while not EndFile(CovDbFile) loop - ReadLoop2 : while ReadValid loop - -- ReadLine to Coverage Model Header WriteBin Message, skip blank and comment lines, fails when file empty - exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Coverage DB File Incomplete", FAILURE) ; - ReadLine(CovDbFile, buf) ; - EmptyOrCommentLine(buf, Empty, MultiLineComment) ; - next when Empty ; - - read(buf, iNumberOfMessages, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading NumberOfMessages", FAILURE) ; - - for i in 1 to iNumberOfMessages loop - exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: End of File while reading Messages", FAILURE) ; - ReadLine(CovDbFile, buf) ; - SetMessage(buf.all) ; - end loop ; - - exit ReadLoop2 ; - end loop ReadLoop2 ; - - Good := ReadValid and GoodLoop1 ; - end procedure ReadCovVars ; - - - ------------------------------------------------------------ - -- pt local - procedure ReadCovDbInfo ( - ------------------------------------------------------------ - File CovDbFile : text ; - variable NumRangeItems : out integer ; - variable NumLines : out integer ; - variable Good : out boolean - ) is - variable buf : line ; - variable ReadValid : boolean ; - variable Empty : boolean ; - variable MultiLineComment : boolean := FALSE ; - begin - - ReadLoop : loop - -- ReadLine to RangeItems NumLines, skip blank and comment lines, fails when file empty - exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Coverage DB File Incomplete", FAILURE) ; - ReadLine(CovDbFile, buf) ; - EmptyOrCommentLine(buf, Empty, MultiLineComment) ; - next when Empty ; - - read(buf, NumRangeItems, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading NumRangeItems", FAILURE) ; - read(buf, NumLines, ReadValid) ; - exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading NumLines", FAILURE) ; - exit ; - end loop ReadLoop ; - Good := ReadValid ; - end procedure ReadCovDbInfo ; - - - ------------------------------------------------------------ - -- pt local - procedure ReadCovDbDataBase ( - ------------------------------------------------------------ - File CovDbFile : text ; - constant NumRangeItems : in integer ; - constant NumLines : in integer ; - constant Merge : in boolean ; - variable Good : out boolean - ) is - variable buf : line ; - variable Empty : boolean ; - variable MultiLineComment : boolean := FALSE ; - variable ReadValid : boolean ; - -- Format: Action Count min1 max1 min2 max2 .... - variable Action : integer ; - variable Count : integer ; - variable BinVal : RangeArrayType(1 to NumRangeItems) ; - variable index : integer ; - variable AtLeast : integer ; - variable Weight : integer ; - variable PercentCov : real ; - variable NameLength : integer ; - variable SkipBlank : character ; - variable NamePtr : line ; - begin - GrowBins(NumLines) ; - ReadLoop : for i in 1 to NumLines loop - - GetValidLineLoop: loop - exit ReadLoop when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Did not read specified number of lines", FAILURE) ; - ReadLine(CovDbFile, buf) ; - EmptyOrCommentLine(buf, Empty, MultiLineComment) ; - next GetValidLineLoop when Empty ; -- replace with EmptyLine(buf) - exit GetValidLineLoop ; - end loop ; - - read(buf, Action, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading Action", FAILURE) ; - read(buf, Count, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading Count", FAILURE) ; - read(buf, AtLeast, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading AtLeast", FAILURE) ; - read(buf, Weight, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading Weight", FAILURE) ; - read(buf, PercentCov, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading PercentCov", FAILURE) ; - read(buf, BinVal, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading BinVal", FAILURE) ; - read(buf, NameLength, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading Bin Name Length", FAILURE) ; - read(buf, SkipBlank, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading Bin Name Length", FAILURE) ; - read(buf, NamePtr, NameLength, ReadValid) ; - exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.ReadCovDb: Failed while reading Bin Name", FAILURE) ; - index := FindExactBin(Merge, BinVal, Action, AtLeast, Weight, NamePtr.all) ; - if index > 0 then - -- Bin is an exact match so only merge the count values - CovBinPtr(index).Count := CovBinPtr(index).Count + Count ; - CovBinPtr(index).PercentCov := real(CovBinPtr(index).Count)*100.0/maximum(real(CovBinPtr(index).AtLeast), 1.0) ; - else - InsertNewBin(BinVal, Action, Count, AtLeast, Weight, NamePtr.all, PercentCov) ; - end if ; - deallocate(NamePtr) ; - end loop ReadLoop ; - Good := ReadValid ; - end ReadCovDbDataBase ; - - - ------------------------------------------------------------ - -- pt local - procedure ReadCovDb (File CovDbFile : text; Merge : boolean := FALSE) is - ------------------------------------------------------------ - -- Format: Action Count min1 max1 min2 max2 - -- file CovDbFile : text open READ_MODE is FileName ; - variable NumRangeItems : integer ; - variable NumLines : integer ; - variable ReadValid : boolean ; - begin - if not Merge then - Deallocate ; -- remove any old bins - end if ; - - ReadLoop : loop - -- Read coverage private variables to the file - ReadCovVars(CovDbFile, ReadValid) ; - exit when not ReadValid ; - - -- Get Coverage dimensions and number of items in file. - ReadCovDbInfo(CovDbFile, NumRangeItems, NumLines, ReadValid) ; - exit when not ReadValid ; - - -- Read the file - ReadCovDbDataBase(CovDbFile, NumRangeItems, NumLines, Merge, ReadValid) ; - exit ; - end loop ReadLoop ; - end ReadCovDb ; - - - ------------------------------------------------------------ - procedure ReadCovDb (FileName : string; Merge : boolean := FALSE) is - ------------------------------------------------------------ - -- Format: Action Count min1 max1 min2 max2 - file CovDbFile : text open READ_MODE is FileName ; - begin - ReadCovDb(CovDbFile, Merge) ; - end procedure ReadCovDb ; - - - ------------------------------------------------------------ - -- pt local - procedure WriteCovDbVars (file CovDbFile : text ) is - ------------------------------------------------------------ - variable buf : line ; - begin - -- write coverage private variables to the file - swrite(buf, CovNameVar.Get("Coverage_Model_Not_Named")) ; - writeline(CovDbFile, buf) ; - - write(buf, RV.GetSeed ) ; - write(buf, ' ') ; - write(buf, CovThreshold, RIGHT, 0, 5) ; - write(buf, ' ') ; - write(buf, IllegalModeType'pos(IllegalMode)) ; - write(buf, ' ') ; - write(buf, WeightModeType'pos(WeightMode)) ; - write(buf, ' ') ; - write(buf, WeightScale, RIGHT, 0, 6) ; - write(buf, ' ') ; - write(buf, CountModeType'pos(CountMode)) ; - write(buf, ' ') ; - write(buf, ThresholdingEnable) ; -- boolean - write(buf, ' ') ; - write(buf, CovTarget, RIGHT, 0, 6) ; -- Real - write(buf, ' ') ; - write(buf, MergingEnable) ; -- boolean - write(buf, ' ') ; - writeline(CovDbFile, buf) ; - write(buf, CovMessageVar.GetCount ) ; - writeline(CovDbFile, buf) ; - WriteMessage(CovDbFile, CovMessageVar) ; - end procedure WriteCovDbVars ; - - - ------------------------------------------------------------ - -- pt local - procedure WriteCovDb (file CovDbFile : text ) is - ------------------------------------------------------------ - -- Format: Action Count min1 max1 min2 max2 - variable buf : line ; - begin - -- write Cover variables to the file - WriteCovDbVars( CovDbFile ) ; - - -- write NumRangeItems, NumLines - write(buf, CovBinPtr(1).BinVal'length) ; - write(buf, ' ') ; - write(buf, NumBins) ; - write(buf, ' ') ; - writeline(CovDbFile, buf) ; - -- write coverage to a file - writeloop : for LineCount in 1 to NumBins loop - write(buf, CovBinPtr(LineCount).Action) ; - write(buf, ' ') ; - write(buf, CovBinPtr(LineCount).Count) ; - write(buf, ' ') ; - write(buf, CovBinPtr(LineCount).AtLeast) ; - write(buf, ' ') ; - write(buf, CovBinPtr(LineCount).Weight) ; - write(buf, ' ') ; - write(buf, CovBinPtr(LineCount).PercentCov, RIGHT, 0, 4) ; - write(buf, ' ') ; - WriteBinVal(buf, CovBinPtr(LineCount).BinVal.all) ; - write(buf, ' ') ; - write(buf, CovBinPtr(LineCount).Name'length) ; - write(buf, ' ') ; - write(buf, CovBinPtr(LineCount).Name.all) ; - writeline(CovDbFile, buf) ; - end loop WriteLoop ; - end procedure WriteCovDb ; - - - ------------------------------------------------------------ - procedure WriteCovDb (FileName : string; OpenKind : File_Open_Kind := WRITE_MODE ) is - ------------------------------------------------------------ - -- Format: Action Count min1 max1 min2 max2 - file CovDbFile : text open OpenKind is FileName ; - begin - if NumBins >= 1 then - WriteCovDb(CovDbFile) ; - else - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & - "CoveragePkg.WriteCovDb: no bins defined ", FAILURE) ; - end if ; - end procedure WriteCovDb ; - - --- ------------------------------------------------------------ --- procedure WriteCovDb is --- ------------------------------------------------------------ --- begin --- if WriteCovDbFileInit then --- WriteCovDb(WriteCovDbFile) ; --- else --- report "CoveragePkg: WriteCovDb file not specified" severity failure ; --- end if ; --- end procedure WriteCovDb ; - - - ------------------------------------------------------------ - impure function GetErrorCount return integer is - ------------------------------------------------------------ - variable ErrorCnt : integer := 0 ; - begin - if NumBins < 1 then - return 1 ; -- return error if model empty - else - for i in 1 to NumBins loop - if CovBinPtr(i).count < 0 then -- illegal CovBin - ErrorCnt := ErrorCnt + CovBinPtr(i).count ; - end if ; - end loop ; - return - ErrorCnt ; - end if ; - end function GetErrorCount ; - - ------------------------------------------------------------ - -- These support usage of cross coverage constants - -- Also support the older AddBins(GenCross(...)) methodology - -- which has been replaced by AddCross - ------------------------------------------------------------ - procedure AddCross (CovBin : CovMatrix2Type ; Name : String := "") is - ------------------------------------------------------------ - begin - CheckBinValLength(2, "AddCross") ; - GrowBins(CovBin'length) ; - for i in CovBin'range loop - InsertBin( - CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, - CovBin(i).AtLeast, CovBin(i).Weight, Name - ) ; - end loop ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross (CovBin : CovMatrix3Type ; Name : String := "") is - ------------------------------------------------------------ - begin - CheckBinValLength(3, "AddCross") ; - GrowBins(CovBin'length) ; - for i in CovBin'range loop - InsertBin( - CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, - CovBin(i).AtLeast, CovBin(i).Weight, Name - ) ; - end loop ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross (CovBin : CovMatrix4Type ; Name : String := "") is - ------------------------------------------------------------ - begin - CheckBinValLength(4, "AddCross") ; - GrowBins(CovBin'length) ; - for i in CovBin'range loop - InsertBin( - CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, - CovBin(i).AtLeast, CovBin(i).Weight, Name - ) ; - end loop ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross (CovBin : CovMatrix5Type ; Name : String := "") is - ------------------------------------------------------------ - begin - CheckBinValLength(5, "AddCross") ; - GrowBins(CovBin'length) ; - for i in CovBin'range loop - InsertBin( - CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, - CovBin(i).AtLeast, CovBin(i).Weight, Name - ) ; - end loop ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross (CovBin : CovMatrix6Type ; Name : String := "") is - ------------------------------------------------------------ - begin - CheckBinValLength(6, "AddCross") ; - GrowBins(CovBin'length) ; - for i in CovBin'range loop - InsertBin( - CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, - CovBin(i).AtLeast, CovBin(i).Weight, Name - ) ; - end loop ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross (CovBin : CovMatrix7Type ; Name : String := "") is - ------------------------------------------------------------ - begin - CheckBinValLength(7, "AddCross") ; - GrowBins(CovBin'length) ; - for i in CovBin'range loop - InsertBin( - CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, - CovBin(i).AtLeast, CovBin(i).Weight, Name - ) ; - end loop ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross (CovBin : CovMatrix8Type ; Name : String := "") is - ------------------------------------------------------------ - begin - CheckBinValLength(8, "AddCross") ; - GrowBins(CovBin'length) ; - for i in CovBin'range loop - InsertBin( - CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, - CovBin(i).AtLeast, CovBin(i).Weight, Name - ) ; - end loop ; - end procedure AddCross ; - - - ------------------------------------------------------------ - procedure AddCross (CovBin : CovMatrix9Type ; Name : String := "") is - ------------------------------------------------------------ - begin - CheckBinValLength(9, "AddCross") ; - GrowBins(CovBin'length) ; - for i in CovBin'range loop - InsertBin( - CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, - CovBin(i).AtLeast, CovBin(i).Weight, Name - ) ; - end loop ; - end procedure AddCross ; - --- ------------------------------------------------------------ --- ------------------------------------------------------------ --- Deprecated. Due to name changes to promote greater consistency --- Maintained for backward compatibility. --- ------------------------------------------------------------ - - ------------------------------------------------------------ - impure function CovBinErrCnt return integer is - -- Deprecated. Name changed to ErrorCount for package to package consistency - ------------------------------------------------------------ - begin - return GetErrorCount ; - end function CovBinErrCnt ; - - ------------------------------------------------------------ - -- Deprecated. Same as RandCovBinVal - impure function RandCovHole ( PercentCov : real ) return RangeArrayType is - ------------------------------------------------------------ - begin - return RandCovBinVal(PercentCov) ; - end function RandCovHole ; - - ------------------------------------------------------------ - -- Deprecated. Same as RandCovBinVal - impure function RandCovHole return RangeArrayType is - ------------------------------------------------------------ - begin - return RandCovBinVal ; - end function RandCovHole ; - - -- GetCovHole replaced by GetHoleBinVal - ------------------------------------------------------------ - -- Deprecated. Same as GetHoleBinVal - impure function GetCovHole ( ReqHoleNum : integer ; PercentCov : real ) return RangeArrayType is - ------------------------------------------------------------ - begin - return GetHoleBinVal(ReqHoleNum, PercentCov) ; - end function GetCovHole ; - - ------------------------------------------------------------ - -- Deprecated. Same as GetHoleBinVal - impure function GetCovHole ( PercentCov : real ) return RangeArrayType is - ------------------------------------------------------------ - begin - return GetHoleBinVal(PercentCov) ; - end function GetCovHole ; - - ------------------------------------------------------------ - -- Deprecated. Same as GetHoleBinVal - impure function GetCovHole ( ReqHoleNum : integer := 1 ) return RangeArrayType is - ------------------------------------------------------------ - begin - return GetHoleBinVal(ReqHoleNum) ; - end function GetCovHole ; - --- ------------------------------------------------------------ --- ------------------------------------------------------------ --- Deprecated / Subsumed by versions with PercentCov Parameter --- Maintained for backward compatibility only and --- may be removed in the future. --- ------------------------------------------------------------ - - ------------------------------------------------------------ - -- Deprecated. Replaced by SetMessage with multi-line support - procedure SetItemName (ItemNameIn : String) is - ------------------------------------------------------------ - begin - SetMessage(ItemNameIn) ; - end procedure SetItemName ; - - - ------------------------------------------------------------ - -- Deprecated. Same as GetMinCount - impure function GetMinCov return integer is - ------------------------------------------------------------ - begin - return GetMinCount ; - end function GetMinCov ; - - - ------------------------------------------------------------ - -- Deprecated. Same as GetMaxCount - impure function GetMaxCov return integer is - ------------------------------------------------------------ - begin - return GetMaxCount ; - end function GetMaxCov ; - - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov - impure function CountCovHoles ( AtLeast : integer ) return integer is - ------------------------------------------------------------ - variable HoleCount : integer := 0 ; - begin - CovLoop : for i in 1 to NumBins loop --- if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < minimum(AtLeast, CovBinPtr(i).AtLeast) then - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < AtLeast then - HoleCount := HoleCount + 1 ; - end if ; - end loop CovLoop ; - return HoleCount ; - end function CountCovHoles ; - - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov - impure function IsCovered ( AtLeast : integer ) return boolean is - ------------------------------------------------------------ - begin - return CountCovHoles(AtLeast) = 0 ; - end function IsCovered ; - - - ------------------------------------------------------------ - impure function CalcWeight ( BinIndex : integer ; MaxAtLeast : integer ) return integer is - -- pt local - ------------------------------------------------------------ - begin - case WeightMode is - when AT_LEAST => - return CovBinPtr(BinIndex).AtLeast ; - - when WEIGHT => - return CovBinPtr(BinIndex).Weight ; - - when REMAIN => - return MaxAtLeast - CovBinPtr(BinIndex).Count ; - - when REMAIN_SCALED => - -- Experimental may be removed - return integer( Ceil( WeightScale * real(MaxAtLeast))) - - CovBinPtr(BinIndex).Count ; - - when REMAIN_WEIGHT => - -- Experimental may be removed - return CovBinPtr(BinIndex).Weight * ( - integer( Ceil( WeightScale * real(MaxAtLeast))) - - CovBinPtr(BinIndex).Count ) ; - - when others => - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.CalcWeight:" & - " Selected Weight Mode not supported with deprecated RandCovPoint(AtLeast), see RandCovPoint(PercentCov)", FAILURE) ; - return MaxAtLeast - CovBinPtr(BinIndex).Count ; - - end case ; - end function CalcWeight ; - - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov - -- If keep this, need to be able to scale AtLeast Value - impure function RandHoleIndex ( AtLeast : integer ) return integer is - -- pt local - ------------------------------------------------------------ - variable WeightVec : integer_vector(0 to NumBins-1) ; -- Prep for change to DistInt - variable MinCount, AdjAtLeast, MaxAtLeast : integer ; - begin - ItemCount := ItemCount + 1 ; - MinCount := GetMinCov ; - -- iAtLeast := integer(ceil(CovTarget * real(AtLeast)/100.0)) ; - if ThresholdingEnable then - AdjAtLeast := MinCount + integer(CovThreshold) + 1 ; - if MinCount < AtLeast then - -- Clip at AtLeast until reach AtLeast - AdjAtLeast := minimum(AdjAtLeast, AtLeast) ; - end if ; - else - if MinCount < AtLeast then - AdjAtLeast := AtLeast ; -- Valid - else - -- Done, Enable all bins - -- AdjAtLeast := integer'right ; -- Get All - AdjAtLeast := GetMaxCov + 1 ; -- Get All - end if ; - end if; - MaxAtLeast := AdjAtLeast ; - CovLoop : for i in 1 to NumBins loop --- if not ThresholdingEnable then --- -- When not thresholding, consider bin Bin.AtLeast --- -- iBinAtLeast := integer(ceil(CovTarget * real(CovBinPtr(i).AtLeast)/100.0)) ; --- MaxAtLeast := maximum(AdjAtLeast, CovBinPtr(i).AtLeast) ; --- end if ; - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < MaxAtLeast then - WeightVec(i-1) := CalcWeight(i, MaxAtLeast ) ; -- CovBinPtr(i).Weight ; - else - WeightVec(i-1) := 0 ; - end if ; - end loop CovLoop ; - -- DistInt returns integer range 0 to Numbins-1 - LastIndex := 1 + RV.DistInt( WeightVec ) ; -- return range 1 to NumBins - return LastIndex ; - end function RandHoleIndex ; - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov - impure function RandCovBinVal (AtLeast : integer ) return RangeArrayType is - ------------------------------------------------------------ - begin - return CovBinPtr( RandHoleIndex(AtLeast) ).BinVal.all ; -- GetBinVal - end function RandCovBinVal ; - --- Maintained for backward compatibility. Repeated until aliases work for methods - ------------------------------------------------------------ - -- Deprecated+ New versions use PercentCov. Name change. - impure function RandCovHole (AtLeast : integer ) return RangeArrayType is - ------------------------------------------------------------ - begin - return RandCovBinVal(AtLeast) ; -- GetBinVal - end function RandCovHole ; - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov - impure function RandCovPoint (AtLeast : integer ) return integer is - ------------------------------------------------------------ - variable BinVal : RangeArrayType(1 to 1) ; - begin - BinVal := RandCovBinVal(AtLeast) ; - return RV.RandInt(BinVal(1).min, BinVal(1).max) ; - end function RandCovPoint ; - - ------------------------------------------------------------ - impure function RandCovPoint (AtLeast : integer ) return integer_vector is - ------------------------------------------------------------ - begin - return ToRandPoint(RandCovBinVal(AtLeast)) ; - end function RandCovPoint ; - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov - impure function GetHoleBinVal ( ReqHoleNum : integer ; AtLeast : integer ) return RangeArrayType is - ------------------------------------------------------------ - variable HoleCount : integer := 0 ; - variable buf : line ; - begin - CovLoop : for i in 1 to NumBins loop --- if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < minimum(AtLeast, CovBinPtr(i).AtLeast) then - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < AtLeast then - HoleCount := HoleCount + 1 ; - if HoleCount = ReqHoleNum then - return CovBinPtr(i).BinVal.all ; - end if ; - end if ; - end loop CovLoop ; - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.GetHoleBinVal:" & - " did not find hole. HoleCount = " & integer'image(HoleCount) & - "ReqHoleNum = " & integer'image(ReqHoleNum), ERROR - ) ; - return CovBinPtr(NumBins).BinVal.all ; - end function GetHoleBinVal ; - - ------------------------------------------------------------ - -- Deprecated+. New versions use PercentCov. Name Change. - impure function GetCovHole ( ReqHoleNum : integer ; AtLeast : integer ) return RangeArrayType is - ------------------------------------------------------------ - begin - return GetHoleBinVal(ReqHoleNum, AtLeast) ; - end function GetCovHole ; - - - ------------------------------------------------------------ - -- pt local - -- Deprecated. New versions use PercentCov. - procedure WriteCovHoles ( file f : text; AtLeast : integer ) is - ------------------------------------------------------------ - -- variable minAtLeast : integer ; - variable buf : line ; - begin - WriteBinName(f, "WriteCovHoles: ") ; - if NumBins < 1 then - if WriteBinFileInit or UsingLocalFile then - -- Duplicate Alert in specified file - swrite(buf, "%% Alert FAILURE " & GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteCovHoles:" & - " coverage model is empty. Nothing to print.") ; - writeline(f, buf) ; - end if ; - Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteCovHoles:" & - " coverage model is empty. Nothing to print.", FAILURE) ; - end if ; - CovLoop : for i in 1 to NumBins loop --- minAtLeast := minimum(AtLeast,CovBinPtr(i).AtLeast) ; --- if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < minAtLeast then - if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < AtLeast then - swrite(buf, "%% Bin:") ; - write(buf, CovBinPtr(i).BinVal.all) ; - write(buf, " Count = " & integer'image(CovBinPtr(i).Count)) ; - write(buf, " AtLeast = " & integer'image(CovBinPtr(i).AtLeast)) ; - if WeightMode = WEIGHT or WeightMode = REMAIN_WEIGHT then - -- Print Weight only when it is used - write(buf, " Weight = " & integer'image(CovBinPtr(i).Weight)) ; - end if ; - writeline(f, buf) ; - end if ; - end loop CovLoop ; - swrite(buf, "") ; - writeline(f, buf) ; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov. - procedure WriteCovHoles ( AtLeast : integer ) is - ------------------------------------------------------------ - begin - if WriteBinFileInit then - -- Write to Local WriteBinFile - Deprecated, recommend use TranscriptFile instead - WriteCovHoles(WriteBinFile, AtLeast) ; - elsif IsTranscriptEnabled then - -- Write to TranscriptFile - WriteCovHoles(TranscriptFile, AtLeast) ; - if IsTranscriptMirrored then - -- Mirrored to OUTPUT - WriteCovHoles(OUTPUT, AtLeast) ; - end if ; - else - -- Default Write to OUTPUT - WriteCovHoles(OUTPUT, AtLeast) ; - end if; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov. - procedure WriteCovHoles ( LogLevel : LogType ; AtLeast : integer ) is - ------------------------------------------------------------ - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - WriteCovHoles(AtLeast) ; - end if; - end procedure WriteCovHoles ; - - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov. - procedure WriteCovHoles ( FileName : string; AtLeast : integer ; OpenKind : File_Open_Kind := APPEND_MODE ) is - ------------------------------------------------------------ - file CovHoleFile : text open OpenKind is FileName ; - begin - WriteCovHoles(CovHoleFile, AtLeast) ; - end procedure WriteCovHoles ; - - ------------------------------------------------------------ - -- Deprecated. New versions use PercentCov. - procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; AtLeast : integer ; OpenKind : File_Open_Kind := APPEND_MODE ) is - ------------------------------------------------------------ - begin - if IsLogEnabled(AlertLogIDVar, LogLevel) then - WriteCovHoles(FileName, AtLeast, OpenKind) ; - end if; - end procedure WriteCovHoles ; - - ------------------------------------------------------------ - -- Deprecated. Use AddCross Instead. - procedure AddBins (CovBin : CovMatrix2Type ; Name : String := "") is - ------------------------------------------------------------ - begin - AddCross(CovBin, Name) ; - end procedure AddBins ; - - ------------------------------------------------------------ - procedure AddBins (CovBin : CovMatrix3Type ; Name : String := "") is - ------------------------------------------------------------ - begin - AddCross(CovBin, Name) ; - end procedure AddBins ; - - ------------------------------------------------------------ - procedure AddBins (CovBin : CovMatrix4Type ; Name : String := "") is - ------------------------------------------------------------ - begin - AddCross(CovBin, Name) ; - end procedure AddBins ; - - ------------------------------------------------------------ - procedure AddBins (CovBin : CovMatrix5Type ; Name : String := "") is - ------------------------------------------------------------ - begin - AddCross(CovBin, Name) ; - end procedure AddBins ; - - ------------------------------------------------------------ - procedure AddBins (CovBin : CovMatrix6Type ; Name : String := "") is - ------------------------------------------------------------ - begin - AddCross(CovBin, Name) ; - end procedure AddBins ; - - ------------------------------------------------------------ - procedure AddBins (CovBin : CovMatrix7Type ; Name : String := "") is - ------------------------------------------------------------ - begin - AddCross(CovBin, Name) ; - end procedure AddBins ; - - ------------------------------------------------------------ - procedure AddBins (CovBin : CovMatrix8Type ; Name : String := "") is - ------------------------------------------------------------ - begin - AddCross(CovBin, Name) ; - end procedure AddBins ; - - ------------------------------------------------------------ - procedure AddBins (CovBin : CovMatrix9Type ; Name : String := "") is - ------------------------------------------------------------ - begin - AddCross(CovBin, Name) ; - end procedure AddBins ; - - end protected body CovPType ; - - ------------------------------------------------------------------------------------------ - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - ------------------------------------------------------------------------------------------ - - ------------------------------------------------------------ - -- Experimental. Intended primarily for development. - procedure CompareBins ( - ------------------------------------------------------------ - variable Bin1 : inout CovPType ; - variable Bin2 : inout CovPType ; - variable ErrorCount : inout integer - ) is - variable NumBins1, NumBins2 : integer ; - variable BinInfo1, BinInfo2 : CovBinBaseType ; - variable BinVal1, BinVal2 : RangeArrayType(1 to Bin1.GetBinValLength) ; - variable buf : line ; - variable iAlertLogID : AlertLogIDType ; - begin - iAlertLogID := Bin1.GetAlertLogID ; - - NumBins1 := Bin1.GetNumBins ; - NumBins2 := Bin2.GetNumBins ; - - if (NumBins1 /= NumBins2) then - ErrorCount := ErrorCount + 1 ; - print("CoveragePkg.CompareBins: CoverageModels " & Bin1.GetCovModelName & " and " & Bin2.GetCovModelName & - " have different bin lengths") ; - return ; - end if ; - - for i in 1 to NumBins1 loop - BinInfo1 := Bin1.GetBinInfo(i) ; - BinInfo2 := Bin2.GetBinInfo(i) ; - BinVal1 := Bin1.GetBinVal(i) ; - BinVal2 := Bin2.GetBinVal(i) ; - if BinInfo1 /= BinInfo2 or BinVal1 /= BinVal2 then - write(buf, "%% Bin:" & integer'image(i) & " miscompare." & LF) ; - -- writeline(OUTPUT, buf) ; - swrite(buf, "%% Bin1: ") ; - write(buf, BinVal1) ; - write(buf, " Action = " & integer'image(BinInfo1.action)) ; - write(buf, " Count = " & integer'image(BinInfo1.count)) ; - write(buf, " AtLeast = " & integer'image(BinInfo1.AtLeast)) ; - write(buf, " Weight = " & integer'image(BinInfo1.Weight) & LF ) ; - -- writeline(OUTPUT, buf) ; - swrite(buf, "%% Bin2: ") ; - write(buf, BinVal2) ; - write(buf, " Action = " & integer'image(BinInfo2.action)) ; - write(buf, " Count = " & integer'image(BinInfo2.count)) ; - write(buf, " AtLeast = " & integer'image(BinInfo2.AtLeast)) ; - write(buf, " Weight = " & integer'image(BinInfo2.Weight) & LF ) ; - -- writeline(OUTPUT, buf) ; - ErrorCount := ErrorCount + 1 ; - writeline(buf) ; - -- Alert(iAlertLogID, buf.all, ERROR) ; - -- deallocate(buf) ; - end if ; - end loop ; - end procedure CompareBins ; - - - ------------------------------------------------------------ - -- Experimental. Intended primarily for development. - procedure CompareBins ( - ------------------------------------------------------------ - variable Bin1 : inout CovPType ; - variable Bin2 : inout CovPType - ) is - variable ErrorCount : integer ; - variable iAlertLogID : AlertLogIDType ; - begin - CompareBins(Bin1, Bin2, ErrorCount) ; - iAlertLogID := Bin1.GetAlertLogID ; - AlertIf(ErrorCount /= 0, "CoveragePkg.CompareBins: CoverageModels " & Bin1.GetCovModelName & " and " & Bin2.GetCovModelName & " are not the same.") ; - end procedure CompareBins ; - - ------------------------------------------------------------ - -- package local, Used by GenBin, IllegalBin, and IgnoreBin - function MakeBin( - -- Must be pure to allow initializing coverage models passed as generics. - -- Impure implies the expression is not globally static. - ------------------------------------------------------------ - Min, Max : integer ; - NumBin : integer ; - AtLeast : integer ; - Weight : integer ; - Action : integer - ) return CovBinType is - variable iCovBin : CovBinType(1 to NumBin) ; - variable TotalBins : integer ; -- either real or integer - variable rMax, rCurMin, rNumItemsInBin, rRemainingBins : real ; -- must be real - variable iCurMin, iCurMax : integer ; - begin - if Min > Max then - -- Similar to NULL ranges. Only generate report warning. - report "OSVVM.CoveragePkg.MakeBin (called by GenBin, IllegalBin, or IgnoreBin) MAX > MIN generated NULL_BIN" - severity WARNING ; - -- No Alerts. They make this impure. - -- Alert(OSVVM_ALERTLOG_ID, "CoveragePkg.MakeBin (called by GenBin, IllegalBin, IgnoreBin): Min must be <= Max", WARNING) ; - return NULL_BIN ; - - elsif NumBin <= 0 then - -- Similar to NULL ranges. Only generate report warning. - report "OSVVM.CoveragePkg.MakeBin (called by GenBin, IllegalBin, or IgnoreBin) NumBin <= 0 generated NULL_BIN" - severity WARNING ; - -- Alerts make this impure. - -- Alert(OSVVM_ALERTLOG_ID, "CoveragePkg.MakeBin (called by GenBin, IllegalBin, IgnoreBin): NumBin must be <= 0", WARNING) ; - return NULL_BIN ; - - elsif NumBin = 1 then - iCovBin(1) := ( - BinVal => (1 => (Min, Max)), - Action => Action, - Count => 0, - Weight => Weight, - AtLeast => AtLeast - ) ; - return iCovBin ; - - else - -- Using type real to work around issues with integer sizing - iCurMin := Min ; - rCurMin := real(iCurMin) ; - rMax := real(Max) ; - rRemainingBins := (minimum( real(NumBin), rMax - rCurMin + 1.0 )) ; - TotalBins := integer(rRemainingBins) ; - for i in iCovBin'range loop - rNumItemsInBin := trunc((rMax - rCurMin + 1.0) / rRemainingBins) ; -- Max - Min can be larger than integer range. - iCurMax := iCurMin - integer(-rNumItemsInBin + 1.0) ; -- Keep: the "minus negative" works around a simulator bounds issue found in 2015.06 - iCovBin(i) := ( - BinVal => (1 => (iCurMin, iCurMax)), - Action => Action, - Count => 0, - Weight => Weight, - AtLeast => AtLeast - ) ; - rRemainingBins := rRemainingBins - 1.0 ; - exit when rRemainingBins = 0.0 ; - iCurMin := iCurMax + 1 ; - rCurMin := real(iCurMin) ; - end loop ; - return iCovBin(1 to TotalBins) ; - - end if ; - end function MakeBin ; - - - ------------------------------------------------------------ - -- package local, Used by GenBin, IllegalBin, and IgnoreBin - function MakeBin( - ------------------------------------------------------------ - A : integer_vector ; - AtLeast : integer ; - Weight : integer ; - Action : integer - ) return CovBinType is - alias NewA : integer_vector(1 to A'length) is A ; - variable iCovBin : CovBinType(1 to A'length) ; - begin - - if A'length <= 0 then - -- Similar to NULL ranges. Only generate report warning. - report "OSVVM.CoveragePkg.MakeBin (called by GenBin, IllegalBin, or IgnoreBin) integer_vector length <= 0 generated NULL_BIN" - severity WARNING ; - -- Alerts make this impure. - -- Alert(OSVVM_ALERTLOG_ID, "CoveragePkg.MakeBin (GenBin, IllegalBin, IgnoreBin): integer_vector parameter must have values", WARNING) ; - return NULL_BIN ; - - else - for i in NewA'Range loop - iCovBin(i) := ( - BinVal => (i => (NewA(i), NewA(i)) ), - Action => Action, - Count => 0, - Weight => Weight, - AtLeast => AtLeast - ) ; - end loop ; - return iCovBin ; - end if ; - end function MakeBin ; - - - ------------------------------------------------------------ - function GenBin( - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Min, Max : integer ; - NumBin : integer - ) return CovBinType is - begin - return MakeBin( - Min => Min, - Max => Max, - NumBin => NumBin, - AtLeast => AtLeast, - Weight => Weight, - Action => COV_COUNT - ) ; - end function GenBin ; - - - ------------------------------------------------------------ - function GenBin( AtLeast : integer ; Min, Max, NumBin : integer ) return CovBinType is - ------------------------------------------------------------ - begin - return MakeBin( - Min => Min, - Max => Max, - NumBin => NumBin, - AtLeast => AtLeast, - Weight => 1, - Action => COV_COUNT - ) ; - end function GenBin ; - - - ------------------------------------------------------------ - function GenBin( Min, Max, NumBin : integer ) return CovBinType is - ------------------------------------------------------------ - begin - return MakeBin( - Min => Min, - Max => Max, - NumBin => NumBin, - AtLeast => 1, - Weight => 1, - Action => COV_COUNT - ) ; - end function GenBin ; - - - ------------------------------------------------------------ - function GenBin ( Min, Max : integer) return CovBinType is - ------------------------------------------------------------ - begin - -- create a separate CovBin for each value - -- AtLeast and Weight = 1 (must use longer version to specify) - return MakeBin( - Min => Min, - Max => Max, - NumBin => Max - Min + 1, - AtLeast => 1, - Weight => 1, - Action => COV_COUNT - ) ; - end function GenBin ; - - - ------------------------------------------------------------ - function GenBin ( A : integer ) return CovBinType is - ------------------------------------------------------------ - begin - -- create a single CovBin for A. - -- AtLeast and Weight = 1 (must use longer version to specify) - return MakeBin( - Min => A, - Max => A, - NumBin => 1, - AtLeast => 1, - Weight => 1, - Action => COV_COUNT - ) ; - end function GenBin ; - - - ------------------------------------------------------------ - function GenBin( - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - A : integer_vector - ) return CovBinType is - begin - return MakeBin( - A => A, - AtLeast => AtLeast, - Weight => Weight, - Action => COV_COUNT - ) ; - end function GenBin ; - - - ------------------------------------------------------------ - function GenBin ( AtLeast : integer ; A : integer_vector ) return CovBinType is - ------------------------------------------------------------ - begin - return MakeBin( - A => A, - AtLeast => AtLeast, - Weight => 1, - Action => COV_COUNT - ) ; - end function GenBin ; - - - ------------------------------------------------------------ - function GenBin ( A : integer_vector ) return CovBinType is - ------------------------------------------------------------ - begin - return MakeBin( - A => A, - AtLeast => 1, - Weight => 1, - Action => COV_COUNT - ) ; - end function GenBin ; - - - ------------------------------------------------------------ - function IllegalBin ( Min, Max, NumBin : integer ) return CovBinType is - ------------------------------------------------------------ - begin - return MakeBin( - Min => Min, - Max => Max, - NumBin => NumBin, - AtLeast => 0, - Weight => 0, - Action => COV_ILLEGAL - ) ; - end function IllegalBin ; - - ------------------------------------------------------------ - function IllegalBin ( Min, Max : integer ) return CovBinType is - ------------------------------------------------------------ - begin - -- default, generate one CovBin with the entire range of values - return MakeBin( - Min => Min, - Max => Max, - NumBin => 1, - AtLeast => 0, - Weight => 0, - Action => COV_ILLEGAL - ) ; - end function IllegalBin ; - - - ------------------------------------------------------------ - function IllegalBin ( A : integer ) return CovBinType is - ------------------------------------------------------------ - begin - return MakeBin( - Min => A, - Max => A, - NumBin => 1, - AtLeast => 0, - Weight => 0, - Action => COV_ILLEGAL - ) ; - end function IllegalBin ; - - --- IgnoreBin should never have an AtLeast parameter - ------------------------------------------------------------ - function IgnoreBin (Min, Max, NumBin : integer) return CovBinType is - ------------------------------------------------------------ - begin - return MakeBin( - Min => Min, - Max => Max, - NumBin => NumBin, - AtLeast => 0, - Weight => 0, - Action => COV_IGNORE - ) ; - end function IgnoreBin ; - - - ------------------------------------------------------------ - function IgnoreBin (Min, Max : integer) return CovBinType is - ------------------------------------------------------------ - begin - -- default, generate one CovBin with the entire range of values - return MakeBin( - Min => Min, - Max => Max, - NumBin => 1, - AtLeast => 0, - Weight => 0, - Action => COV_IGNORE - ) ; - end function IgnoreBin ; - - - ------------------------------------------------------------ - function IgnoreBin (A : integer) return CovBinType is - ------------------------------------------------------------ - begin - return MakeBin( - Min => A, - Max => A, - NumBin => 1, - AtLeast => 0, - Weight => 0, - Action => COV_IGNORE - ) ; - end function IgnoreBin ; - - - ------------------------------------------------------------ - function GenCross( -- 2 - -- Cross existing bins - -- Use AddCross for adding values directly to coverage database - -- Use GenCross for constants - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2 : CovBinType - ) return CovMatrix2Type is - constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable Action : integer ; - variable iCovMatrix : CovMatrix2Type(1 to NUM_NEW_BINS) ; - begin - for MatrixIndex in iCovMatrix'range loop - CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2) ; - Action := MergeState(CrossBins) ; - iCovMatrix(MatrixIndex).action := Action ; - iCovMatrix(MatrixIndex).count := 0 ; - iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; - iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; - iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; - IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next - end loop ; - return iCovMatrix ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross(AtLeast : integer ; Bin1, Bin2 : CovBinType) return CovMatrix2Type is - -- Cross existing bins -- use AddCross instead - ------------------------------------------------------------ - begin - return GenCross(AtLeast, 0, Bin1, Bin2) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross(Bin1, Bin2 : CovBinType) return CovMatrix2Type is - -- Cross existing bins -- use AddCross instead - ------------------------------------------------------------ - begin - return GenCross(0, 0, Bin1, Bin2) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( -- 3 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3 : CovBinType - ) return CovMatrix3Type is - constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable Action : integer ; - variable iCovMatrix : CovMatrix3Type(1 to NUM_NEW_BINS) ; - begin - for MatrixIndex in iCovMatrix'range loop - CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3) ; - Action := MergeState(CrossBins) ; - iCovMatrix(MatrixIndex).action := Action ; - iCovMatrix(MatrixIndex).count := 0 ; - iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; - iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; - iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; - IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next - end loop ; - return iCovMatrix ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3 : CovBinType ) return CovMatrix3Type is - ------------------------------------------------------------ - begin - return GenCross(AtLeast, 0, Bin1, Bin2, Bin3) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( Bin1, Bin2, Bin3 : CovBinType ) return CovMatrix3Type is - ------------------------------------------------------------ - begin - return GenCross(0, 0, Bin1, Bin2, Bin3) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( -- 4 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4 : CovBinType - ) return CovMatrix4Type is - constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable Action : integer ; - variable iCovMatrix : CovMatrix4Type(1 to NUM_NEW_BINS) ; - begin - for MatrixIndex in iCovMatrix'range loop - CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4) ; - Action := MergeState(CrossBins) ; - iCovMatrix(MatrixIndex).action := Action ; - iCovMatrix(MatrixIndex).count := 0 ; - iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; - iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; - iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; - IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next - end loop ; - return iCovMatrix ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4 : CovBinType ) return CovMatrix4Type is - ------------------------------------------------------------ - begin - return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( Bin1, Bin2, Bin3, Bin4 : CovBinType ) return CovMatrix4Type is - ------------------------------------------------------------ - begin - return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( -- 5 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType - ) return CovMatrix5Type is - constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable Action : integer ; - variable iCovMatrix : CovMatrix5Type(1 to NUM_NEW_BINS) ; - begin - for MatrixIndex in iCovMatrix'range loop - CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5) ; - Action := MergeState(CrossBins) ; - iCovMatrix(MatrixIndex).action := Action ; - iCovMatrix(MatrixIndex).count := 0 ; - iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; - iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; - iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; - IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next - end loop ; - return iCovMatrix ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType ) return CovMatrix5Type is - ------------------------------------------------------------ - begin - return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType ) return CovMatrix5Type is - ------------------------------------------------------------ - begin - return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( -- 6 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType - ) return CovMatrix6Type is - constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5, Bin6) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable Action : integer ; - variable iCovMatrix : CovMatrix6Type(1 to NUM_NEW_BINS) ; - begin - for MatrixIndex in iCovMatrix'range loop - CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6) ; - Action := MergeState(CrossBins) ; - iCovMatrix(MatrixIndex).action := Action ; - iCovMatrix(MatrixIndex).count := 0 ; - iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; - iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; - iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; - IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next - end loop ; - return iCovMatrix ; - - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType ) return CovMatrix6Type is - ------------------------------------------------------------ - begin - return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType ) return CovMatrix6Type is - ------------------------------------------------------------ - begin - return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( -- 7 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType - ) return CovMatrix7Type is - constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable Action : integer ; - variable iCovMatrix : CovMatrix7Type(1 to NUM_NEW_BINS) ; - begin - for MatrixIndex in iCovMatrix'range loop - CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) ; - Action := MergeState(CrossBins) ; - iCovMatrix(MatrixIndex).action := Action ; - iCovMatrix(MatrixIndex).count := 0 ; - iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; - iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; - iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; - IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next - end loop ; - return iCovMatrix ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType ) return CovMatrix7Type is - ------------------------------------------------------------ - begin - return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType ) return CovMatrix7Type is - ------------------------------------------------------------ - begin - return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( -- 8 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType - ) return CovMatrix8Type is - constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable Action : integer ; - variable iCovMatrix : CovMatrix8Type(1 to NUM_NEW_BINS) ; - begin - for MatrixIndex in iCovMatrix'range loop - CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8) ; - Action := MergeState(CrossBins) ; - iCovMatrix(MatrixIndex).action := Action ; - iCovMatrix(MatrixIndex).count := 0 ; - iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; - iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; - iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; - IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next - end loop ; - return iCovMatrix ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType ) return CovMatrix8Type is - ------------------------------------------------------------ - begin - return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType ) return CovMatrix8Type is - ------------------------------------------------------------ - begin - return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( -- 9 - ------------------------------------------------------------ - AtLeast : integer ; - Weight : integer ; - Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType - ) return CovMatrix9Type is - constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9) ; - constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; - variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; - variable CrossBins : CovBinType(BinIndex'range) ; - variable Action : integer ; - variable iCovMatrix : CovMatrix9Type(1 to NUM_NEW_BINS) ; - begin - for MatrixIndex in iCovMatrix'range loop - CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9) ; - Action := MergeState(CrossBins) ; - iCovMatrix(MatrixIndex).action := Action ; - iCovMatrix(MatrixIndex).count := 0 ; - iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; - iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; - iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; - IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next - end loop ; - return iCovMatrix ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType ) return CovMatrix9Type is - ------------------------------------------------------------ - begin - return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9) ; - end function GenCross ; - - - ------------------------------------------------------------ - function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType ) return CovMatrix9Type is - ------------------------------------------------------------ - begin - return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9) ; - end function GenCross ; - - - ------------------------------------------------------------ - function to_integer ( B : boolean ) return integer is - ------------------------------------------------------------ - begin - if B then - return 1 ; - else - return 0 ; - end if ; - end function to_integer ; - - - ------------------------------------------------------------ - function to_integer ( SL : std_logic ) return integer is - ------------------------------------------------------------- - begin - case SL is - when '1' | 'H' => return 1 ; - when '0' | 'L' => return 0 ; - when others => return -1 ; - end case ; - end function to_integer ; - - - ------------------------------------------------------------ - function to_integer_vector ( BV : boolean_vector ) return integer_vector is - ------------------------------------------------------------ - variable result : integer_vector(BV'range) ; - begin - for i in BV'range loop - result(i) := to_integer(BV(i)) ; - end loop ; - return result ; - end function to_integer_vector ; - - - ------------------------------------------------------------ - function to_integer_vector ( SLV : std_logic_vector ) return integer_vector is - ------------------------------------------------------------- - variable result : integer_vector(SLV'range) ; - begin - for i in SLV'range loop - result(i) := to_integer(SLV(i)) ; - end loop ; - return result ; - end function to_integer_vector ; - - - ------------------------------------------------------------ - ------------------------------------------------------------ --- Deprecated: These are not part of the coverage model - - ------------------------------------------------------------ - procedure increment( signal Count : inout integer ) is - ------------------------------------------------------------ - begin - Count <= Count + 1 ; - end procedure increment ; - - - ------------------------------------------------------------ - procedure increment( signal Count : inout integer ; enable : boolean ) is - ------------------------------------------------------------ - begin - if enable then - Count <= Count + 1 ; - end if ; - end procedure increment ; - - - ------------------------------------------------------------ - procedure increment( signal Count : inout integer ; enable : std_ulogic ) is - ------------------------------------------------------------ - begin - if to_x01(enable) = '1' then - Count <= Count + 1 ; - end if ; - end procedure increment ; - - +-- +-- File Name: CoveragePkg.vhd +-- Design Unit Name: CoveragePkg +-- Revision: STANDARD VERSION +-- +-- Maintainer: Jim Lewis email: jim@synthworks.com +-- Contributor(s): +-- Jim Lewis SynthWorks +-- Matthias Alles Creonic. Inspired GetMinBinVal, GetMinPoint, GetCov +-- Jerry Kaczynski Aldec. Inspired GetBin function +-- Sebastian Dunst Inspired GetBinName function +-- ... Aldec Worked on VendorCov functional coverage interface +-- +-- Package Defines +-- Functional coverage modeling utilities and data structure +-- +-- Developed by/for: +-- SynthWorks Design Inc. +-- VHDL Training Classes +-- 11898 SW 128th Ave. Tigard, Or 97223 +-- http://www.SynthWorks.com +-- +-- Latest standard version available at: +-- http://www.SynthWorks.com/downloads +-- +-- Revision History: For more details, see CoveragePkg_release_notes.pdf +-- Date Version Description +-- 06/2010: 0.1 Initial revision +-- 09/2010 Release in SynthWorks' VHDL Testbenches and Verification classes +-- 02/2011: 1.0 Changed CoverBinType to facilitage long term support of cross coverage +-- 02/2011: 1.1 Added GetMinCov, GetMaxCov, CountCovHoles, GetCovHole +-- 04/2011: 2.0 Added protected type based data structure: CovPType +-- 06/2011: 2.1 Removed signal based coverage modeling +-- 07/2011: 2.2 Added randomization with coverage goals (AtLeast), weight, and percentage thresholds +-- 11/2011: 2.2a Changed constants ALL_RANGE, ZERO_BIN, and ONE_BIN to have a 1 index +-- 12/2011: 2.2b Fixed minor inconsistencies on interface declarations. +-- 01/2012: 2.3 Added Function GetBin from Jerry K. Made write for RangeArrayType visible +-- 01/2012: 2.4 Added Merging of bins +-- 04/2013: 2013.04 Thresholding, CovTarget, Merging off by default, +-- 5/2013 2013.05 Release with updated RandomPkg. Minimal changes. +-- 1/2014 2014.01 Merging of Cov Models, LastIndex +-- 7/2014 2014.07 Bin Naming (for requirements tracking), WriteBin with Pass/Fail, GenBin[integer_vector] +-- 12/2014 2014.07a Fix memory leak in deallocate. Removed initialied pointers which can lead to leaks. +-- 01/2015 2015.01 Use AlertLogPkg to count assertions and filter log messages +-- 06/2015 2015.06 AddCross[CovMatrix?Type], Mirroring for WriteBin +-- 01/2016 2016.01 Fixes for pure functions. Added bounds checking on ICover +-- 03/2016 2016.03 Added GetBinName(Index) to retrieve a bin's name +-- 11/2016 2016.11 Added VendorCovApiPkg and calls to bind it in. +-- 05/2017 2017.05 Updated WriteBin name printing +-- ClearCov (deprecates SetCovZero) +-- 03/2018 2018.03 Updated PercentCov calculation so AtLeast of <= 0 is correct +-- +-- +-- Development Notes: +-- The coverage procedures are named ICover to avoid conflicts with +-- future language changes which may add cover as a keyword +-- Procedure WriteBin writes each CovBin on a separate line, as such +-- it was inappropriate to overload either textio write or to_string +-- In the notes VHDL-2008 notes refers to +-- composites with unconstrained elements +-- +-- +-- Copyright (c) 2010 - 2017 by SynthWorks Design Inc. All rights reserved. +-- +-- Verbatim copies of this source file may be used and +-- distributed without restriction. +-- +-- This source file is free software; you can redistribute it +-- and/or modify it under the terms of the ARTISTIC License +-- as published by The Perl Foundation; either version 2.0 of +-- the License, or (at your option) any later version. +-- +-- This source is distributed in the hope that it will be +-- useful, but WITHOUT ANY WARRANTY; without even the implied +-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +-- PURPOSE. See the Artistic License for details. +-- +-- You should have received a copy of the license with this source. +-- If not download it from, +-- http://www.perlfoundation.org/artistic_license_2_0 +-- +-- Credits: +-- CovBinBaseType is inspired by a structure proposed in the +-- paper "Functional Coverage - without SystemVerilog!" +-- by Alan Fitch and Doug Smith. Presented at DVCon 2010 +-- However the approach in their paper uses entities and +-- architectures where this approach relies on functions +-- and procedures, so the usage models differ greatly however. +-- + +library ieee ; +use ieee.std_logic_1164.all ; +use ieee.numeric_std.all ; +use ieee.math_real.all ; +use std.textio.all ; + +-- comment out following 2 lines with VHDL-2008. Leave in for VHDL-2002 +-- library ieee_proposed ; -- remove with VHDL-2008 +-- use ieee_proposed.standard_additions.all ; -- remove with VHDL-2008 + +use work.TextUtilPkg.all ; +use work.TranscriptPkg.all ; +use work.AlertLogPkg.all ; +use work.RandomBasePkg.all ; +use work.RandomPkg.all ; +use work.NamePkg.all ; +use work.MessagePkg.all ; +use work.OsvvmGlobalPkg.all ; +use work.VendorCovApiPkg.all ; + +package CoveragePkg is + + -- CovPType allocates bins that are multiples of MIN_NUM_BINS + constant MIN_NUM_BINS : integer := 2**7 ; -- power of 2 + + type RangeType is record + min : integer ; + max : integer ; + end record ; + type RangeArrayType is array (integer range <>) of RangeType ; + constant ALL_RANGE : RangeArrayType := (1=>(Integer'left, Integer'right)) ; + + procedure write ( file f : text ; BinVal : RangeArrayType ) ; + procedure write ( variable buf : inout line ; constant BinVal : in RangeArrayType) ; + + -- CovBinBaseType.action values. + -- Note that coverage counting depends on these values + constant COV_COUNT : integer := 1 ; + constant COV_IGNORE : integer := 0 ; + constant COV_ILLEGAL : integer := -1 ; + + -- type OsvvmOptionsType is (OPT_DEFAULT, FALSE, TRUE) ; + alias CovOptionsType is work.OsvvmGlobalPkg.OsvvmOptionsType ; + constant COV_OPT_INIT_PARM_DETECT : CovOptionsType := work.OsvvmGlobalPkg.OPT_INIT_PARM_DETECT ; + -- For backward compatibility. Don't add to other packages. + alias DISABLED is work.OsvvmGlobalPkg.DISABLED [return work.OsvvmGlobalPkg.OsvvmOptionsType ]; + alias ENABLED is work.OsvvmGlobalPkg.ENABLED [return work.OsvvmGlobalPkg.OsvvmOptionsType ]; + +-- Deprecated + -- Used for easy manual entry. Order: min, max, action + -- Intentionally did not use a record to allow other input + -- formats in the future with VHDL-2008 unconstrained arrays + -- of unconstrained elements + -- type CovBinManualType is array (natural range <>) of integer_vector(0 to 2) ; + + type CovBinBaseType is record + BinVal : RangeArrayType(1 to 1) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovBinType is array (natural range <>) of CovBinBaseType ; + + constant ALL_BIN : CovBinType := (0 => ( BinVal => ALL_RANGE, Action => COV_COUNT, Count => 0, AtLeast => 1, Weight => 1 )) ; + constant ALL_COUNT : CovBinType := (0 => ( BinVal => ALL_RANGE, Action => COV_COUNT, Count => 0, AtLeast => 1, Weight => 1 )) ; + constant ALL_ILLEGAL : CovBinType := (0 => ( BinVal => ALL_RANGE, Action => COV_ILLEGAL, Count => 0, AtLeast => 0, Weight => 0 )) ; + constant ALL_IGNORE : CovBinType := (0 => ( BinVal => ALL_RANGE, Action => COV_IGNORE, Count => 0, AtLeast => 0, Weight => 0 )) ; + constant ZERO_BIN : CovBinType := (0 => ( BinVal => (1=>(0,0)), Action => COV_COUNT, Count => 0, AtLeast => 1, Weight => 1 )) ; + constant ONE_BIN : CovBinType := (0 => ( BinVal => (1=>(1,1)), Action => COV_COUNT, Count => 0, AtLeast => 1, Weight => 1 )) ; + constant NULL_BIN : CovBinType(work.RandomPkg.NULL_RANGE_TYPE) := (others => ( BinVal => ALL_RANGE, Action => integer'high, Count => 0, AtLeast => integer'high, Weight => integer'high )) ; + + type CountModeType is (COUNT_FIRST, COUNT_ALL) ; + type IllegalModeType is (ILLEGAL_ON, ILLEGAL_FAILURE, ILLEGAL_OFF) ; + type WeightModeType is (AT_LEAST, WEIGHT, REMAIN, REMAIN_EXP, REMAIN_SCALED, REMAIN_WEIGHT ) ; + + + -- In VHDL-2008 CovMatrix?BaseType and CovMatrix?Type will be subsumed + -- by CovBinBaseType and CovBinType with RangeArrayType as an unconstrained array. + type CovMatrix2BaseType is record + BinVal : RangeArrayType(1 to 2) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovMatrix2Type is array (natural range <>) of CovMatrix2BaseType ; + + type CovMatrix3BaseType is record + BinVal : RangeArrayType(1 to 3) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovMatrix3Type is array (natural range <>) of CovMatrix3BaseType ; + + type CovMatrix4BaseType is record + BinVal : RangeArrayType(1 to 4) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovMatrix4Type is array (natural range <>) of CovMatrix4BaseType ; + + type CovMatrix5BaseType is record + BinVal : RangeArrayType(1 to 5) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovMatrix5Type is array (natural range <>) of CovMatrix5BaseType ; + + type CovMatrix6BaseType is record + BinVal : RangeArrayType(1 to 6) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovMatrix6Type is array (natural range <>) of CovMatrix6BaseType ; + + type CovMatrix7BaseType is record + BinVal : RangeArrayType(1 to 7) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovMatrix7Type is array (natural range <>) of CovMatrix7BaseType ; + + type CovMatrix8BaseType is record + BinVal : RangeArrayType(1 to 8) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovMatrix8Type is array (natural range <>) of CovMatrix8BaseType ; + + type CovMatrix9BaseType is record + BinVal : RangeArrayType(1 to 9) ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + end record ; + type CovMatrix9Type is array (natural range <>) of CovMatrix9BaseType ; + + ------------------------------------------------------------ VendorCov + -- VendorCov Conversion for Vendor supported functional coverage modeling + function ToVendorCovBinVal (BinVal : RangeArrayType) return VendorCovRangeArrayType ; + + ------------------------------------------------------------ + function ToMinPoint (A : RangeArrayType) return integer ; + function ToMinPoint (A : RangeArrayType) return integer_vector ; + -- BinVal to Minimum Point + + ------------------------------------------------------------ + procedure ToRandPoint( + -- BinVal to Random Point + -- better as a function, however, inout not supported on functions + ------------------------------------------------------------ + variable RV : inout RandomPType ; + constant BinVal : in RangeArrayType ; + variable result : out integer + ) ; + + ------------------------------------------------------------ + procedure ToRandPoint( + -- BinVal to Random Point + ------------------------------------------------------------ + variable RV : inout RandomPType ; + constant BinVal : in RangeArrayType ; + variable result : out integer_vector + ) ; + + + ------------------------------------------------------------------------------------------ + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + ------------------------------------------------------------------------------------------ + type CovPType is protected + procedure FileOpenWriteBin (FileName : string; OpenKind : File_Open_Kind ) ; + procedure FileCloseWriteBin ; + procedure SetAlertLogID (A : AlertLogIDType) ; + procedure SetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) ; + impure function GetAlertLogID return AlertLogIDType ; + + -- procedure FileOpenWriteCovDb (FileName : string; OpenKind : File_Open_Kind ) ; + -- procedure FileCloseWriteCovDb ; + procedure SetIllegalMode (A : IllegalModeType) ; + procedure SetWeightMode (A : WeightModeType; Scale : real := 1.0) ; + procedure SetName (Name : String) ; + impure function SetName (Name : String) return string ; + impure function GetName return String ; + impure function GetCovModelName return String ; + procedure SetMessage (Message : String) ; + procedure DeallocateName ; -- clear name + procedure DeallocateMessage ; -- clear message + procedure SetThresholding(A : boolean := TRUE ) ; -- 2.5 + procedure SetCovThreshold (Percent : real) ; + procedure SetCovTarget (Percent : real) ; -- 2.5 + impure function GetCovTarget return real ; -- 2.5 + procedure SetMerging(A : boolean := TRUE ) ; -- 2.5 + procedure SetCountMode (A : CountModeType) ; + procedure InitSeed (S : string ) ; + impure function InitSeed (S : string ) return string ; + procedure InitSeed (I : integer ) ; + procedure SetSeed (RandomSeedIn : RandomSeedType ) ; + impure function GetSeed return RandomSeedType ; + + ------------------------------------------------------------ + procedure SetReportOptions ( + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + + procedure SetBinSize (NewNumBins : integer) ; + + ------------------------------------------------------------ + procedure AddBins ( + ------------------------------------------------------------ + Name : String ; + AtLeast : integer ; + Weight : integer ; + CovBin : CovBinType + ) ; + procedure AddBins ( Name : String ; AtLeast : integer ; CovBin : CovBinType ) ; + procedure AddBins ( Name : String ; CovBin : CovBinType) ; + procedure AddBins ( AtLeast : integer ; Weight : integer ; CovBin : CovBinType ) ; + procedure AddBins ( AtLeast : integer ; CovBin : CovBinType ) ; + procedure AddBins ( CovBin : CovBinType ) ; + + ------------------------------------------------------------ + procedure AddCross( + ------------------------------------------------------------ + Name : string ; + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) ; + + ------------------------------------------------------------ + procedure AddCross( + Name : string ; + AtLeast : integer ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) ; + + ------------------------------------------------------------ + procedure AddCross( + Name : string ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) ; + + ------------------------------------------------------------ + procedure AddCross( + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) ; + + ------------------------------------------------------------ + procedure AddCross( + AtLeast : integer ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) ; + + ------------------------------------------------------------ + procedure AddCross( + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) ; + + + procedure Deallocate ; + + procedure ICoverLast ; + procedure ICover( CovPoint : integer) ; + procedure ICover( CovPoint : integer_vector) ; + + procedure ClearCov ; + procedure SetCovZero ; + + impure function IsInitialized return boolean ; + impure function GetNumBins return integer ; + impure function GetMinIndex return integer ; + impure function GetMinCov return real ; -- PercentCov + impure function GetMinCount return integer ; -- Count + impure function GetMaxIndex return integer ; + impure function GetMaxCov return real ; -- PercentCov + impure function GetMaxCount return integer ; -- Count + impure function CountCovHoles ( PercentCov : real ) return integer ; + impure function CountCovHoles return integer ; + impure function IsCovered return boolean ; + impure function IsCovered ( PercentCov : real ) return boolean ; + impure function GetCov ( PercentCov : real ) return real ; + impure function GetCov return real ; -- PercentCov of entire model/all bins + impure function GetItemCount return integer ; + impure function GetTotalCovGoal ( PercentCov : real ) return integer ; + impure function GetTotalCovGoal return integer ; + impure function GetLastIndex return integer ; + + -- Return BinVal + impure function GetBinVal ( BinIndex : integer ) return RangeArrayType ; + impure function GetLastBinVal return RangeArrayType ; + impure function RandCovBinVal ( PercentCov : real ) return RangeArrayType ; + impure function RandCovBinVal return RangeArrayType ; + impure function GetMinBinVal return RangeArrayType ; + impure function GetMaxBinVal return RangeArrayType ; + impure function GetHoleBinVal ( ReqHoleNum : integer ; PercentCov : real ) return RangeArrayType ; + impure function GetHoleBinVal ( PercentCov : real ) return RangeArrayType ; + impure function GetHoleBinVal ( ReqHoleNum : integer := 1 ) return RangeArrayType ; + + -- Return Points + impure function RandCovPoint return integer ; + impure function RandCovPoint ( PercentCov : real ) return integer ; + impure function RandCovPoint return integer_vector ; + impure function RandCovPoint ( PercentCov : real ) return integer_vector ; + impure function GetPoint ( BinIndex : integer ) return integer ; + impure function GetPoint ( BinIndex : integer ) return integer_vector ; + impure function GetMinPoint return integer ; + impure function GetMinPoint return integer_vector ; + impure function GetMaxPoint return integer ; + impure function GetMaxPoint return integer_vector ; + + -- GetBin returns an internal value of the coverage data structure + -- The return value may change as the package evolves + -- Use it only for debugging. + -- GetBinInfo is a for development only. + impure function GetBinInfo ( BinIndex : integer ) return CovBinBaseType ; + impure function GetBinValLength return integer ; + impure function GetBin ( BinIndex : integer ) return CovBinBaseType ; + impure function GetBin ( BinIndex : integer ) return CovMatrix2BaseType ; + impure function GetBin ( BinIndex : integer ) return CovMatrix3BaseType ; + impure function GetBin ( BinIndex : integer ) return CovMatrix4BaseType ; + impure function GetBin ( BinIndex : integer ) return CovMatrix5BaseType ; + impure function GetBin ( BinIndex : integer ) return CovMatrix6BaseType ; + impure function GetBin ( BinIndex : integer ) return CovMatrix7BaseType ; + impure function GetBin ( BinIndex : integer ) return CovMatrix8BaseType ; + impure function GetBin ( BinIndex : integer ) return CovMatrix9BaseType ; + impure function GetBinName ( BinIndex : integer; DefaultName : string := "" ) return string ; + + ------------------------------------------------------------ + procedure WriteBin ( + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + + ------------------------------------------------------------ + procedure WriteBin ( -- With LogLevel + LogLevel : LogType ; + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + + ------------------------------------------------------------ + procedure WriteBin ( + FileName : string; + OpenKind : File_Open_Kind := APPEND_MODE ; + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + + ------------------------------------------------------------ + procedure WriteBin ( -- With LogLevel + LogLevel : LogType ; + FileName : string; + OpenKind : File_Open_Kind := APPEND_MODE ; + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + + procedure WriteCovHoles ( LogLevel : LogType := ALWAYS ) ; + procedure WriteCovHoles ( PercentCov : real ) ; + procedure WriteCovHoles ( LogLevel : LogType ; PercentCov : real ) ; + procedure WriteCovHoles ( FileName : string; OpenKind : File_Open_Kind := APPEND_MODE ) ; + procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; OpenKind : File_Open_Kind := APPEND_MODE ) ; + procedure WriteCovHoles ( FileName : string; PercentCov : real ; OpenKind : File_Open_Kind := APPEND_MODE ) ; + procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; PercentCov : real ; OpenKind : File_Open_Kind := APPEND_MODE ) ; + procedure DumpBin (LogLevel : LogType := DEBUG) ; -- Development only + + procedure ReadCovDb (FileName : string; Merge : boolean := FALSE) ; + procedure WriteCovDb (FileName : string; OpenKind : File_Open_Kind := WRITE_MODE ) ; + impure function GetErrorCount return integer ; + + -- These support usage of cross coverage constants + -- Also support the older AddBins(GenCross(...)) methodology + -- which has been replaced by AddCross + procedure AddCross (CovBin : CovMatrix2Type ; Name : String := "") ; + procedure AddCross (CovBin : CovMatrix3Type ; Name : String := "") ; + procedure AddCross (CovBin : CovMatrix4Type ; Name : String := "") ; + procedure AddCross (CovBin : CovMatrix5Type ; Name : String := "") ; + procedure AddCross (CovBin : CovMatrix6Type ; Name : String := "") ; + procedure AddCross (CovBin : CovMatrix7Type ; Name : String := "") ; + procedure AddCross (CovBin : CovMatrix8Type ; Name : String := "") ; + procedure AddCross (CovBin : CovMatrix9Type ; Name : String := "") ; + +------------------------------------------------------------ +-- Remaining are Deprecated +-- + -- Deprecated. Replaced by SetName with multi-line support + procedure SetItemName (ItemNameIn : String) ; -- deprecated + + -- Deprecated. Consistency across packages + impure function CovBinErrCnt return integer ; + +-- Deprecated. Due to name changes to promote greater consistency + -- Maintained for backward compatibility. + -- RandCovHole replaced by RandCovBinVal + impure function RandCovHole ( PercentCov : real ) return RangeArrayType ; -- Deprecated + impure function RandCovHole return RangeArrayType ; -- Deprecated + + -- GetCovHole replaced by GetHoleBinVal + impure function GetCovHole ( ReqHoleNum : integer ; PercentCov : real ) return RangeArrayType ; + impure function GetCovHole ( PercentCov : real ) return RangeArrayType ; + impure function GetCovHole ( ReqHoleNum : integer := 1 ) return RangeArrayType ; + + +-- Deprecated/ Subsumed by versions with PercentCov Parameter + -- Maintained for backward compatibility only and + -- may be removed in the future. + impure function GetMinCov return integer ; + impure function GetMaxCov return integer ; + impure function CountCovHoles ( AtLeast : integer ) return integer ; + impure function IsCovered ( AtLeast : integer ) return boolean ; + impure function RandCovBinVal ( AtLeast : integer ) return RangeArrayType ; + impure function RandCovHole ( AtLeast : integer ) return RangeArrayType ; -- Deprecated + impure function RandCovPoint (AtLeast : integer ) return integer ; + impure function RandCovPoint (AtLeast : integer ) return integer_vector ; + impure function GetHoleBinVal ( ReqHoleNum : integer ; AtLeast : integer ) return RangeArrayType ; + impure function GetCovHole ( ReqHoleNum : integer ; AtLeast : integer ) return RangeArrayType ; + + procedure WriteCovHoles ( AtLeast : integer ) ; + procedure WriteCovHoles ( LogLevel : LogType ; AtLeast : integer ) ; + procedure WriteCovHoles ( FileName : string; AtLeast : integer ; OpenKind : File_Open_Kind := APPEND_MODE ) ; + procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; AtLeast : integer ; OpenKind : File_Open_Kind := APPEND_MODE ) ; + + -- Replaced by a more appropriately named AddCross + procedure AddBins (CovBin : CovMatrix2Type ; Name : String := "") ; + procedure AddBins (CovBin : CovMatrix3Type ; Name : String := "") ; + procedure AddBins (CovBin : CovMatrix4Type ; Name : String := "") ; + procedure AddBins (CovBin : CovMatrix5Type ; Name : String := "") ; + procedure AddBins (CovBin : CovMatrix6Type ; Name : String := "") ; + procedure AddBins (CovBin : CovMatrix7Type ; Name : String := "") ; + procedure AddBins (CovBin : CovMatrix8Type ; Name : String := "") ; + procedure AddBins (CovBin : CovMatrix9Type ; Name : String := "") ; + + end protected CovPType ; + ------------------------------------------------------------------------------------------ + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + ------------------------------------------------------------------------------------------ + + + ------------------------------------------------------------ + -- Experimental. Intended primarily for development. + procedure CompareBins ( + ------------------------------------------------------------ + variable Bin1 : inout CovPType ; + variable Bin2 : inout CovPType ; + variable ErrorCount : inout integer + ) ; + + ------------------------------------------------------------ + -- Experimental. Intended primarily for development. + procedure CompareBins ( + ------------------------------------------------------------ + variable Bin1 : inout CovPType ; + variable Bin2 : inout CovPType + ) ; + + -- + -- Support for AddBins and AddCross + -- + + ------------------------------------------------------------ + function GenBin( + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Min, Max : integer ; + NumBin : integer + ) return CovBinType ; + + -- Each item in range in a separate CovBin + function GenBin(AtLeast : integer ; Min, Max, NumBin : integer ) return CovBinType ; + function GenBin(Min, Max, NumBin : integer ) return CovBinType ; + function GenBin(Min, Max : integer) return CovBinType ; + function GenBin(A : integer) return CovBinType ; + + ------------------------------------------------------------ + function GenBin( + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + A : integer_vector + ) return CovBinType ; + + function GenBin ( AtLeast : integer ; A : integer_vector ) return CovBinType ; + function GenBin ( A : integer_vector ) return CovBinType ; + + + ------------------------------------------------------------ + function IllegalBin ( Min, Max, NumBin : integer ) return CovBinType ; + ------------------------------------------------------------ + + -- All items in range in a single CovBin + function IllegalBin ( Min, Max : integer ) return CovBinType ; + function IllegalBin ( A : integer ) return CovBinType ; + + +-- IgnoreBin should never have an AtLeast parameter + ------------------------------------------------------------ + function IgnoreBin (Min, Max, NumBin : integer) return CovBinType ; + ------------------------------------------------------------ + function IgnoreBin (Min, Max : integer) return CovBinType ; -- All items in range in a single CovBin + function IgnoreBin (A : integer) return CovBinType ; + + + -- With VHDL-2008, there will be one GenCross that returns CovBinType + -- and has inputs initialized to NULL_BIN - see AddCross + ------------------------------------------------------------ + function GenCross( -- 2 + -- Cross existing bins + -- Use AddCross for adding values directly to coverage database + -- Use GenCross for constants + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2 : CovBinType + ) return CovMatrix2Type ; + + function GenCross(AtLeast : integer ; Bin1, Bin2 : CovBinType) return CovMatrix2Type ; + function GenCross(Bin1, Bin2 : CovBinType) return CovMatrix2Type ; + + + ------------------------------------------------------------ + function GenCross( -- 3 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3 : CovBinType + ) return CovMatrix3Type ; + + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3 : CovBinType ) return CovMatrix3Type ; + function GenCross( Bin1, Bin2, Bin3 : CovBinType ) return CovMatrix3Type ; + + + ------------------------------------------------------------ + function GenCross( -- 4 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4 : CovBinType + ) return CovMatrix4Type ; + + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4 : CovBinType ) return CovMatrix4Type ; + function GenCross( Bin1, Bin2, Bin3, Bin4 : CovBinType ) return CovMatrix4Type ; + + + ------------------------------------------------------------ + function GenCross( -- 5 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType + ) return CovMatrix5Type ; + + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType ) return CovMatrix5Type ; + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType ) return CovMatrix5Type ; + + + ------------------------------------------------------------ + function GenCross( -- 6 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType + ) return CovMatrix6Type ; + + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType ) return CovMatrix6Type ; + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType ) return CovMatrix6Type ; + + + ------------------------------------------------------------ + function GenCross( -- 7 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType + ) return CovMatrix7Type ; + + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType ) return CovMatrix7Type ; + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType ) return CovMatrix7Type ; + + + ------------------------------------------------------------ + function GenCross( -- 8 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType + ) return CovMatrix8Type ; + + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType ) return CovMatrix8Type ; + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType ) return CovMatrix8Type ; + + + ------------------------------------------------------------ + function GenCross( -- 9 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType + ) return CovMatrix9Type ; + + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType ) return CovMatrix9Type ; + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType ) return CovMatrix9Type ; + + + ------------------------------------------------------------ + -- Utilities. Remove if added to std.standard + function to_integer ( B : boolean ) return integer ; + function to_integer ( SL : std_logic ) return integer ; + function to_integer_vector ( BV : boolean_vector ) return integer_vector ; + function to_integer_vector ( SLV : std_logic_vector ) return integer_vector ; + + + ------------------------------------------------------------ + ------------------------------------------------------------ +-- Deprecated: These are not part of the coverage model + +-- procedure increment( signal Count : inout integer ) ; +-- procedure increment( signal Count : inout integer ; enable : boolean ) ; +-- procedure increment( signal Count : inout integer ; enable : std_ulogic ) ; + + + + +end package CoveragePkg ; + +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// + +package body CoveragePkg is + ------------------------------------------------------------ + function inside ( + -- package local + ------------------------------------------------------------ + CovPoint : integer_vector ; + BinVal : RangeArrayType + ) return boolean is + alias iCovPoint : integer_vector(BinVal'range) is CovPoint ; + begin + for i in BinVal'range loop + if not (iCovPoint(i) >= BinVal(i).min and iCovPoint(i) <= BinVal(i).max) then + return FALSE ; + end if ; + end loop ; + return TRUE ; + end function inside ; + + + ------------------------------------------------------------ + function inside ( + -- package local, used by InsertBin + -- True when BinVal1 is inside BinVal2 + ------------------------------------------------------------ + BinVal1 : RangeArrayType ; + BinVal2 : RangeArrayType + ) return boolean is + alias iBinVal2 : RangeArrayType(BinVal1'range) is BinVal2 ; + begin + for i in BinVal1'range loop + if not (BinVal1(i).min >= iBinVal2(i).min and BinVal1(i).max <= iBinVal2(i).max) then + return FALSE ; + end if ; + end loop ; + return TRUE ; + end function inside ; + + + ------------------------------------------------------------ + procedure write ( + variable buf : inout line ; + CovPoint : integer_vector + ) is + -- package local. called by ICover + ------------------------------------------------------------ + alias iCovPoint : integer_vector(1 to CovPoint'length) is CovPoint ; + begin + write(buf, "(" & integer'image(iCovPoint(1)) ) ; + for i in 2 to iCovPoint'right loop + write(buf, "," & integer'image(iCovPoint(i)) ) ; + end loop ; + swrite(buf, ")") ; + end procedure write ; + + ------------------------------------------------------------ + procedure write ( file f : text ; BinVal : RangeArrayType ) is + -- called by WriteBin and WriteCovHoles + ------------------------------------------------------------ + begin + for i in BinVal'range loop + if BinVal(i).min = BinVal(i).max then + write(f, "(" & integer'image(BinVal(i).min) & ") " ) ; + elsif (BinVal(i).min = integer'left) and (BinVal(i).max = integer'right) then + write(f, "(ALL) " ) ; + else + write(f, "(" & integer'image(BinVal(i).min) & " to " & + integer'image(BinVal(i).max) & ") " ) ; + end if ; + end loop ; + end procedure write ; + + ------------------------------------------------------------ + procedure write ( + -- called by WriteBin and WriteCovHoles + ------------------------------------------------------------ + variable buf : inout line ; + constant BinVal : in RangeArrayType + ) is + ------------------------------------------------------------ + begin + for i in BinVal'range loop + if BinVal(i).min = BinVal(i).max then + write(buf, "(" & integer'image(BinVal(i).min) & ") " ) ; + elsif (BinVal(i).min = integer'left) and (BinVal(i).max = integer'right) then + swrite(buf, "(ALL) " ) ; + else + write(buf, "(" & integer'image(BinVal(i).min) & " to " & + integer'image(BinVal(i).max) & ") " ) ; + end if ; + end loop ; + end procedure write ; + + + ------------------------------------------------------------ + procedure WriteBinVal ( + -- package local for now + ------------------------------------------------------------ + variable buf : inout line ; + constant BinVal : in RangeArrayType + ) is + begin + for i in BinVal'range loop + write(buf, BinVal(i).min) ; + write(buf, ' ') ; + write(buf, BinVal(i).max) ; + write(buf, ' ') ; + end loop ; + end procedure WriteBinVal ; + + + ------------------------------------------------------------ + -- package local for now + procedure read ( + -- if public, also create one that does not use valid flag + ------------------------------------------------------------ + variable buf : inout line ; + variable BinVal : out RangeArrayType ; + variable Valid : out boolean + ) is + variable ReadValid : boolean ; + begin + for i in BinVal'range loop + read(buf, BinVal(i).min, ReadValid) ; + exit when not ReadValid ; + read(buf, BinVal(i).max, ReadValid) ; + exit when not ReadValid ; + end loop ; + Valid := ReadValid ; + end procedure read ; + + + ------------------------------------------------------------ + function CalcPercentCov( Count : integer ; AtLeast : integer ) return real is + -- package local, called by MergeBin, InsertBin, ClearCov, ReadCovDbDatabase + ------------------------------------------------------------ + variable PercentCov : real ; + begin + if AtLeast > 0 then + return real(Count)*100.0/real(AtLeast) ; + elsif AtLeast = 0 then + return 100.0 ; + else + return real'right ; + end if ; + end function CalcPercentCov ; + + + -- ------------------------------------------------------------ + function BinLengths ( + -- package local, used by AddCross, GenCross + -- ------------------------------------------------------------ + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) return integer_vector is + variable result : integer_vector(1 to 20) := (others => 0 ) ; + variable i : integer := result'left ; + variable Len : integer ; + begin + loop + case i is + when 1 => Len := Bin1'length ; + when 2 => Len := Bin2'length ; + when 3 => Len := Bin3'length ; + when 4 => Len := Bin4'length ; + when 5 => Len := Bin5'length ; + when 6 => Len := Bin6'length ; + when 7 => Len := Bin7'length ; + when 8 => Len := Bin8'length ; + when 9 => Len := Bin9'length ; + when 10 => Len := Bin10'length ; + when 11 => Len := Bin11'length ; + when 12 => Len := Bin12'length ; + when 13 => Len := Bin13'length ; + when 14 => Len := Bin14'length ; + when 15 => Len := Bin15'length ; + when 16 => Len := Bin16'length ; + when 17 => Len := Bin17'length ; + when 18 => Len := Bin18'length ; + when 19 => Len := Bin19'length ; + when 20 => Len := Bin20'length ; + when others => Len := 0 ; + end case ; + result(i) := Len ; + exit when Len = 0 ; + i := i + 1 ; + exit when i = 21 ; + end loop ; + return result(1 to (i-1)) ; + end function BinLengths ; + + + -- ------------------------------------------------------------ + function CalcNumCrossBins ( BinLens : integer_vector ) return integer is + -- package local, used by AddCross + -- ------------------------------------------------------------ + variable result : integer := 1 ; + begin + for i in BinLens'range loop + result := result * BinLens(i) ; + end loop ; + return result ; + end function CalcNumCrossBins ; + + + -- ------------------------------------------------------------ + procedure IncBinIndex ( + -- package local, used by AddCross + -- ------------------------------------------------------------ + variable BinIndex : inout integer_vector ; + constant BinLens : in integer_vector + ) is + alias aBinIndex : integer_vector(1 to BinIndex'length) is BinIndex ; + alias aBinLens : integer_vector(aBinIndex'range) is BinLens ; + begin + -- increment right most one, then if overflow, increment next + -- assumes bins numbered from 1 to N. - assured by ConcatenateBins + for i in aBinIndex'reverse_range loop + aBinIndex(i) := aBinIndex(i) + 1 ; + exit when aBinIndex(i) <= aBinLens(i) ; + aBinIndex(i) := 1 ; + end loop ; + end procedure IncBinIndex ; + + + -- ------------------------------------------------------------ + function ConcatenateBins ( + -- package local, used by AddCross and GenCross + -- ------------------------------------------------------------ + BinIndex : integer_vector ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) return CovBinType is + alias aBin1 : CovBinType (1 to Bin1'length) is Bin1 ; + alias aBin2 : CovBinType (1 to Bin2'length) is Bin2 ; + alias aBin3 : CovBinType (1 to Bin3'length) is Bin3 ; + alias aBin4 : CovBinType (1 to Bin4'length) is Bin4 ; + alias aBin5 : CovBinType (1 to Bin5'length) is Bin5 ; + alias aBin6 : CovBinType (1 to Bin6'length) is Bin6 ; + alias aBin7 : CovBinType (1 to Bin7'length) is Bin7 ; + alias aBin8 : CovBinType (1 to Bin8'length) is Bin8 ; + alias aBin9 : CovBinType (1 to Bin9'length) is Bin9 ; + alias aBin10 : CovBinType (1 to Bin10'length) is Bin10 ; + alias aBin11 : CovBinType (1 to Bin11'length) is Bin11 ; + alias aBin12 : CovBinType (1 to Bin12'length) is Bin12 ; + alias aBin13 : CovBinType (1 to Bin13'length) is Bin13 ; + alias aBin14 : CovBinType (1 to Bin14'length) is Bin14 ; + alias aBin15 : CovBinType (1 to Bin15'length) is Bin15 ; + alias aBin16 : CovBinType (1 to Bin16'length) is Bin16 ; + alias aBin17 : CovBinType (1 to Bin17'length) is Bin17 ; + alias aBin18 : CovBinType (1 to Bin18'length) is Bin18 ; + alias aBin19 : CovBinType (1 to Bin19'length) is Bin19 ; + alias aBin20 : CovBinType (1 to Bin20'length) is Bin20 ; + alias aBinIndex : integer_vector(1 to BinIndex'length) is BinIndex ; + variable result : CovBinType(aBinIndex'range) ; + begin + for i in aBinIndex'range loop + case i is + when 1 => result(i) := aBin1(aBinIndex(i)) ; + when 2 => result(i) := aBin2(aBinIndex(i)) ; + when 3 => result(i) := aBin3(aBinIndex(i)) ; + when 4 => result(i) := aBin4(aBinIndex(i)) ; + when 5 => result(i) := aBin5(aBinIndex(i)) ; + when 6 => result(i) := aBin6(aBinIndex(i)) ; + when 7 => result(i) := aBin7(aBinIndex(i)) ; + when 8 => result(i) := aBin8(aBinIndex(i)) ; + when 9 => result(i) := aBin9(aBinIndex(i)) ; + when 10 => result(i) := aBin10(aBinIndex(i)) ; + when 11 => result(i) := aBin11(aBinIndex(i)) ; + when 12 => result(i) := aBin12(aBinIndex(i)) ; + when 13 => result(i) := aBin13(aBinIndex(i)) ; + when 14 => result(i) := aBin14(aBinIndex(i)) ; + when 15 => result(i) := aBin15(aBinIndex(i)) ; + when 16 => result(i) := aBin16(aBinIndex(i)) ; + when 17 => result(i) := aBin17(aBinIndex(i)) ; + when 18 => result(i) := aBin18(aBinIndex(i)) ; + when 19 => result(i) := aBin19(aBinIndex(i)) ; + when 20 => result(i) := aBin20(aBinIndex(i)) ; + when others => + -- pure functions cannot use alert and/or print + report "CoveragePkg.AddCross: More than 20 bins not supported" + severity FAILURE ; + end case ; + end loop ; + return result ; + end function ConcatenateBins ; + + + ------------------------------------------------------------ + function MergeState( CrossBins : CovBinType) return integer is + -- package local, Used by AddCross, GenCross + ------------------------------------------------------------ + variable resultState : integer ; + begin + resultState := COV_COUNT ; + for i in CrossBins'range loop + if CrossBins(i).action = COV_ILLEGAL then + return COV_ILLEGAL ; + end if ; + if CrossBins(i).action = COV_IGNORE then + resultState := COV_IGNORE ; + end if ; + end loop ; + return resultState ; + end function MergeState ; + + + ------------------------------------------------------------ + function MergeBinVal( CrossBins : CovBinType) return RangeArrayType is + -- package local, Used by AddCross, GenCross + ------------------------------------------------------------ + alias aCrossBins : CovBinType(1 to CrossBins'length) is CrossBins ; + variable BinVal : RangeArrayType(aCrossBins'range) ; + begin + for i in aCrossBins'range loop + BinVal(i to i) := aCrossBins(i).BinVal ; + end loop ; + return BinVal ; + end function MergeBinVal ; + + + ------------------------------------------------------------ + function MergeAtLeast( + -- package local, Used by AddCross, GenCross + ------------------------------------------------------------ + Action : in integer ; + AtLeast : in integer ; + CrossBins : in CovBinType + ) return integer is + variable Result : integer := AtLeast ; + begin + if Action /= COV_COUNT then + return 0 ; + end if ; + for i in CrossBins'range loop + if CrossBins(i).Action = Action then + Result := maximum (Result, CrossBins(i).AtLeast) ; + end if ; + end loop ; + return result ; + end function MergeAtLeast ; + + + ------------------------------------------------------------ + function MergeWeight( + -- package local, Used by AddCross, GenCross + ------------------------------------------------------------ + Action : in integer ; + Weight : in integer ; + CrossBins : in CovBinType + ) return integer is + variable Result : integer := Weight ; + begin + if Action /= COV_COUNT then + return 0 ; + end if ; + for i in CrossBins'range loop + if CrossBins(i).Action = Action then + Result := maximum (Result, CrossBins(i).Weight) ; + end if ; + end loop ; + return result ; + end function MergeWeight ; + + + ------------------------------------------------------------ VendorCov + -- VendorCov Conversion for Vendor supported functional coverage modeling + function ToVendorCovBinVal (BinVal : RangeArrayType) return VendorCovRangeArrayType is + ------------------------------------------------------------ + variable VendorCovBinVal : VendorCovRangeArrayType(BinVal'range); + begin -- VendorCov + for ArrIdx in BinVal'LEFT to BinVal'RIGHT loop -- VendorCov + VendorCovBinVal(ArrIdx) := (min => BinVal(ArrIdx).min, -- VendorCov + max => BinVal(ArrIdx).max) ; -- VendorCov + end loop; -- VendorCov + return VendorCovBinVal ; + end function ToVendorCovBinVal ; + + + ------------------------------------------------------------ + function ToMinPoint (A : RangeArrayType) return integer is + -- Used in testing + ------------------------------------------------------------ + begin + return A(A'left).min ; + end function ToMinPoint ; + + + ------------------------------------------------------------ + function ToMinPoint (A : RangeArrayType) return integer_vector is + -- Used in testing + ------------------------------------------------------------ + variable result : integer_vector(A'range) ; + begin + for i in A'range loop + result(i) := A(i).min ; + end loop ; + return result ; + end function ToMinPoint ; + + + ------------------------------------------------------------ + procedure ToRandPoint( + ------------------------------------------------------------ + variable RV : inout RandomPType ; + constant BinVal : in RangeArrayType ; + variable result : out integer + ) is + begin + result := RV.RandInt(BinVal(BinVal'left).min, BinVal(BinVal'left).max) ; + end procedure ToRandPoint ; + + + ------------------------------------------------------------ + procedure ToRandPoint( + ------------------------------------------------------------ + variable RV : inout RandomPType ; + constant BinVal : in RangeArrayType ; + variable result : out integer_vector + ) is + variable VectorVal : integer_vector(BinVal'range) ; + begin + for i in BinVal'range loop + VectorVal(i) := RV.RandInt(BinVal(i).min, BinVal(i).max) ; + end loop ; + result := VectorVal ; + end procedure ToRandPoint ; + + ------------------------------------------------------------ + -- Local. Get first word from a string + function GetWord (Message : string) return string is + ------------------------------------------------------------ + alias aMessage : string( 1 to Message'length) is Message ; + begin + for i in aMessage'range loop + if aMessage(i) = ' ' or aMessage(i) = HT then + return aMessage(1 to i-1) ; + end if ; + end loop ; + return aMessage ; + end function GetWord ; + + ------------------------------------------------------------ + -- Local -- long term move to MessagePkg? Used by WriteCovDb + procedure WriteMessage ( file f : text ; variable Message : inout MessagePType ) is + ------------------------------------------------------------ + variable buf : line ; + begin + for i in 1 to Message.GetCount loop + write(buf, string'(Message.Get(i))) ; + writeline(f, buf) ; + end loop ; + end procedure WriteMessage ; + + ------------------------------------------------------------------------------------------ + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + ------------------------------------------------------------------------------------------ + type CovPType is protected body + + -- Name Data Structure + variable CovNameVar : NamePType ; + variable CovMessageVar : MessagePType ; + + -- Handle into Vendor Data Structure -- VendorCov + variable VendorCovHandleVar : VendorCovHandleType := 0 ; -- VendorCov + + -- CoverageBin Data Structures + type RangeArrayPtrType is access RangeArrayType ; + + type CovBinBaseTempType is record + BinVal : RangeArrayPtrType ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + PercentCov : real ; + OrderCount : integer ; + Name : line ; + end record CovBinBaseTempType ; + type CovBinTempType is array (natural range <>) of CovBinBaseTempType ; + type CovBinPtrType is access CovBinTempType ; + + variable CovBinPtr : CovBinPtrType ; + variable NumBins : integer := 0 ; + variable BinValLength : integer := 1 ; + variable OrderCount : integer := 0 ; -- for statistics + variable ItemCount : integer := 0 ; -- Count of randomizations + variable LastIndex : integer := 1 ; -- Index of last randomization + + -- Internal Modes and Names + variable IllegalMode : IllegalModeType := ILLEGAL_ON ; + variable IllegalModeLevel : AlertType := ERROR ; + variable WeightMode : WeightModeType := AT_LEAST ; + variable WeightScale : real := 1.0 ; + + variable ThresholdingEnable : boolean := FALSE ; -- thresholding disabled by default + variable CovThreshold : real := 45.0 ; + variable CovTarget : real := 100.0 ; + + variable MergingEnable : boolean := FALSE ; -- merging disabled by default + variable CountMode : CountModeType := COUNT_FIRST ; + + -- Randomization Variable + variable RV : RandomPType ; + variable RvSeedInit : boolean := FALSE ; + + file WriteBinFile : text ; + variable WriteBinFileInit : boolean := FALSE ; + variable UsingLocalFile : boolean := FALSE ; + variable AlertLogIDVar : AlertLogIDType := OSVVM_ALERTLOG_ID ; + + -- file WriteCovDbFile : text ; + -- variable WriteCovDbFileInit : boolean := FALSE ; + + -- Local WriteBin and WriteCovHoles formatting settings, defaults determined by CoverageGlobals + variable WritePassFailVar : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + variable WriteBinInfoVar : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + variable WriteCountVar : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + variable WriteAnyIllegalVar : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + variable WritePrefixVar : NamePType ; + variable PassNameVar : NamePType ; + variable FailNameVar : NamePType ; + + + ------------------------------------------------------------ + procedure FileOpenWriteBin (FileName : string; OpenKind : File_Open_Kind ) is + ------------------------------------------------------------ + begin + WriteBinFileInit := TRUE ; + file_open( WriteBinFile , FileName , OpenKind ); + end procedure FileOpenWriteBin ; + + ------------------------------------------------------------ + procedure FileCloseWriteBin is + ------------------------------------------------------------ + begin + WriteBinFileInit := FALSE ; + file_close( WriteBinFile) ; + end procedure FileCloseWriteBin ; + + ------------------------------------------------------------ + procedure SetAlertLogID (A : AlertLogIDType) is + ------------------------------------------------------------ + begin + AlertLogIDVar := A ; + end procedure SetAlertLogID ; + + ------------------------------------------------------------ + procedure SetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogIDVar := GetAlertLogID(Name, ParentID, CreateHierarchy) ; + if not RvSeedInit then -- Init seed if not initialized + RV.InitSeed(Name) ; + RvSeedInit := TRUE ; + end if ; + end procedure SetAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogID return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogIDVar ; + end function GetAlertLogID ; + + +-- ------------------------------------------------------------ +-- procedure FileOpen (FileName : string; OpenKind : File_Open_Kind ) is +-- ------------------------------------------------------------ +-- begin +-- WriteCovDbFileInit := TRUE ; +-- file_open( WriteCovDbFile , FileName , OpenKind ); +-- end procedure FileOpenWriteCovDb ; +-- +-- ------------------------------------------------------------ +-- procedure FileCloseWriteCovDb is +-- ------------------------------------------------------------ +-- begin +-- WriteCovDbFileInit := FALSE ; +-- file_close( WriteCovDbFile ); +-- end procedure FileCloseWriteCovDb ; + + ------------------------------------------------------------ + procedure SetName (Name : String) is + ------------------------------------------------------------ + begin + CovNameVar.Set(Name) ; + -- Update if name updated after model created -- VendorCov + if IsInitialized then -- VendorCov + VendorCovSetName(VendorCovHandleVar, Name) ; -- VendorCov + end if ; -- VendorCov + if not RvSeedInit then -- Init seed if not initialized + RV.InitSeed(Name) ; + RvSeedInit := TRUE ; + end if ; + end procedure SetName ; + + ------------------------------------------------------------ + impure function SetName (Name : String) return string is + ------------------------------------------------------------ + begin + SetName(Name) ; -- call procedure above + return Name ; + end function SetName ; + + ------------------------------------------------------------ + impure function GetName return String is + ------------------------------------------------------------ + begin + return CovNameVar.Get("") ; + end function GetName ; + + ------------------------------------------------------------ + impure function GetCovModelName return String is + ------------------------------------------------------------ + begin + if CovNameVar.IsSet then + -- return Name if set + return CovNameVar.Get ; + elsif AlertLogIDVar /= OSVVM_ALERTLOG_ID then + -- otherwise return AlertLogName if it is set + return GetAlertLogName(AlertLogIDVar) ; + elsif CovMessageVar.IsSet then + -- otherwise Get the first word of the Message if it is set + return GetWord(string'(CovMessageVar.Get(1))) ; + else + return "" ; + end if ; + end function GetCovModelName ; + + ------------------------------------------------------------ + impure function GetNamePlus(prefix, suffix : string) return String is + ------------------------------------------------------------ + begin + if CovNameVar.IsSet then + -- return Name if set + return prefix & CovNameVar.Get & suffix ; + elsif AlertLogIDVar = OSVVM_ALERTLOG_ID and CovMessageVar.IsSet then + -- If AlertLogID not set, then use Message + return prefix & GetWord(string'(CovMessageVar.Get(1))) & suffix ; + else + return "" ; + end if ; + end function GetNamePlus ; + + ------------------------------------------------------------ + procedure SetMessage (Message : String) is + ------------------------------------------------------------ + begin + CovMessageVar.Set(Message) ; + -- VendorCov update if name updated after model created + if IsInitialized then -- VendorCov + -- Refine this? If CovNameVar or AlertLogIDName is set, -- VendorCov + -- it may be set to the same name again. -- VendorCov + VendorCovSetName(VendorCovHandleVar, GetCovModelName) ; -- VendorCov + end if ; -- VendorCov + if not RvSeedInit then -- Init seed if not initialized + RV.InitSeed(Message) ; + RvSeedInit := TRUE ; + end if ; + end procedure SetMessage ; + + ------------------------------------------------------------ + procedure SetIllegalMode (A : IllegalModeType) is + ------------------------------------------------------------ + begin + IllegalMode := A ; + if IllegalMode = ILLEGAL_FAILURE then + IllegalModeLevel := FAILURE ; + else + IllegalModeLevel := ERROR ; + end if ; + end procedure SetIllegalMode ; + + ------------------------------------------------------------ + procedure SetWeightMode (A : WeightModeType; Scale : real := 1.0) is + ------------------------------------------------------------ + variable buf : line ; + begin + WeightMode := A ; + WeightScale := Scale ; + + if (WeightMode = REMAIN_EXP) and (WeightScale > 2.0) then + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.SetWeightMode:" & + " WeightScale > 2.0 and large Counts can cause RandCovPoint to fail due to integer values out of range", WARNING) ; + end if ; + if (WeightScale < 1.0) and (WeightMode = REMAIN_WEIGHT or WeightMode = REMAIN_SCALED) then + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.SetWeightMode:" & + " WeightScale must be > 1.0 when WeightMode = REMAIN_WEIGHT or WeightMode = REMAIN_SCALED", FAILURE) ; + WeightScale := 1.0 ; + end if; + if WeightScale <= 0.0 then + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.SetWeightMode:" & + " WeightScale must be > 0.0", FAILURE) ; + WeightScale := 1.0 ; + end if; + end procedure SetWeightMode ; + + ------------------------------------------------------------ + -- pt local for now -- file formal parameter not allowed with a public method + procedure WriteBinName ( file f : text ; S : string ; Prefix : string := "%% " ) is + ------------------------------------------------------------ + variable MessageCount : integer ; + variable MessageIndex : integer := 1 ; + variable buf : line ; + begin + MessageCount := CovMessageVar.GetCount ; + if MessageCount = 0 then + write(buf, Prefix & S & GetCovModelName) ; -- Print name when no message + writeline(f, buf) ; + else + if CovNameVar.IsSet then + -- Print Name if set + write(buf, Prefix & S & CovNameVar.Get) ; + elsif AlertLogIDVar /= OSVVM_ALERTLOG_ID then + -- otherwise Print AlertLogName if it is set + write(buf, Prefix & S & string'(GetAlertLogName(AlertLogIDVar)) ) ; + else + -- otherwise print the first line of the message + MessageIndex := 2 ; + write(buf, Prefix & S & string'(CovMessageVar.Get(1))) ; + end if ; + writeline(f, buf) ; + for i in MessageIndex to MessageCount loop + write(buf, Prefix & string'(CovMessageVar.Get(i))) ; + writeline(f, buf) ; + end loop ; + end if ; + end procedure WriteBinName ; + + ------------------------------------------------------------ + procedure DeallocateMessage is + ------------------------------------------------------------ + begin + CovMessageVar.Deallocate ; + end procedure DeallocateMessage ; + + ------------------------------------------------------------ + procedure DeallocateName is + ------------------------------------------------------------ + begin + CovNameVar.Clear ; + end procedure DeallocateName ; + + ------------------------------------------------------------ + procedure SetThresholding (A : boolean := TRUE ) is + ------------------------------------------------------------ + begin + ThresholdingEnable := A ; + end procedure SetThresholding ; + + ------------------------------------------------------------ + procedure SetCovThreshold (Percent : real) is + ------------------------------------------------------------ + begin + ThresholdingEnable := TRUE ; + if Percent >= 0.0 then + CovThreshold := Percent + 0.0001 ; -- used in less than + else + CovThreshold := 0.0001 ; -- used in less than + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.SetCovThreshold:" & + " Invalid Threshold Value " & real'image(Percent), FAILURE) ; + end if ; + end procedure SetCovThreshold ; + + ------------------------------------------------------------ + procedure SetCovTarget (Percent : real) is + ------------------------------------------------------------ + begin + CovTarget := Percent ; + end procedure SetCovTarget ; + + ------------------------------------------------------------ + impure function GetCovTarget return real is + ------------------------------------------------------------ + begin + return CovTarget ; + end function GetCovTarget ; + + ------------------------------------------------------------ + procedure SetMerging (A : boolean := TRUE ) is + ------------------------------------------------------------ + begin + MergingEnable := A ; + end procedure SetMerging ; + + ------------------------------------------------------------ + procedure SetCountMode (A : CountModeType) is + ------------------------------------------------------------ + begin + CountMode := A ; + end procedure SetCountMode ; + + ------------------------------------------------------------ + procedure InitSeed (S : string ) is + ------------------------------------------------------------ + begin + RV.InitSeed(S) ; + RvSeedInit := TRUE ; + end procedure InitSeed ; + + ------------------------------------------------------------ + impure function InitSeed (S : string ) return string is + ------------------------------------------------------------ + begin + RV.InitSeed(S) ; + RvSeedInit := TRUE ; + return S ; + end function InitSeed ; + + ------------------------------------------------------------ + procedure InitSeed (I : integer ) is + ------------------------------------------------------------ + begin + RV.InitSeed(I) ; + RvSeedInit := TRUE ; + end procedure InitSeed ; + + ------------------------------------------------------------ + procedure SetSeed (RandomSeedIn : RandomSeedType ) is + ------------------------------------------------------------ + begin + RV.SetSeed(RandomSeedIn) ; + RvSeedInit := TRUE ; + end procedure SetSeed ; + + ------------------------------------------------------------ + impure function GetSeed return RandomSeedType is + ------------------------------------------------------------ + begin + return RV.GetSeed ; + end function GetSeed ; + + ------------------------------------------------------------ + procedure SetReportOptions ( + ------------------------------------------------------------ + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + begin + if WritePassFail /= COV_OPT_INIT_PARM_DETECT then + WritePassFailVar := WritePassFail ; + end if ; + if WriteBinInfo /= COV_OPT_INIT_PARM_DETECT then + WriteBinInfoVar := WriteBinInfo ; + end if ; + if WriteCount /= COV_OPT_INIT_PARM_DETECT then + WriteCountVar := WriteCount ; + end if ; + if WriteAnyIllegal /= COV_OPT_INIT_PARM_DETECT then + WriteAnyIllegalVar := WriteAnyIllegal ; + end if ; + if WritePrefix /= OSVVM_STRING_INIT_PARM_DETECT then + WritePrefixVar.Set(WritePrefix) ; + end if ; + if PassName /= OSVVM_STRING_INIT_PARM_DETECT then + PassNameVar.Set(PassName) ; + end if ; + if FailName /= OSVVM_STRING_INIT_PARM_DETECT then + FailNameVar.Set(FailName) ; + end if ; + end procedure SetReportOptions ; + + + ------------------------------------------------------------ + procedure SetBinSize (NewNumBins : integer) is + -- Sets a CovBin to a particular size + -- Use for small bins to save space or large bins to + -- suppress the resize and copy as a CovBin autosizes. + ------------------------------------------------------------ + variable oldCovBinPtr : CovBinPtrType ; + begin + if CovBinPtr = NULL then + CovBinPtr := new CovBinTempType(1 to NewNumBins) ; + elsif NewNumBins > CovBinPtr'length then + -- make message bigger + oldCovBinPtr := CovBinPtr ; + CovBinPtr := new CovBinTempType(1 to NewNumBins) ; + CovBinPtr.all(1 to NumBins) := oldCovBinPtr.all(1 to NumBins) ; + deallocate(oldCovBinPtr) ; + end if ; + end procedure SetBinSize ; + + ------------------------------------------------------------ + -- pt local + procedure CheckBinValLength( CurBinValLength : integer ; Caller : string ) is + begin + if NumBins = 0 then + BinValLength := CurBinValLength ; -- number of points in cross + else + AlertIf(AlertLogIDVar, BinValLength /= CurBinValLength, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg." & Caller & ":" & + " Cross coverage bins of different dimensions prohibited", FAILURE) ; + end if; + end procedure CheckBinValLength ; + + ------------------------------------------------------------ + -- pt local + impure function NormalizeNumBins( ReqNumBins : integer ) return integer is + variable NormNumBins : integer := MIN_NUM_BINS ; + begin + while NormNumBins < ReqNumBins loop + NormNumBins := NormNumBins + MIN_NUM_BINS ; + end loop ; + return NormNumBins ; + end function NormalizeNumBins ; + + + ------------------------------------------------------------ + -- pt local + procedure GrowBins (ReqNumBins : integer) is + variable oldCovBinPtr : CovBinPtrType ; + variable NewNumBins : integer ; + begin + NewNumBins := NumBins + ReqNumBins ; + if CovBinPtr = NULL then + CovBinPtr := new CovBinTempType(1 to NormalizeNumBins(NewNumBins)) ; + elsif NewNumBins > CovBinPtr'length then + -- make message bigger + oldCovBinPtr := CovBinPtr ; + CovBinPtr := new CovBinTempType(1 to NormalizeNumBins(NewNumBins)) ; + CovBinPtr.all(1 to NumBins) := oldCovBinPtr.all(1 to NumBins) ; + deallocate(oldCovBinPtr) ; + end if ; + end procedure GrowBins ; + + + ------------------------------------------------------------ + -- pt local, called by InsertBin + -- Finds index of bin if it is inside an existing bins + procedure FindBinInside( + BinVal : RangeArrayType ; + Position : out integer ; + FoundInside : out boolean + ) is + begin + Position := NumBins + 1 ; + FoundInside := FALSE ; + FindLoop : for i in NumBins downto 1 loop + -- skip this CovBin if CovPoint is not in it + next FindLoop when not inside(BinVal, CovBinPtr(i).BinVal.all) ; + Position := i ; + FoundInside := TRUE ; + exit ; + end loop ; + end procedure FindBinInside ; + + ------------------------------------------------------------ + -- pt local + -- Inserts values into a new bin. + -- Called by InsertBin + procedure InsertNewBin( + BinVal : RangeArrayType ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + Name : string ; + PercentCov : real + ) is + begin + if (not IsInitialized) then -- VendorCov + if (BinVal'length > 1) then -- Cross Bin -- VendorCov + VendorCovHandleVar := VendorCovCrossCreate(GetCovModelName) ; -- VendorCov + else -- VendorCov + VendorCovHandleVar := VendorCovPointCreate(GetCovModelName); -- VendorCov + end if; -- VendorCov + end if; -- VendorCov + VendorCovBinAdd(VendorCovHandleVar, ToVendorCovBinVal(BinVal), Action, AtLeast, Name) ; -- VendorCov + NumBins := NumBins + 1 ; + CovBinPtr.all(NumBins).BinVal := new RangeArrayType'(BinVal) ; + CovBinPtr.all(NumBins).Action := Action ; + CovBinPtr.all(NumBins).Count := Count ; + CovBinPtr.all(NumBins).AtLeast := AtLeast ; + CovBinPtr.all(NumBins).Weight := Weight ; + CovBinPtr.all(NumBins).Name := new String'(Name) ; + CovBinPtr.all(NumBins).PercentCov := PercentCov ; + CovBinPtr.all(NumBins).OrderCount := 0 ; --- Metrics for evaluating randomization order Temp + end procedure InsertNewBin ; + + + ------------------------------------------------------------ + -- pt local + -- Inserts values into a new bin. + -- Called by InsertBin + procedure MergeBin ( + Position : Natural ; + Count : integer ; + AtLeast : integer ; + Weight : integer + ) is + begin + CovBinPtr.all(Position).Count := CovBinPtr.all(Position).Count + Count ; + CovBinPtr.all(Position).AtLeast := CovBinPtr.all(Position).AtLeast + AtLeast ; + CovBinPtr.all(Position).Weight := CovBinPtr.all(Position).Weight + Weight ; + CovBinPtr.all(Position).PercentCov := CalcPercentCov( + Count => CovBinPtr.all(Position).Count, + AtLeast => CovBinPtr.all(Position).AtLeast ) ; + end procedure MergeBin ; + + + ------------------------------------------------------------ + -- pt local + -- All insertion comes here + -- Enforces the general insertion use model: + -- Earlier bins supercede later bins - except with COUNT_ALL + -- Add Illegal and Ignore bins first to remove regions of larger count bins + -- Later ignore bins can be used to miss an illegal catch-all + -- Add Illegal bins last as a catch-all to find things that missed other bins + procedure InsertBin( + BinVal : RangeArrayType ; + Action : integer ; + Count : integer ; + AtLeast : integer ; + Weight : integer ; + Name : string + ) is + variable Position : integer ; + variable FoundInside : boolean ; + variable PercentCov : real ; + begin + PercentCov := CalcPercentCov(Count => Count, AtLeast => AtLeast) ; + + if not MergingEnable then + InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; + + else -- handle merging +-- future optimization, FindBinInside only checks against Ignore and Illegal bins + FindBinInside(BinVal, Position, FoundInside) ; + + if not FoundInside then + InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; + + elsif Action = COV_COUNT then +-- when check only ignore and illegal bins, only action is to drop + if CovBinPtr.all(Position).Action /= COV_COUNT then + null ; -- drop count bin when it is inside a Illegal or Ignore bin + + elsif CovBinPtr.all(Position).BinVal.all = BinVal and CovBinPtr.all(Position).Name.all = Name then + -- Bins match, so merge the count values + MergeBin (Position, Count, AtLeast, Weight) ; + else + -- Bins overlap, but do not match, insert new bin + InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; + end if; + + elsif Action = COV_IGNORE then +-- when check only ignore and illegal bins, only action is to report error + if CovBinPtr.all(Position).Action = COV_COUNT then + InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; + else + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.InsertBin (AddBins/AddCross):" & + " ignore bin dropped. It is a subset of prior bin", ERROR) ; + end if; + + elsif Action = COV_ILLEGAL then +-- when check only ignore and illegal bins, only action is to report error + if CovBinPtr.all(Position).Action = COV_COUNT then + InsertNewBin(BinVal, Action, Count, AtLeast, Weight, Name, PercentCov) ; + else + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.InsertBin (AddBins/AddCross):" & + " illegal bin dropped. It is a subset of prior bin", ERROR) ; + end if; + end if ; + end if ; -- merging enabled + end procedure InsertBin ; + + + ------------------------------------------------------------ + procedure AddBins ( + ------------------------------------------------------------ + Name : String ; + AtLeast : integer ; + Weight : integer ; + CovBin : CovBinType + ) is + variable calcAtLeast : integer ; + variable calcWeight : integer ; + begin + CheckBinValLength( 1, "AddBins") ; + + GrowBins(CovBin'length) ; + for i in CovBin'range loop + if CovBin(i).Action = COV_COUNT then + calcAtLeast := maximum(AtLeast, CovBin(i).AtLeast) ; + calcWeight := maximum(Weight, CovBin(i).Weight) ; + else + calcAtLeast := 0 ; + calcWeight := 0 ; + end if ; + InsertBin( + BinVal => CovBin(i).BinVal, + Action => CovBin(i).Action, + Count => CovBin(i).Count, + AtLeast => calcAtLeast, + Weight => calcWeight, + Name => Name + ) ; + end loop ; + end procedure AddBins ; + + + ------------------------------------------------------------ + procedure AddBins ( Name : String ; AtLeast : integer ; CovBin : CovBinType ) is + ------------------------------------------------------------ + begin + AddBins(Name, AtLeast, 0, CovBin) ; + end procedure AddBins ; + + + ------------------------------------------------------------ + procedure AddBins (Name : String ; CovBin : CovBinType) is + ------------------------------------------------------------ + begin + AddBins(Name, 0, 0, CovBin) ; + end procedure AddBins ; + + + ------------------------------------------------------------ + procedure AddBins ( AtLeast : integer ; Weight : integer ; CovBin : CovBinType ) is + ------------------------------------------------------------ + begin + AddBins("", AtLeast, Weight, CovBin) ; + end procedure AddBins ; + + + ------------------------------------------------------------ + procedure AddBins ( AtLeast : integer ; CovBin : CovBinType ) is + ------------------------------------------------------------ + begin + AddBins("", AtLeast, 0, CovBin) ; + end procedure AddBins ; + + + ------------------------------------------------------------ + procedure AddBins ( CovBin : CovBinType ) is + ------------------------------------------------------------ + begin + AddBins("", 0, 0, CovBin) ; + end procedure AddBins ; + + + ------------------------------------------------------------ + procedure AddCross( + ------------------------------------------------------------ + Name : string ; + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) is + constant BIN_LENS : integer_vector := + BinLengths( + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 + ) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable calcAction, calcCount, calcAtLeast, calcWeight : integer ; + variable calcBinVal : RangeArrayType(BinIndex'range) ; + begin + CheckBinValLength( BIN_LENS'length, "AddCross") ; + + GrowBins(NUM_NEW_BINS) ; + calcCount := 0 ; + for MatrixIndex in 1 to NUM_NEW_BINS loop + CrossBins := ConcatenateBins(BinIndex, + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 + ) ; + calcAction := MergeState(CrossBins) ; + calcBinVal := MergeBinVal(CrossBins) ; + calcAtLeast := MergeAtLeast( calcAction, AtLeast, CrossBins) ; + calcWeight := MergeWeight ( calcAction, Weight, CrossBins) ; + InsertBin(calcBinVal, calcAction, calcCount, calcAtLeast, calcWeight, Name) ; + IncBinIndex( BinIndex, BIN_LENS) ; -- increment right most one, then if overflow, increment next + end loop ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross( + ------------------------------------------------------------ + Name : string ; + AtLeast : integer ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) is + begin + AddCross(Name, AtLeast, 0, + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 + ) ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross( + ------------------------------------------------------------ + Name : string ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) is + begin + AddCross(Name, 0, 0, + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 + ) ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross( + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) is + begin + AddCross("", AtLeast, Weight, + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 + ) ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross( + ------------------------------------------------------------ + AtLeast : integer ; + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) is + begin + AddCross("", AtLeast, 0, + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 + ) ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross( + ------------------------------------------------------------ + Bin1, Bin2 : CovBinType ; + Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, Bin12, Bin13, + Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 : CovBinType := NULL_BIN + ) is + begin + AddCross("", 0, 0, + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9, Bin10, Bin11, + Bin12, Bin13, Bin14, Bin15, Bin16, Bin17, Bin18, Bin19, Bin20 + ) ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure Deallocate is + ------------------------------------------------------------ + begin + for i in 1 to NumBins loop + deallocate(CovBinPtr(i).BinVal) ; + deallocate(CovBinPtr(i).Name) ; + end loop ; + deallocate(CovBinPtr) ; + DeallocateName ; + DeallocateMessage ; + -- Restore internal variables to their default values + NumBins := 0 ; + OrderCount := 0 ; + BinValLength := 1 ; + IllegalMode := ILLEGAL_ON ; + WeightMode := AT_LEAST ; + WeightScale := 1.0 ; + ThresholdingEnable := FALSE ; + CovThreshold := 45.0 ; + CovTarget := 100.0 ; + MergingEnable := FALSE ; + CountMode := COUNT_FIRST ; + AlertLogIDVar := OSVVM_ALERTLOG_ID ; + -- RvSeedInit := FALSE ; + WritePassFailVar := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfoVar := COV_OPT_INIT_PARM_DETECT ; + WriteCountVar := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegalVar := COV_OPT_INIT_PARM_DETECT ; + WritePrefixVar.deallocate ; + PassNameVar.deallocate ; + FailNameVar.deallocate ; + end procedure deallocate ; + + + ------------------------------------------------------------ + -- Local + procedure ICoverIndex( Index : integer ; CovPoint : integer_vector ) is + ------------------------------------------------------------ + variable buf : line ; + begin + -- Update Count, PercentCov + CovBinPtr(Index).Count := CovBinPtr(Index).Count + CovBinPtr(Index).action ; + VendorCovBinInc(VendorCovHandleVar, Index); -- VendorCov + CovBinPtr(Index).PercentCov := CalcPercentCov( + Count => CovBinPtr.all(Index).Count, + AtLeast => CovBinPtr.all(Index).AtLeast ) ; + -- OrderCount handling - Statistics + OrderCount := OrderCount + 1 ; + CovBinPtr(Index).OrderCount := OrderCount + CovBinPtr(Index).OrderCount ; + if CovBinPtr(Index).action = COV_ILLEGAL then + if IllegalMode /= ILLEGAL_OFF then + if CovPoint = NULL_INTV then + alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.ICoverLast:" & + " Value randomized is in an illegal bin.", IllegalModeLevel) ; + else + write(buf, CovPoint) ; + alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.ICover:" & + " Value " & buf.all & " is in an illegal bin.", IllegalModeLevel) ; + deallocate(buf) ; + end if ; + else + IncAlertCount(AlertLogIDVar, ERROR) ; -- silent alert. + end if ; + end if ; + end procedure ICoverIndex ; + + + ------------------------------------------------------------ + procedure ICoverLast is + ------------------------------------------------------------ + begin + ICoverIndex(LastIndex, NULL_INTV) ; + end procedure ICoverLast ; + + + ------------------------------------------------------------ + procedure ICover ( CovPoint : integer) is + ------------------------------------------------------------ + begin + ICover((1=> CovPoint)) ; + end procedure ICover ; + + + ------------------------------------------------------------ + procedure ICover( CovPoint : integer_vector) is + ------------------------------------------------------------ + begin + if CovPoint'length /= BinValLength then + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg." & + " ICover: CovPoint length = " & to_string(CovPoint'length) & + " does not match Coverage Bin dimensions = " & to_string(BinValLength), FAILURE) ; + elsif CountMode = COUNT_FIRST and inside(CovPoint, CovBinPtr(LastIndex).BinVal.all) then + ICoverIndex(LastIndex, CovPoint) ; + else + CovLoop : for i in 1 to NumBins loop + -- skip this CovBin if CovPoint is not in it + next CovLoop when not inside(CovPoint, CovBinPtr(i).BinVal.all) ; + -- Mark Covered + ICoverIndex(i, CovPoint) ; + exit CovLoop when CountMode = COUNT_FIRST ; -- only find first one + end loop CovLoop ; + end if ; + end procedure ICover ; + + + ------------------------------------------------------------ + procedure ClearCov is + ------------------------------------------------------------ + begin + for i in 1 to NumBins loop + CovBinPtr(i).Count := 0 ; + CovBinPtr(i).PercentCov := CalcPercentCov( + Count => CovBinPtr.all(i).Count, + AtLeast => CovBinPtr.all(i).AtLeast ) ; + CovBinPtr(i).OrderCount := 0 ; + end loop ; + OrderCount := 0 ; + end procedure ClearCov ; + + ------------------------------------------------------------ + -- deprecated + procedure SetCovZero is + ------------------------------------------------------------ + begin + ClearCov ; + end procedure SetCovZero ; + + ------------------------------------------------------------ + impure function IsInitialized return boolean is + ------------------------------------------------------------ + begin + return NumBins > 0 ; + end function IsInitialized ; + + + ------------------------------------------------------------ + impure function GetNumBins return integer is + ------------------------------------------------------------ + begin + return NumBins ; + end function GetNumBins ; + + + ------------------------------------------------------------ + impure function GetMinIndex return integer is + ------------------------------------------------------------ + variable MinCov : real := real'right ; -- big number + variable MinIndex : integer := NumBins ; + begin + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < MinCov then + MinCov := CovBinPtr(i).PercentCov ; + MinIndex := i ; + end if ; + end loop CovLoop ; + return MinIndex ; + end function GetMinIndex ; + + + ------------------------------------------------------------ + impure function GetMinCov return real is + ------------------------------------------------------------ + variable MinCov : real := real'right ; -- big number + begin + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < MinCov then + MinCov := CovBinPtr(i).PercentCov ; + end if ; + end loop CovLoop ; + return MinCov ; + end function GetMinCov ; + + + ------------------------------------------------------------ + impure function GetMinCount return integer is + ------------------------------------------------------------ + variable MinCount : integer := integer'right ; -- big number + begin + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < MinCount then + MinCount := CovBinPtr(i).Count ; + end if ; + end loop CovLoop ; + return MinCount ; + end function GetMinCount ; + + + ------------------------------------------------------------ + impure function GetMaxIndex return integer is + ------------------------------------------------------------ + variable MaxCov : real := 0.0 ; + variable MaxIndex : integer := NumBins ; + begin + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov > MaxCov then + MaxCov := CovBinPtr(i).PercentCov ; + MaxIndex := i ; + end if ; + end loop CovLoop ; + return MaxIndex ; + end function GetMaxIndex ; + + + ------------------------------------------------------------ + impure function GetMaxCov return real is + ------------------------------------------------------------ + variable MaxCov : real := 0.0 ; + begin + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov > MaxCov then + MaxCov := CovBinPtr(i).PercentCov ; + end if ; + end loop CovLoop ; + return MaxCov ; + end function GetMaxCov ; + + + ------------------------------------------------------------ + impure function GetMaxCount return integer is + ------------------------------------------------------------ + variable MaxCount : integer := 0 ; + begin + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count > MaxCount then + MaxCount := CovBinPtr(i).Count ; + end if ; + end loop CovLoop ; + return MaxCount ; + end function GetMaxCount ; + + + ------------------------------------------------------------ + impure function CountCovHoles ( PercentCov : real ) return integer is + ------------------------------------------------------------ + variable HoleCount : integer := 0 ; + begin + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < PercentCov then + HoleCount := HoleCount + 1 ; + end if ; + end loop CovLoop ; + return HoleCount ; + end function CountCovHoles ; + + + ------------------------------------------------------------ + impure function CountCovHoles return integer is + ------------------------------------------------------------ + begin + return CountCovHoles(CovTarget) ; + end function CountCovHoles ; + + + ------------------------------------------------------------ + impure function IsCovered ( PercentCov : real ) return boolean is + ------------------------------------------------------------ + begin + -- AlertIf(NumBins < 1, OSVVM_ALERTLOG_ID, "CoveragePkg.IsCovered: Empty Coverage Model", failure) ; + return CountCovHoles(PercentCov) = 0 ; + end function IsCovered ; + + + ------------------------------------------------------------ + impure function IsCovered return boolean is + ------------------------------------------------------------ + begin + -- AlertIf(NumBins < 1, OSVVM_ALERTLOG_ID, "CoveragePkg.IsCovered: Empty Coverage Model", failure) ; + return CountCovHoles(CovTarget) = 0 ; + end function IsCovered ; + + + ------------------------------------------------------------ + impure function GetCov ( PercentCov : real ) return real is + ------------------------------------------------------------ + variable TotalCovGoal, TotalCovCount, ScaledCovGoal : integer := 0 ; + begin + BinLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT then + ScaledCovGoal := integer(ceil(PercentCov * real(CovBinPtr(i).AtLeast)/100.0)) ; + TotalCovGoal := TotalCovGoal + ScaledCovGoal ; + if CovBinPtr(i).Count <= ScaledCovGoal then + TotalCovCount := TotalCovCount + CovBinPtr(i).Count ; + else + -- do not count the extra values that exceed their cov goal + TotalCovCount := TotalCovCount + ScaledCovGoal ; + end if ; + end if ; + end loop BinLoop ; + return 100.0 * real(TotalCovCount) / real(TotalCovGoal) ; + end function GetCov ; + + + ------------------------------------------------------------ + impure function GetCov return real is + ------------------------------------------------------------ + variable TotalCovGoal, TotalCovCount : integer := 0 ; + begin + return GetCov( CovTarget ) ; + end function GetCov ; + + + ------------------------------------------------------------ + impure function GetItemCount return integer is + ------------------------------------------------------------ + begin + return ItemCount ; + end function GetItemCount ; + + + ------------------------------------------------------------ + impure function GetTotalCovGoal ( PercentCov : real ) return integer is + ------------------------------------------------------------ + variable TotalCovGoal, ScaledCovGoal : integer := 0 ; + begin + BinLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT then + ScaledCovGoal := integer(ceil(PercentCov * real(CovBinPtr(i).AtLeast)/100.0)) ; + TotalCovGoal := TotalCovGoal + ScaledCovGoal ; + end if ; + end loop BinLoop ; + return TotalCovGoal ; + end function GetTotalCovGoal ; + + + ------------------------------------------------------------ + impure function GetTotalCovGoal return integer is + ------------------------------------------------------------ + begin + return GetTotalCovGoal(CovTarget) ; + end function GetTotalCovGoal ; + + + ------------------------------------------------------------ + impure function GetLastIndex return integer is + ------------------------------------------------------------ + begin + return LastIndex ; + end function GetLastIndex ; + + + ------------------------------------------------------------ + impure function GetHoleBinVal ( ReqHoleNum : integer ; PercentCov : real ) return RangeArrayType is + ------------------------------------------------------------ + variable HoleCount : integer := 0 ; + variable buf : line ; + begin + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < PercentCov then + HoleCount := HoleCount + 1 ; + if HoleCount = ReqHoleNum then + return CovBinPtr(i).BinVal.all ; + end if ; + end if ; + end loop CovLoop ; + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.GetHoleBinVal:" & + " did not find a coverage hole. HoleCount = " & integer'image(HoleCount) & + " ReqHoleNum = " & integer'image(ReqHoleNum), ERROR + ) ; + return CovBinPtr(NumBins).BinVal.all ; + + end function GetHoleBinVal ; + + ------------------------------------------------------------ + impure function GetHoleBinVal ( PercentCov : real ) return RangeArrayType is + ------------------------------------------------------------ + begin + return GetHoleBinVal(1, PercentCov) ; + end function GetHoleBinVal ; + + + ------------------------------------------------------------ + impure function GetHoleBinVal ( ReqHoleNum : integer := 1 ) return RangeArrayType is + ------------------------------------------------------------ + begin + return GetHoleBinVal(ReqHoleNum, CovTarget) ; + end function GetHoleBinVal ; + + + ------------------------------------------------------------ + impure function CalcWeight ( BinIndex : integer ; MaxCovPercent : real ) return integer is + -- pt local + ------------------------------------------------------------ + begin + case WeightMode is + when AT_LEAST => -- AtLeast + return CovBinPtr(BinIndex).AtLeast ; + + when WEIGHT => -- Weight + return CovBinPtr(BinIndex).Weight ; + + when REMAIN => -- (Adjust * AtLeast) - Count + return integer( Ceil( MaxCovPercent * real(CovBinPtr(BinIndex).AtLeast)/100.0)) - + CovBinPtr(BinIndex).Count ; + + when REMAIN_EXP => -- Weight * (REMAIN **WeightScale) + -- Experimental may be removed +-- CAUTION: for large numbers and/or WeightScale > 2.0, result can be > 2**31 (max integer value) + -- both Weight and WeightScale default to 1 + return CovBinPtr(BinIndex).Weight * + integer( Ceil ( + ( (MaxCovPercent * real(CovBinPtr(BinIndex).AtLeast)/100.0) - + real(CovBinPtr(BinIndex).Count) ) ** WeightScale ) ); + + when REMAIN_SCALED => -- (WeightScale * Adjust * AtLeast) - Count + -- Experimental may be removed + -- Biases remainder toward AT_LEAST value. + -- WeightScale must be > 1.0 + return integer( Ceil( WeightScale * MaxCovPercent * real(CovBinPtr(BinIndex).AtLeast)/100.0)) - + CovBinPtr(BinIndex).Count ; + + when REMAIN_WEIGHT => -- Weight * ((WeightScale * Adjust * AtLeast) - Count) + -- Experimental may be removed + -- WeightScale must be > 1.0 + return CovBinPtr(BinIndex).Weight * ( + integer( Ceil( WeightScale * MaxCovPercent * real(CovBinPtr(BinIndex).AtLeast)/100.0)) - + CovBinPtr(BinIndex).Count) ; + + end case ; + end function CalcWeight ; + + + ------------------------------------------------------------ + impure function RandHoleIndex ( CovTargetPercent : real ) return integer is + -- pt local + ------------------------------------------------------------ + variable WeightVec : integer_vector(0 to NumBins-1) ; -- Prep for change to DistInt + variable MaxCovPercent : real ; + variable MinCovPercent : real ; + begin + ItemCount := ItemCount + 1 ; + MinCovPercent := GetMinCov ; + if ThresholdingEnable then + MaxCovPercent := MinCovPercent + CovThreshold ; + if MinCovPercent < CovTargetPercent then + -- Clip at CovTargetPercent until reach CovTargetPercent + MaxCovPercent := minimum(MaxCovPercent, CovTargetPercent); + end if ; + else + if MinCovPercent < CovTargetPercent then + MaxCovPercent := CovTargetPercent ; + else + -- Done, Enable all bins + MaxCovPercent := GetMaxCov + 1.0 ; + -- MaxCovPercent := real'right ; -- weight scale issues + end if ; + end if ; + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < MaxCovPercent then + -- Calculate Weight based on WeightMode + -- Scale to current percentage goal: MaxCov which can be < or > 100.0 + WeightVec(i-1) := CalcWeight(i, MaxCovPercent) ; + else + WeightVec(i-1) := 0 ; + end if ; + end loop CovLoop ; + -- DistInt returns integer range 0 to Numbins-1 + -- Caution: DistInt can fail when sum(WeightVec) > 2**31 + -- See notes in CalcWeight for REMAIN_EXP + LastIndex := 1 + RV.DistInt( WeightVec ) ; -- return range 1 to NumBins + return LastIndex ; + end function RandHoleIndex ; + + + ------------------------------------------------------------ + impure function GetBinVal ( BinIndex : integer ) return RangeArrayType is + ------------------------------------------------------------ + begin + return CovBinPtr( BinIndex ).BinVal.all ; + end function GetBinVal ; + + + ------------------------------------------------------------ + impure function GetLastBinVal return RangeArrayType is + ------------------------------------------------------------ + begin + return CovBinPtr( LastIndex ).BinVal.all ; + end function GetLastBinVal ; + + + ------------------------------------------------------------ + impure function RandCovBinVal ( PercentCov : real ) return RangeArrayType is + ------------------------------------------------------------ + begin + return CovBinPtr( RandHoleIndex(PercentCov) ).BinVal.all ; -- GetBinVal + end function RandCovBinVal ; + + + ------------------------------------------------------------ + impure function RandCovBinVal return RangeArrayType is + ------------------------------------------------------------ + begin + -- use global coverage target + return CovBinPtr( RandHoleIndex( CovTarget ) ).BinVal.all ; -- GetBinVal + end function RandCovBinVal ; + + + ------------------------------------------------------------ + impure function GetMinBinVal return RangeArrayType is + ------------------------------------------------------------ + begin + -- use global coverage target + return GetBinVal( GetMinIndex ) ; + end function GetMinBinVal ; + + + ------------------------------------------------------------ + impure function GetMaxBinVal return RangeArrayType is + ------------------------------------------------------------ + begin + -- use global coverage target + return GetBinVal( GetMaxIndex ) ; + end function GetMaxBinVal ; + + + ------------------------------------------------------------ +-- impure function RandCovPoint( BinVal : RangeArrayType ) return integer_vector is + impure function ToRandPoint( BinVal : RangeArrayType ) return integer_vector is + -- pt local + ------------------------------------------------------------ + variable CovPoint : integer_vector(BinVal'range) ; + variable normCovPoint : integer_vector(1 to BinVal'length) ; + begin + for i in BinVal'range loop + CovPoint(i) := RV.RandInt(BinVal(i).min, BinVal(i).max) ; + end loop ; + normCovPoint := CovPoint ; + return normCovPoint ; + end function ToRandPoint ; + + + ------------------------------------------------------------ + impure function ToRandPoint( BinVal : RangeArrayType ) return integer is + -- pt local + ------------------------------------------------------------ + begin + return RV.RandInt(BinVal(BinVal'left).min, BinVal(BinVal'left).max) ; + end function ToRandPoint ; + + + ------------------------------------------------------------ + impure function RandCovPoint return integer is + ------------------------------------------------------------ + begin + return ToRandPoint(RandCovBinVal(CovTarget)) ; + end function RandCovPoint ; + + + ------------------------------------------------------------ + impure function RandCovPoint ( PercentCov : real ) return integer is + ------------------------------------------------------------ + begin + return ToRandPoint(RandCovBinVal(PercentCov)) ; + end function RandCovPoint ; + + + ------------------------------------------------------------ + impure function RandCovPoint return integer_vector is + ------------------------------------------------------------ + begin + return ToRandPoint(RandCovBinVal(CovTarget)) ; + end function RandCovPoint ; + + + ------------------------------------------------------------ + impure function RandCovPoint ( PercentCov : real ) return integer_vector is + ------------------------------------------------------------ + begin + return ToRandPoint(RandCovBinVal(PercentCov)) ; + end function RandCovPoint ; + + + ------------------------------------------------------------ + impure function GetPoint ( BinIndex : integer ) return integer is + ------------------------------------------------------------ + begin + return ToRandPoint(GetBinVal(BinIndex)) ; + end function GetPoint ; + + + ------------------------------------------------------------ + impure function GetPoint ( BinIndex : integer ) return integer_vector is + ------------------------------------------------------------ + begin + return ToRandPoint(GetBinVal(BinIndex)) ; + end function GetPoint ; + + + ------------------------------------------------------------ + impure function GetMinPoint return integer is + ------------------------------------------------------------ + begin + return ToRandPoint(GetBinVal( GetMinIndex )) ; + end function GetMinPoint ; + + + ------------------------------------------------------------ + impure function GetMinPoint return integer_vector is + ------------------------------------------------------------ + begin + return ToRandPoint(GetBinVal( GetMinIndex )) ; + end function GetMinPoint ; + + + ------------------------------------------------------------ + impure function GetMaxPoint return integer is + ------------------------------------------------------------ + begin + return ToRandPoint(GetBinVal( GetMaxIndex )) ; + end function GetMaxPoint ; + + + ------------------------------------------------------------ + impure function GetMaxPoint return integer_vector is + ------------------------------------------------------------ + begin + return ToRandPoint(GetBinVal( GetMaxIndex )) ; + end function GetMaxPoint ; + + + -- ------------------------------------------------------------ + -- Intended as a stand in until we get a more general GetBin + impure function GetBinInfo ( BinIndex : integer ) return CovBinBaseType is + -- ------------------------------------------------------------ + variable result : CovBinBaseType ; + begin + result.BinVal := ALL_RANGE; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBinInfo ; + + + -- ------------------------------------------------------------ + -- Intended as a stand in until we get a more general GetBin + impure function GetBinValLength return integer is + -- ------------------------------------------------------------ + begin + return BinValLength ; + end function GetBinValLength ; + + +-- Eventually the multiple GetBin functions will be replaced by a +-- a single GetBin that returns CovBinBaseType with BinVal as an +-- unconstrained element + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovBinBaseType is + -- ------------------------------------------------------------ + variable result : CovBinBaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovMatrix2BaseType is + -- ------------------------------------------------------------ + variable result : CovMatrix2BaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovMatrix3BaseType is + -- ------------------------------------------------------------ + variable result : CovMatrix3BaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovMatrix4BaseType is + -- ------------------------------------------------------------ + variable result : CovMatrix4BaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovMatrix5BaseType is + -- ------------------------------------------------------------ + variable result : CovMatrix5BaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovMatrix6BaseType is + -- ------------------------------------------------------------ + variable result : CovMatrix6BaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovMatrix7BaseType is + -- ------------------------------------------------------------ + variable result : CovMatrix7BaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovMatrix8BaseType is + -- ------------------------------------------------------------ + variable result : CovMatrix8BaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + + -- ------------------------------------------------------------ + impure function GetBin ( BinIndex : integer ) return CovMatrix9BaseType is + -- ------------------------------------------------------------ + variable result : CovMatrix9BaseType ; + begin + result.BinVal := CovBinPtr(BinIndex).BinVal.all; + result.Action := CovBinPtr(BinIndex).Action; + result.Count := CovBinPtr(BinIndex).Count; + result.AtLeast := CovBinPtr(BinIndex).AtLeast; + result.Weight := CovBinPtr(BinIndex).Weight; + return result ; + end function GetBin ; + + -- ------------------------------------------------------------ + impure function GetBinName ( BinIndex : integer; DefaultName : string := "" ) return string is + -- ------------------------------------------------------------ + begin + if CovBinPtr(BinIndex).Name.all /= "" then + return CovBinPtr(BinIndex).Name.all ; + else + return DefaultName ; + end if; + end function GetBinName; + + ------------------------------------------------------------ + -- pt local for now -- file formal parameter not allowed with method + procedure WriteBin ( + file f : text ; + WritePassFail : CovOptionsType ; + WriteBinInfo : CovOptionsType ; + WriteCount : CovOptionsType ; + WriteAnyIllegal : CovOptionsType ; + WritePrefix : string ; + PassName : string ; + FailName : string + ) is + ------------------------------------------------------------ + variable buf : line ; + begin + if NumBins < 1 then + if WriteBinFileInit or UsingLocalFile then + swrite(buf, WritePrefix & " " & FailName & " ") ; + swrite(buf, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteBin: Coverage model is empty. Nothing to print.") ; + writeline(f, buf) ; + end if ; + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteBin:" & + " Coverage model is empty. Nothing to print.", FAILURE) ; + return ; + end if ; + -- Models with Bins + WriteBinName(f, "WriteBin: ", WritePrefix) ; + for i in 1 to NumBins loop -- CovBinPtr.all'range + if CovBinPtr(i).action = COV_COUNT or + (CovBinPtr(i).action = COV_ILLEGAL and IsEnabled(WriteAnyIllegal)) or + CovBinPtr(i).count < 0 -- Illegal bin with errors + then + -- WriteBin Info + swrite(buf, WritePrefix) ; + if CovBinPtr(i).Name.all /= "" then + swrite(buf, CovBinPtr(i).Name.all & " ") ; + end if ; + if IsEnabled(WritePassFail) then + -- For illegal bins, AtLeast = 0 and count is negative. + if CovBinPtr(i).count >= CovBinPtr(i).AtLeast then + swrite(buf, PassName & ' ') ; + else + swrite(buf, FailName & ' ') ; + end if ; + end if ; + if IsEnabled(WriteBinInfo) then + if CovBinPtr(i).action = COV_COUNT then + swrite(buf, "Bin:") ; + else + swrite(buf, "Illegal Bin:") ; + end if; + write(buf, CovBinPtr(i).BinVal.all) ; + end if ; + if IsEnabled(WriteCount) then + write(buf, " Count = " & integer'image(abs(CovBinPtr(i).count))) ; + write(buf, " AtLeast = " & integer'image(CovBinPtr(i).AtLeast)) ; + if WeightMode = WEIGHT or WeightMode = REMAIN_WEIGHT then + -- Print Weight only when it is used + write(buf, " Weight = " & integer'image(CovBinPtr(i).Weight)) ; + end if ; + end if ; + writeline(f, buf) ; + end if ; + end loop ; + swrite(buf, "") ; + writeline(f, buf) ; + end procedure WriteBin ; + + ------------------------------------------------------------ + procedure WriteBin ( + ------------------------------------------------------------ + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + constant rWritePassFail : CovOptionsType := ResolveCovWritePassFail(WritePassFail, WritePassFailVar) ; + constant rWriteBinInfo : CovOptionsType := ResolveCovWriteBinInfo(WriteBinInfo, WriteBinInfoVar ) ; + constant rWriteCount : CovOptionsType := ResolveCovWriteCount(WriteCount, WriteCountVar ) ; + constant rWriteAnyIllegal : CovOptionsType := ResolveCovWriteAnyIllegal(WriteAnyIllegal, WriteAnyIllegalVar) ; + constant rWritePrefix : string := ResolveOsvvmWritePrefix(WritePrefix, WritePrefixVar.GetOpt) ; + constant rPassName : string := ResolveOsvvmPassName(PassName, PassNameVar.GetOpt ) ; + constant rFailName : string := ResolveOsvvmFailName(FailName, FailNameVar.GetOpt ) ; + begin + if WriteBinFileInit then + -- Write to Local WriteBinFile - Deprecated, recommend use TranscriptFile instead + WriteBin ( + f => WriteBinFile, + WritePassFail => rWritePassFail, + WriteBinInfo => rWriteBinInfo, + WriteCount => rWriteCount, + WriteAnyIllegal => rWriteAnyIllegal, + WritePrefix => rWritePrefix, + PassName => rPassName, + FailName => rFailName + ) ; + elsif IsTranscriptEnabled then + -- Write to TranscriptFile + WriteBin ( + f => TranscriptFile, + WritePassFail => rWritePassFail, + WriteBinInfo => rWriteBinInfo, + WriteCount => rWriteCount, + WriteAnyIllegal => rWriteAnyIllegal, + WritePrefix => rWritePrefix, + PassName => rPassName, + FailName => rFailName + ) ; + if IsTranscriptMirrored then + -- Mirrored to OUTPUT + WriteBin ( + f => OUTPUT, + WritePassFail => rWritePassFail, + WriteBinInfo => rWriteBinInfo, + WriteCount => rWriteCount, + WriteAnyIllegal => rWriteAnyIllegal, + WritePrefix => rWritePrefix, + PassName => rPassName, + FailName => rFailName + ) ; + end if ; + else + -- Default Write to OUTPUT + WriteBin ( + f => OUTPUT, + WritePassFail => rWritePassFail, + WriteBinInfo => rWriteBinInfo, + WriteCount => rWriteCount, + WriteAnyIllegal => rWriteAnyIllegal, + WritePrefix => rWritePrefix, + PassName => rPassName, + FailName => rFailName + ) ; + end if ; + + end procedure WriteBin ; + + + ------------------------------------------------------------ + procedure WriteBin ( -- With LogLevel + ------------------------------------------------------------ + LogLevel : LogType ; + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + WriteBin ( + WritePassFail => WritePassFail, + WriteBinInfo => WriteBinInfo, + WriteCount => WriteCount, + WriteAnyIllegal => WriteAnyIllegal, + WritePrefix => WritePrefix, + PassName => PassName, + FailName => FailName + ) ; + end if ; + end procedure WriteBin ; -- With LogLevel + + + ------------------------------------------------------------ + procedure WriteBin ( + ------------------------------------------------------------ + FileName : string; + OpenKind : File_Open_Kind := APPEND_MODE ; + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + file LocalWriteBinFile : text open OpenKind is FileName ; + constant rWritePassFail : CovOptionsType := ResolveCovWritePassFail(WritePassFail, WritePassFailVar) ; + constant rWriteBinInfo : CovOptionsType := ResolveCovWriteBinInfo(WriteBinInfo, WriteBinInfoVar ) ; + constant rWriteCount : CovOptionsType := ResolveCovWriteCount(WriteCount, WriteCountVar ) ; + constant rWriteAnyIllegal : CovOptionsType := ResolveCovWriteAnyIllegal(WriteAnyIllegal, WriteAnyIllegalVar) ; + constant rWritePrefix : string := ResolveOsvvmWritePrefix(WritePrefix, WritePrefixVar.GetOpt) ; + constant rPassName : string := ResolveOsvvmPassName(PassName, PassNameVar.GetOpt ) ; + constant rFailName : string := ResolveOsvvmFailName(FailName, FailNameVar.GetOpt ) ; + begin + UsingLocalFile := TRUE ; + WriteBin ( + f => LocalWriteBinFile, + WritePassFail => rWritePassFail, + WriteBinInfo => rWriteBinInfo, + WriteCount => rWriteCount, + WriteAnyIllegal => rWriteAnyIllegal, + WritePrefix => rWritePrefix, + PassName => rPassName, + FailName => rFailName + ); + UsingLocalFile := FALSE ; + end procedure WriteBin ; + + + ------------------------------------------------------------ + procedure WriteBin ( -- With LogLevel + ------------------------------------------------------------ + LogLevel : LogType ; + FileName : string; + OpenKind : File_Open_Kind := APPEND_MODE ; + WritePassFail : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteBinInfo : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteCount : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WriteAnyIllegal : CovOptionsType := COV_OPT_INIT_PARM_DETECT ; + WritePrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + UsingLocalFile := TRUE ; + WriteBin ( + FileName => FileName, + OpenKind => OpenKind, + WritePassFail => WritePassFail, + WriteBinInfo => WriteBinInfo, + WriteCount => WriteCount, + WriteAnyIllegal => WriteAnyIllegal, + WritePrefix => WritePrefix, + PassName => PassName, + FailName => FailName + ) ; + UsingLocalFile := FALSE ; + end if ; + end procedure WriteBin ; -- With LogLevel + + + ------------------------------------------------------------ + -- Development only + -- pt local for now -- file formal parameter not allowed with method + procedure DumpBin ( file f : text ) is + ------------------------------------------------------------ + variable buf : line ; + begin + WriteBinName(f, "DumpBin: ") ; + -- if NumBins < 1 then + -- Write(f, "%%FATAL, Coverage Model is empty. Nothing to print." & LF ) ; + -- end if ; + for i in 1 to NumBins loop -- CovBinPtr.all'range + swrite(buf, "%% ") ; + if CovBinPtr(i).Name.all /= "" then + swrite(buf, CovBinPtr(i).Name.all & " ") ; + end if ; + swrite(buf, "Bin:") ; + write(buf, CovBinPtr(i).BinVal.all) ; + case CovBinPtr(i).action is + when COV_COUNT => swrite(buf, " Count = ") ; + when COV_IGNORE => swrite(buf, " Ignore = ") ; + when COV_ILLEGAL => swrite(buf, " Illegal = ") ; + when others => swrite(buf, " BOGUS BOGUS BOGUS = ") ; + end case ; + write(buf, CovBinPtr(i).count) ; + -- write(f, " Count = " & integer'image(CovBinPtr(i).count)) ; + write(buf, " AtLeast = " & integer'image(CovBinPtr(i).AtLeast)) ; + write(buf, " Weight = " & integer'image(CovBinPtr(i).Weight)) ; + write(buf, " OrderCount = " & integer'image(CovBinPtr(i).OrderCount)) ; + if CovBinPtr(i).count > 0 then + write(buf, " Normalized OrderCount = " & integer'image(CovBinPtr(i).OrderCount/CovBinPtr(i).count)) ; + end if ; + writeline(f, buf) ; + end loop ; + swrite(buf, "") ; + writeline(f,buf) ; + end procedure DumpBin ; + + + ------------------------------------------------------------ + procedure DumpBin (LogLevel : LogType := DEBUG) is + ------------------------------------------------------------ + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + if WriteBinFileInit then + -- Write to Local WriteBinFile - Deprecated, recommend use TranscriptFile instead + DumpBin(WriteBinFile) ; + elsif IsTranscriptEnabled then + -- Write to TranscriptFile + DumpBin(TranscriptFile) ; + if IsTranscriptMirrored then + -- Mirrored to OUTPUT + DumpBin(OUTPUT) ; + end if ; + else + -- Default Write to OUTPUT + DumpBin(OUTPUT) ; + end if ; + end if ; + end procedure DumpBin ; + + + ------------------------------------------------------------ + -- pt local + procedure WriteCovHoles ( file f : text; PercentCov : real := 100.0 ) is + ------------------------------------------------------------ + variable buf : line ; + begin + if NumBins < 1 then + if WriteBinFileInit or UsingLocalFile then + -- Duplicate Alert in specified file + swrite(buf, "%% Alert FAILURE " & GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteCovHoles:" & + " coverage model empty. Nothing to print.") ; + writeline(f, buf) ; + end if ; + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteCovHoles:" & + " coverage model empty. Nothing to print.", FAILURE) ; + return ; + end if ; + -- Models with Bins + WriteBinName(f, "WriteCovHoles: ") ; + CovLoop : for i in 1 to NumBins loop + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).PercentCov < PercentCov then + swrite(buf, "%% ") ; + if CovBinPtr(i).Name.all /= "" then + swrite(buf, CovBinPtr(i).Name.all & " ") ; + end if ; + swrite(buf, "Bin:") ; + write(buf, CovBinPtr(i).BinVal.all) ; + write(buf, " Count = " & integer'image(CovBinPtr(i).Count)) ; + write(buf, " AtLeast = " & integer'image(CovBinPtr(i).AtLeast)) ; + if WeightMode = WEIGHT or WeightMode = REMAIN_WEIGHT then + -- Print Weight only when it is used + write(buf, " Weight = " & integer'image(CovBinPtr(i).Weight)) ; + end if ; + writeline(f, buf) ; + end if ; + end loop CovLoop ; + swrite(buf, "") ; + writeline(f, buf) ; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + procedure WriteCovHoles ( PercentCov : real ) is + ------------------------------------------------------------ + begin + if WriteBinFileInit then + -- Write to Local WriteBinFile - Deprecated, recommend use TranscriptFile instead + WriteCovHoles(WriteBinFile, PercentCov) ; + elsif IsTranscriptEnabled then + -- Write to TranscriptFile + WriteCovHoles(TranscriptFile, PercentCov) ; + if IsTranscriptMirrored then + -- Mirrored to OUTPUT + WriteCovHoles(OUTPUT, PercentCov) ; + end if ; + else + -- Default Write to OUTPUT + WriteCovHoles(OUTPUT, PercentCov) ; + end if; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + procedure WriteCovHoles ( LogLevel : LogType := ALWAYS ) is + ------------------------------------------------------------ + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + WriteCovHoles(CovTarget) ; + end if; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + procedure WriteCovHoles ( LogLevel : LogType ; PercentCov : real ) is + ------------------------------------------------------------ + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + WriteCovHoles(PercentCov) ; + end if; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + procedure WriteCovHoles ( FileName : string; OpenKind : File_Open_Kind := APPEND_MODE ) is + ------------------------------------------------------------ + file CovHoleFile : text open OpenKind is FileName ; + begin + UsingLocalFile := TRUE ; + WriteCovHoles(CovHoleFile, CovTarget) ; + UsingLocalFile := FALSE ; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; OpenKind : File_Open_Kind := APPEND_MODE ) is + ------------------------------------------------------------ + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + WriteCovHoles(FileName, OpenKind) ; + end if; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + procedure WriteCovHoles ( FileName : string; PercentCov : real ; OpenKind : File_Open_Kind := APPEND_MODE ) is + ------------------------------------------------------------ + file CovHoleFile : text open OpenKind is FileName ; + begin + UsingLocalFile := TRUE ; + WriteCovHoles(CovHoleFile, PercentCov) ; + UsingLocalFile := FALSE ; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; PercentCov : real ; OpenKind : File_Open_Kind := APPEND_MODE ) is + ------------------------------------------------------------ + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + WriteCovHoles(FileName, PercentCov, OpenKind) ; + end if; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + -- pt local + impure function FindExactBin ( + -- find an exact match to a bin wrt BinVal, Action, AtLeast, Weight, and Name + ------------------------------------------------------------ + Merge : boolean ; + BinVal : RangeArrayType ; + Action : integer ; + AtLeast : integer ; + Weight : integer ; + Name : string + ) return integer is + begin + if Merge then + for i in 1 to NumBins loop + if (BinVal = CovBinPtr(i).BinVal.all) and (Action = CovBinPtr(i).Action) and + (AtLeast = CovBinPtr(i).AtLeast) and (Weight = CovBinPtr(i).Weight) and + (Name = CovBinPtr(i).Name.all) then + return i ; + end if; + end loop ; + end if ; + return 0 ; + end function FindExactBin ; + + + ------------------------------------------------------------ + -- pt local + procedure read ( + ------------------------------------------------------------ + buf : inout line ; + NamePtr : inout line ; + NameLength : in integer ; + ReadValid : out boolean + ) is + variable Name : string(1 to NameLength) ; + begin + if NameLength > 0 then + read(buf, Name, ReadValid) ; + NamePtr := new string'(Name) ; + else + ReadValid := TRUE ; + NamePtr := new string'("") ; + end if ; + end procedure read ; + + + ------------------------------------------------------------ + -- pt local + procedure ReadCovVars (file CovDbFile : text; Good : out boolean ) is + ------------------------------------------------------------ + variable buf : line ; + variable Empty : boolean ; + variable MultiLineComment : boolean := FALSE ; + variable ReadValid : boolean ; + variable GoodLoop1 : boolean ; + variable iSeed : RandomSeedType ; + variable iIllegalMode : integer ; + variable iWeightMode : integer ; + variable iWeightScale : real ; + variable iCovThreshold : real ; + variable iCountMode : integer ; + variable iNumberOfMessages : integer ; + variable iThresholdingEnable : boolean ; + variable iCovTarget : real ; + variable iMergingEnable : boolean ; + begin + -- ReadLoop0 : while not EndFile(CovDbFile) loop + ReadLoop0 : loop -- allows emulation of "return when" + -- ReadLine to Get Coverage Model Name, skip blank and comment lines, fails when file empty + exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: No Coverage Data to read", FAILURE) ; + ReadLine(CovDbFile, buf) ; + EmptyOrCommentLine(buf, Empty, MultiLineComment) ; + next when Empty ; + + if buf.all /= "Coverage_Model_Not_Named" then + SetName(buf.all) ; + end if ; + + exit ReadLoop0 ; + end loop ReadLoop0 ; + + + -- ReadLoop1 : while not EndFile(CovDbFile) loop + ReadLoop1 : loop + -- ReadLine to Get Variables, skip blank and comment lines, fails when file empty + exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Coverage DB File Incomplete", FAILURE) ; + ReadLine(CovDbFile, buf) ; + EmptyOrCommentLine(buf, Empty, MultiLineComment) ; + next when Empty ; + + read(buf, iSeed, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading Seed", FAILURE) ; + RV.SetSeed( iSeed ) ; + RvSeedInit := TRUE ; + + read(buf, iCovThreshold, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading CovThreshold", FAILURE) ; + CovThreshold := iCovThreshold ; + + read(buf, iIllegalMode, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading IllegalMode", FAILURE) ; + SetIllegalMode(IllegalModeType'val( iIllegalMode )) ; + + read(buf, iWeightMode, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading WeightMode", FAILURE) ; + WeightMode := WeightModeType'val( iWeightMode ) ; + + read(buf, iWeightScale, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading WeightScale", FAILURE) ; + WeightScale := iWeightScale ; + + read(buf, iCountMode, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading CountMode", FAILURE) ; + CountMode := CountModeType'val( iCountMode ) ; + + read(buf, iThresholdingEnable, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading CountMode", FAILURE) ; + ThresholdingEnable := iThresholdingEnable ; + + read(buf, iCovTarget, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading CountMode", FAILURE) ; + CovTarget := iCovTarget ; + + read(buf, iMergingEnable, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading CountMode", FAILURE) ; + MergingEnable := iMergingEnable ; + + exit ReadLoop1 ; + end loop ReadLoop1 ; + + GoodLoop1 := ReadValid ; + + -- ReadLoop2 : while not EndFile(CovDbFile) loop + ReadLoop2 : while ReadValid loop + -- ReadLine to Coverage Model Header WriteBin Message, skip blank and comment lines, fails when file empty + exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Coverage DB File Incomplete", FAILURE) ; + ReadLine(CovDbFile, buf) ; + EmptyOrCommentLine(buf, Empty, MultiLineComment) ; + next when Empty ; + + read(buf, iNumberOfMessages, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading NumberOfMessages", FAILURE) ; + + for i in 1 to iNumberOfMessages loop + exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: End of File while reading Messages", FAILURE) ; + ReadLine(CovDbFile, buf) ; + SetMessage(buf.all) ; + end loop ; + + exit ReadLoop2 ; + end loop ReadLoop2 ; + + Good := ReadValid and GoodLoop1 ; + end procedure ReadCovVars ; + + + ------------------------------------------------------------ + -- pt local + procedure ReadCovDbInfo ( + ------------------------------------------------------------ + File CovDbFile : text ; + variable NumRangeItems : out integer ; + variable NumLines : out integer ; + variable Good : out boolean + ) is + variable buf : line ; + variable ReadValid : boolean ; + variable Empty : boolean ; + variable MultiLineComment : boolean := FALSE ; + begin + + ReadLoop : loop + -- ReadLine to RangeItems NumLines, skip blank and comment lines, fails when file empty + exit when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Coverage DB File Incomplete", FAILURE) ; + ReadLine(CovDbFile, buf) ; + EmptyOrCommentLine(buf, Empty, MultiLineComment) ; + next when Empty ; + + read(buf, NumRangeItems, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading NumRangeItems", FAILURE) ; + read(buf, NumLines, ReadValid) ; + exit when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading NumLines", FAILURE) ; + exit ; + end loop ReadLoop ; + Good := ReadValid ; + end procedure ReadCovDbInfo ; + + + ------------------------------------------------------------ + -- pt local + procedure ReadCovDbDataBase ( + ------------------------------------------------------------ + File CovDbFile : text ; + constant NumRangeItems : in integer ; + constant NumLines : in integer ; + constant Merge : in boolean ; + variable Good : out boolean + ) is + variable buf : line ; + variable Empty : boolean ; + variable MultiLineComment : boolean := FALSE ; + variable ReadValid : boolean ; + -- Format: Action Count min1 max1 min2 max2 .... + variable Action : integer ; + variable Count : integer ; + variable BinVal : RangeArrayType(1 to NumRangeItems) ; + variable index : integer ; + variable AtLeast : integer ; + variable Weight : integer ; + variable PercentCov : real ; + variable NameLength : integer ; + variable SkipBlank : character ; + variable NamePtr : line ; + begin + GrowBins(NumLines) ; + ReadLoop : for i in 1 to NumLines loop + + GetValidLineLoop: loop + exit ReadLoop when AlertIf(AlertLogIDVar, EndFile(CovDbFile), GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Did not read specified number of lines", FAILURE) ; + ReadLine(CovDbFile, buf) ; + EmptyOrCommentLine(buf, Empty, MultiLineComment) ; + next GetValidLineLoop when Empty ; -- replace with EmptyLine(buf) + exit GetValidLineLoop ; + end loop ; + + read(buf, Action, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading Action", FAILURE) ; + read(buf, Count, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading Count", FAILURE) ; + read(buf, AtLeast, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading AtLeast", FAILURE) ; + read(buf, Weight, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading Weight", FAILURE) ; + read(buf, PercentCov, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading PercentCov", FAILURE) ; + read(buf, BinVal, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading BinVal", FAILURE) ; + read(buf, NameLength, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading Bin Name Length", FAILURE) ; + read(buf, SkipBlank, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading Bin Name Length", FAILURE) ; + read(buf, NamePtr, NameLength, ReadValid) ; + exit ReadLoop when AlertIfNot(AlertLogIDVar, ReadValid, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.ReadCovDb: Failed while reading Bin Name", FAILURE) ; + index := FindExactBin(Merge, BinVal, Action, AtLeast, Weight, NamePtr.all) ; + if index > 0 then + -- Bin is an exact match so only merge the count values + CovBinPtr(index).Count := CovBinPtr(index).Count + Count ; + CovBinPtr(index).PercentCov := CalcPercentCov( + Count => CovBinPtr.all(index).Count, + AtLeast => CovBinPtr.all(index).AtLeast ) ; + else + InsertNewBin(BinVal, Action, Count, AtLeast, Weight, NamePtr.all, PercentCov) ; + end if ; + deallocate(NamePtr) ; + end loop ReadLoop ; + Good := ReadValid ; + end ReadCovDbDataBase ; + + + ------------------------------------------------------------ + -- pt local + procedure ReadCovDb (File CovDbFile : text; Merge : boolean := FALSE) is + ------------------------------------------------------------ + -- Format: Action Count min1 max1 min2 max2 + -- file CovDbFile : text open READ_MODE is FileName ; + variable NumRangeItems : integer ; + variable NumLines : integer ; + variable ReadValid : boolean ; + begin + if not Merge then + Deallocate ; -- remove any old bins + end if ; + + ReadLoop : loop + -- Read coverage private variables to the file + ReadCovVars(CovDbFile, ReadValid) ; + exit when not ReadValid ; + + -- Get Coverage dimensions and number of items in file. + ReadCovDbInfo(CovDbFile, NumRangeItems, NumLines, ReadValid) ; + exit when not ReadValid ; + + -- Read the file + ReadCovDbDataBase(CovDbFile, NumRangeItems, NumLines, Merge, ReadValid) ; + exit ; + end loop ReadLoop ; + end ReadCovDb ; + + + ------------------------------------------------------------ + procedure ReadCovDb (FileName : string; Merge : boolean := FALSE) is + ------------------------------------------------------------ + -- Format: Action Count min1 max1 min2 max2 + file CovDbFile : text open READ_MODE is FileName ; + begin + ReadCovDb(CovDbFile, Merge) ; + end procedure ReadCovDb ; + + + ------------------------------------------------------------ + -- pt local + procedure WriteCovDbVars (file CovDbFile : text ) is + ------------------------------------------------------------ + variable buf : line ; + begin + -- write coverage private variables to the file + swrite(buf, CovNameVar.Get("Coverage_Model_Not_Named")) ; + writeline(CovDbFile, buf) ; + + write(buf, RV.GetSeed ) ; + write(buf, ' ') ; + write(buf, CovThreshold, RIGHT, 0, 5) ; + write(buf, ' ') ; + write(buf, IllegalModeType'pos(IllegalMode)) ; + write(buf, ' ') ; + write(buf, WeightModeType'pos(WeightMode)) ; + write(buf, ' ') ; + write(buf, WeightScale, RIGHT, 0, 6) ; + write(buf, ' ') ; + write(buf, CountModeType'pos(CountMode)) ; + write(buf, ' ') ; + write(buf, ThresholdingEnable) ; -- boolean + write(buf, ' ') ; + write(buf, CovTarget, RIGHT, 0, 6) ; -- Real + write(buf, ' ') ; + write(buf, MergingEnable) ; -- boolean + write(buf, ' ') ; + writeline(CovDbFile, buf) ; + write(buf, CovMessageVar.GetCount ) ; + writeline(CovDbFile, buf) ; + WriteMessage(CovDbFile, CovMessageVar) ; + end procedure WriteCovDbVars ; + + + ------------------------------------------------------------ + -- pt local + procedure WriteCovDb (file CovDbFile : text ) is + ------------------------------------------------------------ + -- Format: Action Count min1 max1 min2 max2 + variable buf : line ; + begin + -- write Cover variables to the file + WriteCovDbVars( CovDbFile ) ; + + -- write NumRangeItems, NumLines + write(buf, CovBinPtr(1).BinVal'length) ; + write(buf, ' ') ; + write(buf, NumBins) ; + write(buf, ' ') ; + writeline(CovDbFile, buf) ; + -- write coverage to a file + writeloop : for LineCount in 1 to NumBins loop + write(buf, CovBinPtr(LineCount).Action) ; + write(buf, ' ') ; + write(buf, CovBinPtr(LineCount).Count) ; + write(buf, ' ') ; + write(buf, CovBinPtr(LineCount).AtLeast) ; + write(buf, ' ') ; + write(buf, CovBinPtr(LineCount).Weight) ; + write(buf, ' ') ; + write(buf, CovBinPtr(LineCount).PercentCov, RIGHT, 0, 4) ; + write(buf, ' ') ; + WriteBinVal(buf, CovBinPtr(LineCount).BinVal.all) ; + write(buf, ' ') ; + write(buf, CovBinPtr(LineCount).Name'length) ; + write(buf, ' ') ; + write(buf, CovBinPtr(LineCount).Name.all) ; + writeline(CovDbFile, buf) ; + end loop WriteLoop ; + end procedure WriteCovDb ; + + + ------------------------------------------------------------ + procedure WriteCovDb (FileName : string; OpenKind : File_Open_Kind := WRITE_MODE ) is + ------------------------------------------------------------ + -- Format: Action Count min1 max1 min2 max2 + file CovDbFile : text open OpenKind is FileName ; + begin + if NumBins >= 1 then + WriteCovDb(CovDbFile) ; + else + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & + "CoveragePkg.WriteCovDb: no bins defined ", FAILURE) ; + end if ; + end procedure WriteCovDb ; + + +-- ------------------------------------------------------------ +-- procedure WriteCovDb is +-- ------------------------------------------------------------ +-- begin +-- if WriteCovDbFileInit then +-- WriteCovDb(WriteCovDbFile) ; +-- else +-- report "CoveragePkg: WriteCovDb file not specified" severity failure ; +-- end if ; +-- end procedure WriteCovDb ; + + + ------------------------------------------------------------ + impure function GetErrorCount return integer is + ------------------------------------------------------------ + variable ErrorCnt : integer := 0 ; + begin + if NumBins < 1 then + return 1 ; -- return error if model empty + else + for i in 1 to NumBins loop + if CovBinPtr(i).count < 0 then -- illegal CovBin + ErrorCnt := ErrorCnt + CovBinPtr(i).count ; + end if ; + end loop ; + return - ErrorCnt ; + end if ; + end function GetErrorCount ; + + ------------------------------------------------------------ + -- These support usage of cross coverage constants + -- Also support the older AddBins(GenCross(...)) methodology + -- which has been replaced by AddCross + ------------------------------------------------------------ + procedure AddCross (CovBin : CovMatrix2Type ; Name : String := "") is + ------------------------------------------------------------ + begin + CheckBinValLength(2, "AddCross") ; + GrowBins(CovBin'length) ; + for i in CovBin'range loop + InsertBin( + CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, + CovBin(i).AtLeast, CovBin(i).Weight, Name + ) ; + end loop ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross (CovBin : CovMatrix3Type ; Name : String := "") is + ------------------------------------------------------------ + begin + CheckBinValLength(3, "AddCross") ; + GrowBins(CovBin'length) ; + for i in CovBin'range loop + InsertBin( + CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, + CovBin(i).AtLeast, CovBin(i).Weight, Name + ) ; + end loop ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross (CovBin : CovMatrix4Type ; Name : String := "") is + ------------------------------------------------------------ + begin + CheckBinValLength(4, "AddCross") ; + GrowBins(CovBin'length) ; + for i in CovBin'range loop + InsertBin( + CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, + CovBin(i).AtLeast, CovBin(i).Weight, Name + ) ; + end loop ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross (CovBin : CovMatrix5Type ; Name : String := "") is + ------------------------------------------------------------ + begin + CheckBinValLength(5, "AddCross") ; + GrowBins(CovBin'length) ; + for i in CovBin'range loop + InsertBin( + CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, + CovBin(i).AtLeast, CovBin(i).Weight, Name + ) ; + end loop ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross (CovBin : CovMatrix6Type ; Name : String := "") is + ------------------------------------------------------------ + begin + CheckBinValLength(6, "AddCross") ; + GrowBins(CovBin'length) ; + for i in CovBin'range loop + InsertBin( + CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, + CovBin(i).AtLeast, CovBin(i).Weight, Name + ) ; + end loop ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross (CovBin : CovMatrix7Type ; Name : String := "") is + ------------------------------------------------------------ + begin + CheckBinValLength(7, "AddCross") ; + GrowBins(CovBin'length) ; + for i in CovBin'range loop + InsertBin( + CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, + CovBin(i).AtLeast, CovBin(i).Weight, Name + ) ; + end loop ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross (CovBin : CovMatrix8Type ; Name : String := "") is + ------------------------------------------------------------ + begin + CheckBinValLength(8, "AddCross") ; + GrowBins(CovBin'length) ; + for i in CovBin'range loop + InsertBin( + CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, + CovBin(i).AtLeast, CovBin(i).Weight, Name + ) ; + end loop ; + end procedure AddCross ; + + + ------------------------------------------------------------ + procedure AddCross (CovBin : CovMatrix9Type ; Name : String := "") is + ------------------------------------------------------------ + begin + CheckBinValLength(9, "AddCross") ; + GrowBins(CovBin'length) ; + for i in CovBin'range loop + InsertBin( + CovBin(i).BinVal, CovBin(i).Action, CovBin(i).Count, + CovBin(i).AtLeast, CovBin(i).Weight, Name + ) ; + end loop ; + end procedure AddCross ; + +-- ------------------------------------------------------------ +-- ------------------------------------------------------------ +-- Deprecated. Due to name changes to promote greater consistency +-- Maintained for backward compatibility. +-- ------------------------------------------------------------ + + ------------------------------------------------------------ + impure function CovBinErrCnt return integer is + -- Deprecated. Name changed to ErrorCount for package to package consistency + ------------------------------------------------------------ + begin + return GetErrorCount ; + end function CovBinErrCnt ; + + ------------------------------------------------------------ + -- Deprecated. Same as RandCovBinVal + impure function RandCovHole ( PercentCov : real ) return RangeArrayType is + ------------------------------------------------------------ + begin + return RandCovBinVal(PercentCov) ; + end function RandCovHole ; + + ------------------------------------------------------------ + -- Deprecated. Same as RandCovBinVal + impure function RandCovHole return RangeArrayType is + ------------------------------------------------------------ + begin + return RandCovBinVal ; + end function RandCovHole ; + + -- GetCovHole replaced by GetHoleBinVal + ------------------------------------------------------------ + -- Deprecated. Same as GetHoleBinVal + impure function GetCovHole ( ReqHoleNum : integer ; PercentCov : real ) return RangeArrayType is + ------------------------------------------------------------ + begin + return GetHoleBinVal(ReqHoleNum, PercentCov) ; + end function GetCovHole ; + + ------------------------------------------------------------ + -- Deprecated. Same as GetHoleBinVal + impure function GetCovHole ( PercentCov : real ) return RangeArrayType is + ------------------------------------------------------------ + begin + return GetHoleBinVal(PercentCov) ; + end function GetCovHole ; + + ------------------------------------------------------------ + -- Deprecated. Same as GetHoleBinVal + impure function GetCovHole ( ReqHoleNum : integer := 1 ) return RangeArrayType is + ------------------------------------------------------------ + begin + return GetHoleBinVal(ReqHoleNum) ; + end function GetCovHole ; + +-- ------------------------------------------------------------ +-- ------------------------------------------------------------ +-- Deprecated / Subsumed by versions with PercentCov Parameter +-- Maintained for backward compatibility only and +-- may be removed in the future. +-- ------------------------------------------------------------ + + ------------------------------------------------------------ + -- Deprecated. Replaced by SetMessage with multi-line support + procedure SetItemName (ItemNameIn : String) is + ------------------------------------------------------------ + begin + SetMessage(ItemNameIn) ; + end procedure SetItemName ; + + + ------------------------------------------------------------ + -- Deprecated. Same as GetMinCount + impure function GetMinCov return integer is + ------------------------------------------------------------ + begin + return GetMinCount ; + end function GetMinCov ; + + + ------------------------------------------------------------ + -- Deprecated. Same as GetMaxCount + impure function GetMaxCov return integer is + ------------------------------------------------------------ + begin + return GetMaxCount ; + end function GetMaxCov ; + + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov + impure function CountCovHoles ( AtLeast : integer ) return integer is + ------------------------------------------------------------ + variable HoleCount : integer := 0 ; + begin + CovLoop : for i in 1 to NumBins loop +-- if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < minimum(AtLeast, CovBinPtr(i).AtLeast) then + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < AtLeast then + HoleCount := HoleCount + 1 ; + end if ; + end loop CovLoop ; + return HoleCount ; + end function CountCovHoles ; + + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov + impure function IsCovered ( AtLeast : integer ) return boolean is + ------------------------------------------------------------ + begin + return CountCovHoles(AtLeast) = 0 ; + end function IsCovered ; + + + ------------------------------------------------------------ + impure function CalcWeight ( BinIndex : integer ; MaxAtLeast : integer ) return integer is + -- pt local + ------------------------------------------------------------ + begin + case WeightMode is + when AT_LEAST => + return CovBinPtr(BinIndex).AtLeast ; + + when WEIGHT => + return CovBinPtr(BinIndex).Weight ; + + when REMAIN => + return MaxAtLeast - CovBinPtr(BinIndex).Count ; + + when REMAIN_SCALED => + -- Experimental may be removed + return integer( Ceil( WeightScale * real(MaxAtLeast))) - + CovBinPtr(BinIndex).Count ; + + when REMAIN_WEIGHT => + -- Experimental may be removed + return CovBinPtr(BinIndex).Weight * ( + integer( Ceil( WeightScale * real(MaxAtLeast))) - + CovBinPtr(BinIndex).Count ) ; + + when others => + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.CalcWeight:" & + " Selected Weight Mode not supported with deprecated RandCovPoint(AtLeast), see RandCovPoint(PercentCov)", FAILURE) ; + return MaxAtLeast - CovBinPtr(BinIndex).Count ; + + end case ; + end function CalcWeight ; + + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov + -- If keep this, need to be able to scale AtLeast Value + impure function RandHoleIndex ( AtLeast : integer ) return integer is + -- pt local + ------------------------------------------------------------ + variable WeightVec : integer_vector(0 to NumBins-1) ; -- Prep for change to DistInt + variable MinCount, AdjAtLeast, MaxAtLeast : integer ; + begin + ItemCount := ItemCount + 1 ; + MinCount := GetMinCov ; + -- iAtLeast := integer(ceil(CovTarget * real(AtLeast)/100.0)) ; + if ThresholdingEnable then + AdjAtLeast := MinCount + integer(CovThreshold) + 1 ; + if MinCount < AtLeast then + -- Clip at AtLeast until reach AtLeast + AdjAtLeast := minimum(AdjAtLeast, AtLeast) ; + end if ; + else + if MinCount < AtLeast then + AdjAtLeast := AtLeast ; -- Valid + else + -- Done, Enable all bins + -- AdjAtLeast := integer'right ; -- Get All + AdjAtLeast := GetMaxCov + 1 ; -- Get All + end if ; + end if; + MaxAtLeast := AdjAtLeast ; + CovLoop : for i in 1 to NumBins loop +-- if not ThresholdingEnable then +-- -- When not thresholding, consider bin Bin.AtLeast +-- -- iBinAtLeast := integer(ceil(CovTarget * real(CovBinPtr(i).AtLeast)/100.0)) ; +-- MaxAtLeast := maximum(AdjAtLeast, CovBinPtr(i).AtLeast) ; +-- end if ; + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < MaxAtLeast then + WeightVec(i-1) := CalcWeight(i, MaxAtLeast ) ; -- CovBinPtr(i).Weight ; + else + WeightVec(i-1) := 0 ; + end if ; + end loop CovLoop ; + -- DistInt returns integer range 0 to Numbins-1 + LastIndex := 1 + RV.DistInt( WeightVec ) ; -- return range 1 to NumBins + return LastIndex ; + end function RandHoleIndex ; + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov + impure function RandCovBinVal (AtLeast : integer ) return RangeArrayType is + ------------------------------------------------------------ + begin + return CovBinPtr( RandHoleIndex(AtLeast) ).BinVal.all ; -- GetBinVal + end function RandCovBinVal ; + +-- Maintained for backward compatibility. Repeated until aliases work for methods + ------------------------------------------------------------ + -- Deprecated+ New versions use PercentCov. Name change. + impure function RandCovHole (AtLeast : integer ) return RangeArrayType is + ------------------------------------------------------------ + begin + return RandCovBinVal(AtLeast) ; -- GetBinVal + end function RandCovHole ; + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov + impure function RandCovPoint (AtLeast : integer ) return integer is + ------------------------------------------------------------ + variable BinVal : RangeArrayType(1 to 1) ; + begin + BinVal := RandCovBinVal(AtLeast) ; + return RV.RandInt(BinVal(1).min, BinVal(1).max) ; + end function RandCovPoint ; + + ------------------------------------------------------------ + impure function RandCovPoint (AtLeast : integer ) return integer_vector is + ------------------------------------------------------------ + begin + return ToRandPoint(RandCovBinVal(AtLeast)) ; + end function RandCovPoint ; + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov + impure function GetHoleBinVal ( ReqHoleNum : integer ; AtLeast : integer ) return RangeArrayType is + ------------------------------------------------------------ + variable HoleCount : integer := 0 ; + variable buf : line ; + begin + CovLoop : for i in 1 to NumBins loop +-- if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < minimum(AtLeast, CovBinPtr(i).AtLeast) then + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < AtLeast then + HoleCount := HoleCount + 1 ; + if HoleCount = ReqHoleNum then + return CovBinPtr(i).BinVal.all ; + end if ; + end if ; + end loop CovLoop ; + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.GetHoleBinVal:" & + " did not find hole. HoleCount = " & integer'image(HoleCount) & + "ReqHoleNum = " & integer'image(ReqHoleNum), ERROR + ) ; + return CovBinPtr(NumBins).BinVal.all ; + end function GetHoleBinVal ; + + ------------------------------------------------------------ + -- Deprecated+. New versions use PercentCov. Name Change. + impure function GetCovHole ( ReqHoleNum : integer ; AtLeast : integer ) return RangeArrayType is + ------------------------------------------------------------ + begin + return GetHoleBinVal(ReqHoleNum, AtLeast) ; + end function GetCovHole ; + + + ------------------------------------------------------------ + -- pt local + -- Deprecated. New versions use PercentCov. + procedure WriteCovHoles ( file f : text; AtLeast : integer ) is + ------------------------------------------------------------ + -- variable minAtLeast : integer ; + variable buf : line ; + begin + WriteBinName(f, "WriteCovHoles: ") ; + if NumBins < 1 then + if WriteBinFileInit or UsingLocalFile then + -- Duplicate Alert in specified file + swrite(buf, "%% Alert FAILURE " & GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteCovHoles:" & + " coverage model is empty. Nothing to print.") ; + writeline(f, buf) ; + end if ; + Alert(AlertLogIDVar, GetNamePlus(prefix => "in ", suffix => ", ") & "CoveragePkg.WriteCovHoles:" & + " coverage model is empty. Nothing to print.", FAILURE) ; + end if ; + CovLoop : for i in 1 to NumBins loop +-- minAtLeast := minimum(AtLeast,CovBinPtr(i).AtLeast) ; +-- if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < minAtLeast then + if CovBinPtr(i).action = COV_COUNT and CovBinPtr(i).Count < AtLeast then + swrite(buf, "%% Bin:") ; + write(buf, CovBinPtr(i).BinVal.all) ; + write(buf, " Count = " & integer'image(CovBinPtr(i).Count)) ; + write(buf, " AtLeast = " & integer'image(CovBinPtr(i).AtLeast)) ; + if WeightMode = WEIGHT or WeightMode = REMAIN_WEIGHT then + -- Print Weight only when it is used + write(buf, " Weight = " & integer'image(CovBinPtr(i).Weight)) ; + end if ; + writeline(f, buf) ; + end if ; + end loop CovLoop ; + swrite(buf, "") ; + writeline(f, buf) ; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov. + procedure WriteCovHoles ( AtLeast : integer ) is + ------------------------------------------------------------ + begin + if WriteBinFileInit then + -- Write to Local WriteBinFile - Deprecated, recommend use TranscriptFile instead + WriteCovHoles(WriteBinFile, AtLeast) ; + elsif IsTranscriptEnabled then + -- Write to TranscriptFile + WriteCovHoles(TranscriptFile, AtLeast) ; + if IsTranscriptMirrored then + -- Mirrored to OUTPUT + WriteCovHoles(OUTPUT, AtLeast) ; + end if ; + else + -- Default Write to OUTPUT + WriteCovHoles(OUTPUT, AtLeast) ; + end if; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov. + procedure WriteCovHoles ( LogLevel : LogType ; AtLeast : integer ) is + ------------------------------------------------------------ + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + WriteCovHoles(AtLeast) ; + end if; + end procedure WriteCovHoles ; + + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov. + procedure WriteCovHoles ( FileName : string; AtLeast : integer ; OpenKind : File_Open_Kind := APPEND_MODE ) is + ------------------------------------------------------------ + file CovHoleFile : text open OpenKind is FileName ; + begin + WriteCovHoles(CovHoleFile, AtLeast) ; + end procedure WriteCovHoles ; + + ------------------------------------------------------------ + -- Deprecated. New versions use PercentCov. + procedure WriteCovHoles ( LogLevel : LogType ; FileName : string; AtLeast : integer ; OpenKind : File_Open_Kind := APPEND_MODE ) is + ------------------------------------------------------------ + begin + if IsLogEnabled(AlertLogIDVar, LogLevel) then + WriteCovHoles(FileName, AtLeast, OpenKind) ; + end if; + end procedure WriteCovHoles ; + + ------------------------------------------------------------ + -- Deprecated. Use AddCross Instead. + procedure AddBins (CovBin : CovMatrix2Type ; Name : String := "") is + ------------------------------------------------------------ + begin + AddCross(CovBin, Name) ; + end procedure AddBins ; + + ------------------------------------------------------------ + procedure AddBins (CovBin : CovMatrix3Type ; Name : String := "") is + ------------------------------------------------------------ + begin + AddCross(CovBin, Name) ; + end procedure AddBins ; + + ------------------------------------------------------------ + procedure AddBins (CovBin : CovMatrix4Type ; Name : String := "") is + ------------------------------------------------------------ + begin + AddCross(CovBin, Name) ; + end procedure AddBins ; + + ------------------------------------------------------------ + procedure AddBins (CovBin : CovMatrix5Type ; Name : String := "") is + ------------------------------------------------------------ + begin + AddCross(CovBin, Name) ; + end procedure AddBins ; + + ------------------------------------------------------------ + procedure AddBins (CovBin : CovMatrix6Type ; Name : String := "") is + ------------------------------------------------------------ + begin + AddCross(CovBin, Name) ; + end procedure AddBins ; + + ------------------------------------------------------------ + procedure AddBins (CovBin : CovMatrix7Type ; Name : String := "") is + ------------------------------------------------------------ + begin + AddCross(CovBin, Name) ; + end procedure AddBins ; + + ------------------------------------------------------------ + procedure AddBins (CovBin : CovMatrix8Type ; Name : String := "") is + ------------------------------------------------------------ + begin + AddCross(CovBin, Name) ; + end procedure AddBins ; + + ------------------------------------------------------------ + procedure AddBins (CovBin : CovMatrix9Type ; Name : String := "") is + ------------------------------------------------------------ + begin + AddCross(CovBin, Name) ; + end procedure AddBins ; + + end protected body CovPType ; + + ------------------------------------------------------------------------------------------ + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + -- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CovPType XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + ------------------------------------------------------------------------------------------ + + ------------------------------------------------------------ + -- Experimental. Intended primarily for development. + procedure CompareBins ( + ------------------------------------------------------------ + variable Bin1 : inout CovPType ; + variable Bin2 : inout CovPType ; + variable ErrorCount : inout integer + ) is + variable NumBins1, NumBins2 : integer ; + variable BinInfo1, BinInfo2 : CovBinBaseType ; + variable BinVal1, BinVal2 : RangeArrayType(1 to Bin1.GetBinValLength) ; + variable buf : line ; + variable iAlertLogID : AlertLogIDType ; + begin + iAlertLogID := Bin1.GetAlertLogID ; + + NumBins1 := Bin1.GetNumBins ; + NumBins2 := Bin2.GetNumBins ; + + if (NumBins1 /= NumBins2) then + ErrorCount := ErrorCount + 1 ; + print("CoveragePkg.CompareBins: CoverageModels " & Bin1.GetCovModelName & " and " & Bin2.GetCovModelName & + " have different bin lengths") ; + return ; + end if ; + + for i in 1 to NumBins1 loop + BinInfo1 := Bin1.GetBinInfo(i) ; + BinInfo2 := Bin2.GetBinInfo(i) ; + BinVal1 := Bin1.GetBinVal(i) ; + BinVal2 := Bin2.GetBinVal(i) ; + if BinInfo1 /= BinInfo2 or BinVal1 /= BinVal2 then + write(buf, "%% Bin:" & integer'image(i) & " miscompare." & LF) ; + -- writeline(OUTPUT, buf) ; + swrite(buf, "%% Bin1: ") ; + write(buf, BinVal1) ; + write(buf, " Action = " & integer'image(BinInfo1.action)) ; + write(buf, " Count = " & integer'image(BinInfo1.count)) ; + write(buf, " AtLeast = " & integer'image(BinInfo1.AtLeast)) ; + write(buf, " Weight = " & integer'image(BinInfo1.Weight) & LF ) ; + -- writeline(OUTPUT, buf) ; + swrite(buf, "%% Bin2: ") ; + write(buf, BinVal2) ; + write(buf, " Action = " & integer'image(BinInfo2.action)) ; + write(buf, " Count = " & integer'image(BinInfo2.count)) ; + write(buf, " AtLeast = " & integer'image(BinInfo2.AtLeast)) ; + write(buf, " Weight = " & integer'image(BinInfo2.Weight) & LF ) ; + -- writeline(OUTPUT, buf) ; + ErrorCount := ErrorCount + 1 ; + writeline(buf) ; + -- Alert(iAlertLogID, buf.all, ERROR) ; + -- deallocate(buf) ; + end if ; + end loop ; + end procedure CompareBins ; + + + ------------------------------------------------------------ + -- Experimental. Intended primarily for development. + procedure CompareBins ( + ------------------------------------------------------------ + variable Bin1 : inout CovPType ; + variable Bin2 : inout CovPType + ) is + variable ErrorCount : integer ; + variable iAlertLogID : AlertLogIDType ; + begin + CompareBins(Bin1, Bin2, ErrorCount) ; + iAlertLogID := Bin1.GetAlertLogID ; + AlertIf(ErrorCount /= 0, "CoveragePkg.CompareBins: CoverageModels " & Bin1.GetCovModelName & " and " & Bin2.GetCovModelName & " are not the same.") ; + end procedure CompareBins ; + + ------------------------------------------------------------ + -- package local, Used by GenBin, IllegalBin, and IgnoreBin + function MakeBin( + -- Must be pure to allow initializing coverage models passed as generics. + -- Impure implies the expression is not globally static. + ------------------------------------------------------------ + Min, Max : integer ; + NumBin : integer ; + AtLeast : integer ; + Weight : integer ; + Action : integer + ) return CovBinType is + variable iCovBin : CovBinType(1 to NumBin) ; + variable TotalBins : integer ; -- either real or integer + variable rMax, rCurMin, rNumItemsInBin, rRemainingBins : real ; -- must be real + variable iCurMin, iCurMax : integer ; + begin + if Min > Max then + -- Similar to NULL ranges. Only generate report warning. + report "OSVVM.CoveragePkg.MakeBin (called by GenBin, IllegalBin, or IgnoreBin) MAX > MIN generated NULL_BIN" + severity WARNING ; + -- No Alerts. They make this impure. + -- Alert(OSVVM_ALERTLOG_ID, "CoveragePkg.MakeBin (called by GenBin, IllegalBin, IgnoreBin): Min must be <= Max", WARNING) ; + return NULL_BIN ; + + elsif NumBin <= 0 then + -- Similar to NULL ranges. Only generate report warning. + report "OSVVM.CoveragePkg.MakeBin (called by GenBin, IllegalBin, or IgnoreBin) NumBin <= 0 generated NULL_BIN" + severity WARNING ; + -- Alerts make this impure. + -- Alert(OSVVM_ALERTLOG_ID, "CoveragePkg.MakeBin (called by GenBin, IllegalBin, IgnoreBin): NumBin must be <= 0", WARNING) ; + return NULL_BIN ; + + elsif NumBin = 1 then + iCovBin(1) := ( + BinVal => (1 => (Min, Max)), + Action => Action, + Count => 0, + Weight => Weight, + AtLeast => AtLeast + ) ; + return iCovBin ; + + else + -- Using type real to work around issues with integer sizing + iCurMin := Min ; + rCurMin := real(iCurMin) ; + rMax := real(Max) ; + rRemainingBins := (minimum( real(NumBin), rMax - rCurMin + 1.0 )) ; + TotalBins := integer(rRemainingBins) ; + for i in iCovBin'range loop + rNumItemsInBin := trunc((rMax - rCurMin + 1.0) / rRemainingBins) ; -- Max - Min can be larger than integer range. + iCurMax := iCurMin - integer(-rNumItemsInBin + 1.0) ; -- Keep: the "minus negative" works around a simulator bounds issue found in 2015.06 + iCovBin(i) := ( + BinVal => (1 => (iCurMin, iCurMax)), + Action => Action, + Count => 0, + Weight => Weight, + AtLeast => AtLeast + ) ; + rRemainingBins := rRemainingBins - 1.0 ; + exit when rRemainingBins = 0.0 ; + iCurMin := iCurMax + 1 ; + rCurMin := real(iCurMin) ; + end loop ; + return iCovBin(1 to TotalBins) ; + + end if ; + end function MakeBin ; + + + ------------------------------------------------------------ + -- package local, Used by GenBin, IllegalBin, and IgnoreBin + function MakeBin( + ------------------------------------------------------------ + A : integer_vector ; + AtLeast : integer ; + Weight : integer ; + Action : integer + ) return CovBinType is + alias NewA : integer_vector(1 to A'length) is A ; + variable iCovBin : CovBinType(1 to A'length) ; + begin + + if A'length <= 0 then + -- Similar to NULL ranges. Only generate report warning. + report "OSVVM.CoveragePkg.MakeBin (called by GenBin, IllegalBin, or IgnoreBin) integer_vector length <= 0 generated NULL_BIN" + severity WARNING ; + -- Alerts make this impure. + -- Alert(OSVVM_ALERTLOG_ID, "CoveragePkg.MakeBin (GenBin, IllegalBin, IgnoreBin): integer_vector parameter must have values", WARNING) ; + return NULL_BIN ; + + else + for i in NewA'Range loop + iCovBin(i) := ( + BinVal => (i => (NewA(i), NewA(i)) ), + Action => Action, + Count => 0, + Weight => Weight, + AtLeast => AtLeast + ) ; + end loop ; + return iCovBin ; + end if ; + end function MakeBin ; + + + ------------------------------------------------------------ + function GenBin( + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Min, Max : integer ; + NumBin : integer + ) return CovBinType is + begin + return MakeBin( + Min => Min, + Max => Max, + NumBin => NumBin, + AtLeast => AtLeast, + Weight => Weight, + Action => COV_COUNT + ) ; + end function GenBin ; + + + ------------------------------------------------------------ + function GenBin( AtLeast : integer ; Min, Max, NumBin : integer ) return CovBinType is + ------------------------------------------------------------ + begin + return MakeBin( + Min => Min, + Max => Max, + NumBin => NumBin, + AtLeast => AtLeast, + Weight => 1, + Action => COV_COUNT + ) ; + end function GenBin ; + + + ------------------------------------------------------------ + function GenBin( Min, Max, NumBin : integer ) return CovBinType is + ------------------------------------------------------------ + begin + return MakeBin( + Min => Min, + Max => Max, + NumBin => NumBin, + AtLeast => 1, + Weight => 1, + Action => COV_COUNT + ) ; + end function GenBin ; + + + ------------------------------------------------------------ + function GenBin ( Min, Max : integer) return CovBinType is + ------------------------------------------------------------ + begin + -- create a separate CovBin for each value + -- AtLeast and Weight = 1 (must use longer version to specify) + return MakeBin( + Min => Min, + Max => Max, + NumBin => Max - Min + 1, + AtLeast => 1, + Weight => 1, + Action => COV_COUNT + ) ; + end function GenBin ; + + + ------------------------------------------------------------ + function GenBin ( A : integer ) return CovBinType is + ------------------------------------------------------------ + begin + -- create a single CovBin for A. + -- AtLeast and Weight = 1 (must use longer version to specify) + return MakeBin( + Min => A, + Max => A, + NumBin => 1, + AtLeast => 1, + Weight => 1, + Action => COV_COUNT + ) ; + end function GenBin ; + + + ------------------------------------------------------------ + function GenBin( + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + A : integer_vector + ) return CovBinType is + begin + return MakeBin( + A => A, + AtLeast => AtLeast, + Weight => Weight, + Action => COV_COUNT + ) ; + end function GenBin ; + + + ------------------------------------------------------------ + function GenBin ( AtLeast : integer ; A : integer_vector ) return CovBinType is + ------------------------------------------------------------ + begin + return MakeBin( + A => A, + AtLeast => AtLeast, + Weight => 1, + Action => COV_COUNT + ) ; + end function GenBin ; + + + ------------------------------------------------------------ + function GenBin ( A : integer_vector ) return CovBinType is + ------------------------------------------------------------ + begin + return MakeBin( + A => A, + AtLeast => 1, + Weight => 1, + Action => COV_COUNT + ) ; + end function GenBin ; + + + ------------------------------------------------------------ + function IllegalBin ( Min, Max, NumBin : integer ) return CovBinType is + ------------------------------------------------------------ + begin + return MakeBin( + Min => Min, + Max => Max, + NumBin => NumBin, + AtLeast => 0, + Weight => 0, + Action => COV_ILLEGAL + ) ; + end function IllegalBin ; + + ------------------------------------------------------------ + function IllegalBin ( Min, Max : integer ) return CovBinType is + ------------------------------------------------------------ + begin + -- default, generate one CovBin with the entire range of values + return MakeBin( + Min => Min, + Max => Max, + NumBin => 1, + AtLeast => 0, + Weight => 0, + Action => COV_ILLEGAL + ) ; + end function IllegalBin ; + + + ------------------------------------------------------------ + function IllegalBin ( A : integer ) return CovBinType is + ------------------------------------------------------------ + begin + return MakeBin( + Min => A, + Max => A, + NumBin => 1, + AtLeast => 0, + Weight => 0, + Action => COV_ILLEGAL + ) ; + end function IllegalBin ; + + +-- IgnoreBin should never have an AtLeast parameter + ------------------------------------------------------------ + function IgnoreBin (Min, Max, NumBin : integer) return CovBinType is + ------------------------------------------------------------ + begin + return MakeBin( + Min => Min, + Max => Max, + NumBin => NumBin, + AtLeast => 0, + Weight => 0, + Action => COV_IGNORE + ) ; + end function IgnoreBin ; + + + ------------------------------------------------------------ + function IgnoreBin (Min, Max : integer) return CovBinType is + ------------------------------------------------------------ + begin + -- default, generate one CovBin with the entire range of values + return MakeBin( + Min => Min, + Max => Max, + NumBin => 1, + AtLeast => 0, + Weight => 0, + Action => COV_IGNORE + ) ; + end function IgnoreBin ; + + + ------------------------------------------------------------ + function IgnoreBin (A : integer) return CovBinType is + ------------------------------------------------------------ + begin + return MakeBin( + Min => A, + Max => A, + NumBin => 1, + AtLeast => 0, + Weight => 0, + Action => COV_IGNORE + ) ; + end function IgnoreBin ; + + + ------------------------------------------------------------ + function GenCross( -- 2 + -- Cross existing bins + -- Use AddCross for adding values directly to coverage database + -- Use GenCross for constants + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2 : CovBinType + ) return CovMatrix2Type is + constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable Action : integer ; + variable iCovMatrix : CovMatrix2Type(1 to NUM_NEW_BINS) ; + begin + for MatrixIndex in iCovMatrix'range loop + CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2) ; + Action := MergeState(CrossBins) ; + iCovMatrix(MatrixIndex).action := Action ; + iCovMatrix(MatrixIndex).count := 0 ; + iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; + iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; + iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; + IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next + end loop ; + return iCovMatrix ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross(AtLeast : integer ; Bin1, Bin2 : CovBinType) return CovMatrix2Type is + -- Cross existing bins -- use AddCross instead + ------------------------------------------------------------ + begin + return GenCross(AtLeast, 0, Bin1, Bin2) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross(Bin1, Bin2 : CovBinType) return CovMatrix2Type is + -- Cross existing bins -- use AddCross instead + ------------------------------------------------------------ + begin + return GenCross(0, 0, Bin1, Bin2) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( -- 3 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3 : CovBinType + ) return CovMatrix3Type is + constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable Action : integer ; + variable iCovMatrix : CovMatrix3Type(1 to NUM_NEW_BINS) ; + begin + for MatrixIndex in iCovMatrix'range loop + CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3) ; + Action := MergeState(CrossBins) ; + iCovMatrix(MatrixIndex).action := Action ; + iCovMatrix(MatrixIndex).count := 0 ; + iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; + iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; + iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; + IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next + end loop ; + return iCovMatrix ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3 : CovBinType ) return CovMatrix3Type is + ------------------------------------------------------------ + begin + return GenCross(AtLeast, 0, Bin1, Bin2, Bin3) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( Bin1, Bin2, Bin3 : CovBinType ) return CovMatrix3Type is + ------------------------------------------------------------ + begin + return GenCross(0, 0, Bin1, Bin2, Bin3) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( -- 4 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4 : CovBinType + ) return CovMatrix4Type is + constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable Action : integer ; + variable iCovMatrix : CovMatrix4Type(1 to NUM_NEW_BINS) ; + begin + for MatrixIndex in iCovMatrix'range loop + CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4) ; + Action := MergeState(CrossBins) ; + iCovMatrix(MatrixIndex).action := Action ; + iCovMatrix(MatrixIndex).count := 0 ; + iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; + iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; + iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; + IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next + end loop ; + return iCovMatrix ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4 : CovBinType ) return CovMatrix4Type is + ------------------------------------------------------------ + begin + return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( Bin1, Bin2, Bin3, Bin4 : CovBinType ) return CovMatrix4Type is + ------------------------------------------------------------ + begin + return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( -- 5 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType + ) return CovMatrix5Type is + constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable Action : integer ; + variable iCovMatrix : CovMatrix5Type(1 to NUM_NEW_BINS) ; + begin + for MatrixIndex in iCovMatrix'range loop + CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5) ; + Action := MergeState(CrossBins) ; + iCovMatrix(MatrixIndex).action := Action ; + iCovMatrix(MatrixIndex).count := 0 ; + iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; + iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; + iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; + IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next + end loop ; + return iCovMatrix ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType ) return CovMatrix5Type is + ------------------------------------------------------------ + begin + return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5 : CovBinType ) return CovMatrix5Type is + ------------------------------------------------------------ + begin + return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( -- 6 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType + ) return CovMatrix6Type is + constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5, Bin6) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable Action : integer ; + variable iCovMatrix : CovMatrix6Type(1 to NUM_NEW_BINS) ; + begin + for MatrixIndex in iCovMatrix'range loop + CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6) ; + Action := MergeState(CrossBins) ; + iCovMatrix(MatrixIndex).action := Action ; + iCovMatrix(MatrixIndex).count := 0 ; + iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; + iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; + iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; + IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next + end loop ; + return iCovMatrix ; + + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType ) return CovMatrix6Type is + ------------------------------------------------------------ + begin + return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6 : CovBinType ) return CovMatrix6Type is + ------------------------------------------------------------ + begin + return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( -- 7 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType + ) return CovMatrix7Type is + constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable Action : integer ; + variable iCovMatrix : CovMatrix7Type(1 to NUM_NEW_BINS) ; + begin + for MatrixIndex in iCovMatrix'range loop + CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) ; + Action := MergeState(CrossBins) ; + iCovMatrix(MatrixIndex).action := Action ; + iCovMatrix(MatrixIndex).count := 0 ; + iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; + iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; + iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; + IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next + end loop ; + return iCovMatrix ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType ) return CovMatrix7Type is + ------------------------------------------------------------ + begin + return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7 : CovBinType ) return CovMatrix7Type is + ------------------------------------------------------------ + begin + return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( -- 8 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType + ) return CovMatrix8Type is + constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable Action : integer ; + variable iCovMatrix : CovMatrix8Type(1 to NUM_NEW_BINS) ; + begin + for MatrixIndex in iCovMatrix'range loop + CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8) ; + Action := MergeState(CrossBins) ; + iCovMatrix(MatrixIndex).action := Action ; + iCovMatrix(MatrixIndex).count := 0 ; + iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; + iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; + iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; + IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next + end loop ; + return iCovMatrix ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType ) return CovMatrix8Type is + ------------------------------------------------------------ + begin + return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8 : CovBinType ) return CovMatrix8Type is + ------------------------------------------------------------ + begin + return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( -- 9 + ------------------------------------------------------------ + AtLeast : integer ; + Weight : integer ; + Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType + ) return CovMatrix9Type is + constant BIN_LENS : integer_vector := BinLengths(Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9) ; + constant NUM_NEW_BINS : integer := CalcNumCrossBins(BIN_LENS) ; + variable BinIndex : integer_vector(1 to BIN_LENS'length) := (others => 1) ; + variable CrossBins : CovBinType(BinIndex'range) ; + variable Action : integer ; + variable iCovMatrix : CovMatrix9Type(1 to NUM_NEW_BINS) ; + begin + for MatrixIndex in iCovMatrix'range loop + CrossBins := ConcatenateBins(BinIndex, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9) ; + Action := MergeState(CrossBins) ; + iCovMatrix(MatrixIndex).action := Action ; + iCovMatrix(MatrixIndex).count := 0 ; + iCovMatrix(MatrixIndex).BinVal := MergeBinVal(CrossBins) ; + iCovMatrix(MatrixIndex).AtLeast := MergeAtLeast( Action, AtLeast, CrossBins) ; + iCovMatrix(MatrixIndex).Weight := MergeWeight ( Action, Weight, CrossBins) ; + IncBinIndex( BinIndex, BIN_LENS ) ; -- increment right most one, then if overflow, increment next + end loop ; + return iCovMatrix ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( AtLeast : integer ; Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType ) return CovMatrix9Type is + ------------------------------------------------------------ + begin + return GenCross(AtLeast, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9) ; + end function GenCross ; + + + ------------------------------------------------------------ + function GenCross( Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9 : CovBinType ) return CovMatrix9Type is + ------------------------------------------------------------ + begin + return GenCross(0, 0, Bin1, Bin2, Bin3, Bin4, Bin5, Bin6, Bin7, Bin8, Bin9) ; + end function GenCross ; + + + ------------------------------------------------------------ + function to_integer ( B : boolean ) return integer is + ------------------------------------------------------------ + begin + if B then + return 1 ; + else + return 0 ; + end if ; + end function to_integer ; + + + ------------------------------------------------------------ + function to_integer ( SL : std_logic ) return integer is + ------------------------------------------------------------- + begin + case SL is + when '1' | 'H' => return 1 ; + when '0' | 'L' => return 0 ; + when others => return -1 ; + end case ; + end function to_integer ; + + + ------------------------------------------------------------ + function to_integer_vector ( BV : boolean_vector ) return integer_vector is + ------------------------------------------------------------ + variable result : integer_vector(BV'range) ; + begin + for i in BV'range loop + result(i) := to_integer(BV(i)) ; + end loop ; + return result ; + end function to_integer_vector ; + + + ------------------------------------------------------------ + function to_integer_vector ( SLV : std_logic_vector ) return integer_vector is + ------------------------------------------------------------- + variable result : integer_vector(SLV'range) ; + begin + for i in SLV'range loop + result(i) := to_integer(SLV(i)) ; + end loop ; + return result ; + end function to_integer_vector ; + + + ------------------------------------------------------------ + ------------------------------------------------------------ +-- Deprecated: These are not part of the coverage model + +-- ------------------------------------------------------------ +-- procedure increment( signal Count : inout integer ) is +-- ------------------------------------------------------------ +-- begin +-- Count <= Count + 1 ; +-- end procedure increment ; +-- +-- +-- ------------------------------------------------------------ +-- procedure increment( signal Count : inout integer ; enable : boolean ) is +-- ------------------------------------------------------------ +-- begin +-- if enable then +-- Count <= Count + 1 ; +-- end if ; +-- end procedure increment ; +-- +-- +-- ------------------------------------------------------------ +-- procedure increment( signal Count : inout integer ; enable : std_ulogic ) is +-- ------------------------------------------------------------ +-- begin +-- if to_x01(enable) = '1' then +-- Count <= Count + 1 ; +-- end if ; +-- end procedure increment ; + + end package body CoveragePkg ; \ No newline at end of file From bd3d42a275ddc9153dcd64015467c7bef28a7283 Mon Sep 17 00:00:00 2001 From: JimLewis Date: Thu, 1 Mar 2018 22:43:09 -0800 Subject: [PATCH 4/8] Uncommented and tested the pop function. Another tool bug fixed. :) --- ScoreboardGenericPkg.vhd | 3156 +++++++++++++++++++------------------- 1 file changed, 1578 insertions(+), 1578 deletions(-) diff --git a/ScoreboardGenericPkg.vhd b/ScoreboardGenericPkg.vhd index ddc5665..d840211 100644 --- a/ScoreboardGenericPkg.vhd +++ b/ScoreboardGenericPkg.vhd @@ -1,1579 +1,1579 @@ --- --- File Name: ScoreBoardGenericPkg.vhd --- Design Unit Name: ScoreBoardGenericPkg --- Revision: STANDARD VERSION --- --- Maintainer: Jim Lewis email: jim@synthworks.com --- Contributor(s): --- Jim Lewis email: jim@synthworks.com --- --- --- Description: --- Defines types and methods to implement a FIFO based Scoreboard --- Defines type ScoreBoardPType --- Defines methods for putting values the scoreboard --- --- Developed for: --- SynthWorks Design Inc. --- VHDL Training Classes --- 11898 SW 128th Ave. Tigard, Or 97223 --- http://www.SynthWorks.com --- --- Latest standard version available at: --- http://www.SynthWorks.com/downloads --- --- Revision History: --- Date Version Description --- 12/2006: 2006.12 Initial revision --- 08/2010 2010.08 Added Tailpointer --- 05/2012 2012.05 Changed FIFO to store pointers to ExpectedType --- Allows usage of unconstrained arrays --- 08/2012 2012.08 Added Type and Subprogram Generics --- 08/2013 2013.08 Generics: to_string replaced write, Match replaced check --- Added Tags - Experimental --- Added Array of Scoreboards --- 09/2013 2013.09 Added file handling, Check Count, Finish Status --- Find, Flush --- 06/2015 2015.06 Added Alerts, SetAlertLogID, Revised LocalPush, GetDropCount, --- Deprecated SetFinish and ReportMode - REPORT_NONE, FileOpen --- Deallocate, Initialized, Function SetName --- 11/2016 2016.11 Released as part of OSVVM --- 05/2017 2017.05 First print Actual then only print Expected if mis-match --- --- --- Copyright (c) 2006 - 2016 by SynthWorks Design Inc. All rights reserved. --- --- Verbatim copies of this source file may be used and --- distributed without restriction. --- --- This source file is free software; you can redistribute it --- and/or modify it under the terms of the ARTISTIC License --- as published by The Perl Foundation; either version 2.0 of --- the License, or (at your option) any later version. --- --- This source is distributed in the hope that it will be --- useful, but WITHOUT ANY WARRANTY; without even the implied --- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --- PURPOSE. See the Artistic License for details. --- --- You should have received a copy of the license with this source. --- If not download it from, --- http://www.perlfoundation.org/artistic_license_2_0 --- --- - -use std.textio.all ; - -library ieee ; - use ieee.std_logic_1164.all ; - use ieee.numeric_std.all ; - - use work.TranscriptPkg.all ; - use work.AlertLogPkg.all ; - use work.NamePkg.all ; - - -package ScoreboardGenericPkg is - generic ( - type ExpectedType ; - type ActualType ; - function Match(Actual : ActualType ; -- defaults - Expected : ExpectedType) return boolean ; -- is "=" ; - function expected_to_string(A : ExpectedType) return string ; -- is to_string ; - function actual_to_string (A : ActualType) return string -- is to_string ; - ) ; - --- -- For a VHDL-2002 package, comment out the generics and --- -- uncomment the following, it replaces a generic instance of the package. --- -- As a result, you will have multiple copies of the entire package. --- -- Inconvenient, but ok as it still works the same. --- subtype ExpectedType is std_logic_vector ; --- subtype ActualType is std_logic_vector ; --- alias Match is std_match [ActualType, ExpectedType return boolean] ; -- for std_logic_vector --- alias expected_to_string is to_hstring [ExpectedType return string]; -- VHDL-2008 --- alias actual_to_string is to_hstring [ActualType return string]; -- VHDL-2008 - - -- ScoreboardReportType is deprecated - -- Replaced by Affirmations. ERROR is the default. ALL turns on PASSED flag - type ScoreboardReportType is (REPORT_ERROR, REPORT_ALL, REPORT_NONE) ; -- replaced by affirmations - - type ScoreBoardPType is protected - - ------------------------------------------------------------ - -- Emulate arrays of scoreboards - procedure SetArrayIndex(L, R : integer) ; -- supports integer indices - procedure SetArrayIndex(R : natural) ; -- indicies 1 to R - impure function GetArrayIndex return integer_vector ; - impure function GetArrayLength return natural ; - - ------------------------------------------------------------ - -- Push items into the scoreboard/FIFO - - -- Simple Scoreboard, no tag - procedure Push (Item : in ExpectedType) ; - - -- Simple Tagged Scoreboard - procedure Push ( - constant Tag : in string ; - constant Item : in ExpectedType - ) ; - - -- Array of Scoreboards, no tag - procedure Push ( - constant Index : in integer ; - constant Item : in ExpectedType - ) ; - - -- Array of Tagged Scoreboards - procedure Push ( - constant Index : in integer ; - constant Tag : in string ; - constant Item : in ExpectedType - ) ; - --- ------------------------------------------------------------ --- -- Push items into the scoreboard/FIFO --- -- Function form supports chaining of operations --- -- In 2013, this caused overloading issues in some simulators, will retest later --- --- -- Simple Scoreboard, no tag --- impure function Push (Item : ExpectedType) return ExpectedType ; --- --- -- Simple Tagged Scoreboard --- impure function Push ( --- constant Tag : in string ; --- constant Item : in ExpectedType --- ) return ExpectedType ; --- --- -- Array of Scoreboards, no tag --- impure function Push ( --- constant Index : in integer ; --- constant Item : in ExpectedType --- ) return ExpectedType ; --- --- -- Array of Tagged Scoreboards --- impure function Push ( --- constant Index : in integer ; --- constant Tag : in string ; --- constant Item : in ExpectedType --- ) return ExpectedType ; -- for chaining of operations - - ------------------------------------------------------------ - -- Check received item with item in the scoreboard/FIFO - - -- Simple Scoreboard, no tag - procedure Check (ActualData : ActualType) ; - - -- Simple Tagged Scoreboard - procedure Check ( - constant Tag : in string ; - constant ActualData : in ActualType - ) ; - - -- Array of Scoreboards, no tag - procedure Check ( - constant Index : in integer ; - constant ActualData : in ActualType - ) ; - - -- Array of Tagged Scoreboards - procedure Check ( - constant Index : in integer ; - constant Tag : in string ; - constant ActualData : in ActualType - ) ; - - ------------------------------------------------------------ - -- Pop the top item (FIFO) from the scoreboard/FIFO - - -- Simple Scoreboard, no tag - procedure Pop (variable Item : out ExpectedType) ; - - -- Simple Tagged Scoreboard - procedure Pop ( - constant Tag : in string ; - variable Item : out ExpectedType - ) ; - - -- Array of Scoreboards, no tag - procedure Pop ( - constant Index : in integer ; - variable Item : out ExpectedType - ) ; - - -- Array of Tagged Scoreboards - procedure Pop ( - constant Index : in integer ; - constant Tag : in string ; - variable Item : out ExpectedType - ) ; - --- ------------------------------------------------------------ --- -- Pop the top item (FIFO) from the scoreboard/FIFO --- -- Function form supports chaining of operations --- -- In 2013, this caused overloading issues in some simulators, will retest later --- --- -- Simple Scoreboard, no tag --- impure function Pop return ExpectedType ; --- --- -- Simple Tagged Scoreboard --- impure function Pop ( --- constant Tag : in string --- ) return ExpectedType ; --- --- -- Array of Scoreboards, no tag --- impure function Pop (Index : integer) return ExpectedType ; --- --- -- Array of Tagged Scoreboards --- impure function Pop ( --- constant Index : in integer ; --- constant Tag : in string --- ) return ExpectedType ; - - ------------------------------------------------------------ - -- Empty - check to see if scoreboard is empty - impure function Empty return boolean ; -- Simple - impure function Empty (Tag : String) return boolean ; -- Simple, Tagged - impure function Empty (Index : integer) return boolean ; -- Array - impure function Empty (Index : integer; Tag : String) return boolean ; -- Array, Tagged - - ------------------------------------------------------------ - -- SetAlertLogID - associate an AlertLogID with a scoreboard to allow integrated error reporting - procedure SetAlertLogID(Index : Integer ; Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) ; - procedure SetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) ; - -- Use when an AlertLogID is used by multiple items (Model or other Scoreboards). See also AlertLogPkg.GetAlertLogID - procedure SetAlertLogID (Index : Integer ; A : AlertLogIDType) ; - procedure SetAlertLogID (A : AlertLogIDType) ; - impure function GetAlertLogID(Index : Integer) return AlertLogIDType ; - impure function GetAlertLogID return AlertLogIDType ; - - ------------------------------------------------------------ - -- Set a scoreboard name. - -- Used when scoreboard AlertLogID is shared between different sources. - procedure SetName (Name : String) ; - impure function SetName (Name : String) return string ; - impure function GetName (DefaultName : string := "Scoreboard") return string ; - - - ------------------------------------------------------------ - -- Scoreboard Introspection - - -- Number of items put into scoreboard - impure function GetItemCount return integer ; -- Simple, with or without tags - impure function GetItemCount (Index : integer) return integer ; -- Arrays, with or without tags - - -- Number of items checked by scoreboard - impure function GetCheckCount return integer ; -- Simple, with or without tags - impure function GetCheckCount (Index : integer) return integer ; -- Arrays, with or without tags - - -- Number of items dropped by scoreboard. See Find/Flush - impure function GetDropCount return integer ; -- Simple, with or without tags - impure function GetDropCount (Index : integer) return integer ; -- Arrays, with or without tags - - ------------------------------------------------------------ - -- Find - Returns the ItemNumber for a value and tag (if applicable) in a scoreboard. - -- Find returns integer'left if no match found - -- Also See Flush. Flush will drop items up through the ItemNumber - - -- Simple Scoreboard - impure function Find ( - constant ActualData : in ActualType - ) return integer ; - - -- Tagged Scoreboard - impure function Find ( - constant Tag : in string; - constant ActualData : in ActualType - ) return integer ; - - -- Array of Simple Scoreboards - impure function Find ( - constant Index : in integer ; - constant ActualData : in ActualType - ) return integer ; - - -- Array of Tagged Scoreboards - impure function Find ( - constant Index : in integer ; - constant Tag : in string; - constant ActualData : in ActualType - ) return integer ; - - ------------------------------------------------------------ - -- Flush - Remove elements in the scoreboard upto and including the one with ItemNumber - -- See Find to identify an ItemNumber of a particular value and tag (if applicable) - - -- Simple Scoreboard - procedure Flush ( - constant ItemNumber : in integer - ) ; - - -- Tagged Scoreboard - only removes items that also match the tag - procedure Flush ( - constant Tag : in string ; - constant ItemNumber : in integer - ) ; - - -- Array of Simple Scoreboards - procedure Flush ( - constant Index : in integer ; - constant ItemNumber : in integer - ) ; - - -- Array of Tagged Scoreboards - only removes items that also match the tag - procedure Flush ( - constant Index : in integer ; - constant Tag : in string ; - constant ItemNumber : in integer - ) ; - - ------------------------------------------------------------ - -- Generally these are not required. When a simulation ends and - -- another simulation is started, a simulator will release all allocated items. - procedure Deallocate ; -- Deletes all allocated items - procedure Initialize ; -- Creates initial data structure if it was destroyed with Deallocate - - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- Deprecated. Use alerts directly instead. - -- AlertIF(SB.GetCheckCount < 10, ....) ; - -- AlertIf(Not SB.Empty, ...) ; - ------------------------------------------------------------ - -- Set alerts if scoreboard not empty or if CheckCount < - -- Use if need to check empty or CheckCount for a specific scoreboard. - - -- Simple Scoreboards, with or without tag - procedure CheckFinish ( - FinishCheckCount : integer ; - FinishEmpty : boolean - ) ; - - -- Array of Scoreboards, with or without tag - procedure CheckFinish ( - Index : integer ; - FinishCheckCount : integer ; - FinishEmpty : boolean - ) ; - - ------------------------------------------------------------ - -- Get error count - -- Deprecated, replaced by usage of Alerts - -- AlertFLow: Instead use AlertLogPkg.ReportAlerts or AlertLogPkg.GetAlertCount - -- Not AlertFlow: use GetErrorCount to get total error count - - -- Simple Scoreboards, with or without tag - impure function GetErrorCount return integer ; - - -- Array of Scoreboards, with or without tag - impure function GetErrorCount(Index : integer) return integer ; - - ------------------------------------------------------------ - -- Error count manipulation - - -- IncErrorCount - not recommended, use alerts instead - may be deprecated in the future - procedure IncErrorCount ; -- Simple, with or without tags - procedure IncErrorCount (Index : integer) ; -- Arrays, with or without tags - - -- Clear error counter. Caution does not change AlertCounts, must also use AlertLogPkg.ClearAlerts - procedure SetErrorCountZero ; -- Simple, with or without tags - procedure SetErrorCountZero (Index : integer) ; -- Arrays, with or without tags - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- Deprecated. Names changed. Maintained for backward compatibility - would prefer an alias - ------------------------------------------------------------ - procedure FileOpen (FileName : string; OpenKind : File_Open_Kind ) ; -- Replaced by TranscriptPkg.TranscriptOpen - procedure PutExpectedData (ExpectedData : ExpectedType) ; -- Replaced by push - procedure CheckActualData (ActualData : ActualType) ; -- Replaced by Check - impure function GetItemNumber return integer ; -- Replaced by GetItemCount - procedure SetMessage (MessageIn : String) ; -- Replaced by SetName - impure function GetMessage return string ; -- Replaced by GetName - - -- Deprecated and may be deleted in a future revision - procedure SetFinish ( -- Replaced by CheckFinish - Index : integer ; - FCheckCount : integer ; - FEmpty : boolean := TRUE; - FStatus : boolean := TRUE - ) ; - - procedure SetFinish ( -- Replaced by CheckFinish - FCheckCount : integer ; - FEmpty : boolean := TRUE; - FStatus : boolean := TRUE - ) ; - - ------------------------------------------------------------ - -- SetReportMode - -- Not AlertFlow - -- REPORT_ALL: Replaced by AlertLogPkg.SetLogEnable(PASSED, TRUE) - -- REPORT_ERROR: Replaced by AlertLogPkg.SetLogEnable(PASSED, FALSE) - -- REPORT_NONE: Deprecated, do not use. - -- AlertFlow: - -- REPORT_ALL: Replaced by AlertLogPkg.SetLogEnable(AlertLogID, PASSED, TRUE) - -- REPORT_ERROR: Replaced by AlertLogPkg.SetLogEnable(AlertLogID, PASSED, FALSE) - -- REPORT_NONE: Replaced by AlertLogPkg.SetAlertEnable(AlertLogID, ERROR, FALSE) - procedure SetReportMode (ReportModeIn : ScoreboardReportType) ; - impure function GetReportMode return ScoreboardReportType ; - - - end protected ScoreBoardPType ; - -end ScoreboardGenericPkg ; - - --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -package body ScoreboardGenericPkg is - - type ScoreBoardPType is protected body - type ExpectedPointerType is access ExpectedType ; - - type ListType ; - type ListPointerType is access ListType ; - type ListType is record - ItemNumber : integer ; - TagPtr : line ; - ExpectedPtr : ExpectedPointerType ; - NextPtr : ListPointerType ; - end record ; - type ListArrayType is array (integer range <>) of ListPointerType ; - type ListArrayPointerType is access ListArrayType ; - - variable ArrayLengthVar : integer := 1 ; - variable HeadPointer : ListArrayPointerType := new ListArrayType(1 to 1) ; - variable TailPointer : ListArrayPointerType := new ListArrayType(1 to 1) ; - variable PopListPointer : ListArrayPointerType := new ListArrayType(1 to 1) ; - - type IntegerArrayType is array (integer range <>) of Integer ; - type IntegerArrayPointerType is access IntegerArrayType ; - type AlertLogIDArrayType is array (integer range <>) of AlertLogIDType ; - type AlertLogIDArrayPointerType is access AlertLogIDArrayType ; - - - variable ErrCntVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; - variable DropCountVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; - variable ItemNumberVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; - variable CheckCountVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; - variable AlertLogIDVar : AlertLogIDArrayPointerType := new AlertLogIDArrayType'(1 => OSVVM_SCOREBOARD_ALERTLOG_ID) ; - - variable NameVar : NamePType ; - variable ReportModeVar : ScoreboardReportType ; - variable FirstIndexVar : integer := 1 ; - - - ------------------------------------------------------------ - procedure SetName (Name : String) is - ------------------------------------------------------------ - begin - NameVar.Set(Name) ; - end procedure SetName ; - - ------------------------------------------------------------ - impure function SetName (Name : String) return string is - ------------------------------------------------------------ - begin - NameVar.Set(Name) ; - return Name ; - end function SetName ; - - ------------------------------------------------------------ - impure function GetName (DefaultName : string := "Scoreboard") return string is - ------------------------------------------------------------ - begin - return NameVar.Get(DefaultName) ; - end function GetName ; - - ------------------------------------------------------------ - procedure SetReportMode (ReportModeIn : ScoreboardReportType) is - ------------------------------------------------------------ - begin - ReportModeVar := ReportModeIn ; - if ReportModeVar = REPORT_ALL then - Alert(OSVVM_SCOREBOARD_ALERTLOG_ID, "ScoreboardGenericPkg.SetReportMode: To turn off REPORT_ALL, use osvvm.AlertLogPkg.SetLogEnable(PASSED, FALSE)", WARNING) ; - for i in AlertLogIDVar'range loop - SetLogEnable(AlertLogIDVar(i), PASSED, TRUE) ; - end loop ; - end if ; - if ReportModeVar = REPORT_NONE then - Alert(OSVVM_SCOREBOARD_ALERTLOG_ID, "ScoreboardGenericPkg.SetReportMode: ReportMode REPORT_NONE has been deprecated and will be removed in next revision. Please contact OSVVM architect Jim Lewis if you need this capability.", WARNING) ; - end if ; - end procedure SetReportMode ; - - ------------------------------------------------------------ - impure function GetReportMode return ScoreboardReportType is - ------------------------------------------------------------ - begin - return ReportModeVar ; - end function GetReportMode ; - - ------------------------------------------------------------ - procedure SetArrayIndex(L, R : integer) is - ------------------------------------------------------------ - variable OldHeadPointer, OldTailPointer, OldPopListPointer : ListArrayPointerType ; - variable OldErrCnt, OldDropCount, OldItemNumber, OldCheckCount : IntegerArrayPointerType ; - variable OldAlertLogIDVar : AlertLogIDArrayPointerType ; - variable Min, Max, Len, OldLen, OldMax : integer ; - begin - Min := minimum(L, R) ; - Max := maximum(L, R) ; - OldLen := ArrayLengthVar ; - OldMax := Min + ArrayLengthVar - 1 ; - Len := Max - Min + 1 ; - ArrayLengthVar := Len ; - if Len >= OldLen then - FirstIndexVar := Min ; - - OldHeadPointer := HeadPointer ; - HeadPointer := new ListArrayType(Min to Max) ; - if OldHeadPointer /= NULL then - HeadPointer(Min to OldMax) := OldHeadPointer.all ; -- (OldHeadPointer'range) ; - Deallocate(OldHeadPointer) ; - end if ; - - OldTailPointer := TailPointer ; - TailPointer := new ListArrayType(Min to Max) ; - if OldTailPointer /= NULL then - TailPointer(Min to OldMax) := OldTailPointer.all ; - Deallocate(OldTailPointer) ; - end if ; - - OldPopListPointer := PopListPointer ; - PopListPointer := new ListArrayType(Min to Max) ; - if OldPopListPointer /= NULL then - PopListPointer(Min to OldMax) := OldPopListPointer.all ; - Deallocate(OldPopListPointer) ; - end if ; - - OldErrCnt := ErrCntVar ; - ErrCntVar := new IntegerArrayType'(Min to Max => 0) ; - if OldErrCnt /= NULL then - ErrCntVar(Min to OldMax) := OldErrCnt.all ; - Deallocate(OldErrCnt) ; - end if ; - - OldDropCount := DropCountVar ; - DropCountVar := new IntegerArrayType'(Min to Max => 0) ; - if OldDropCount /= NULL then - DropCountVar(Min to OldMax) := OldDropCount.all ; - Deallocate(OldDropCount) ; - end if ; - - OldItemNumber := ItemNumberVar ; - ItemNumberVar := new IntegerArrayType'(Min to Max => 0) ; - if OldItemNumber /= NULL then - ItemNumberVar(Min to OldMax) := OldItemNumber.all ; - Deallocate(OldItemNumber) ; - end if ; - - OldCheckCount := CheckCountVar ; - CheckCountVar := new IntegerArrayType'(Min to Max => 0) ; - if OldCheckCount /= NULL then - CheckCountVar(Min to OldMax) := OldCheckCount.all ; - Deallocate(OldCheckCount) ; - end if ; - - OldAlertLogIDVar := AlertLogIDVar ; - AlertLogIDVar := new AlertLogIDArrayType'(Min to Max => OSVVM_SCOREBOARD_ALERTLOG_ID) ; - if OldAlertLogIDVar /= NULL then - AlertLogIDVar(Min to OldMax) := OldAlertLogIDVar.all ; - Deallocate(OldAlertLogIDVar) ; - end if ; - - elsif Len < OldLen then - report "ScoreboardGenericPkg: SetArrayIndex, new array Length <= current array length" - severity failure ; - - end if ; - end procedure SetArrayIndex ; - - ------------------------------------------------------------ - procedure SetArrayIndex(R : natural) is - ------------------------------------------------------------ - begin - SetArrayIndex(1, R) ; - end procedure SetArrayIndex ; - - ------------------------------------------------------------ - procedure Deallocate is - ------------------------------------------------------------ - variable CurListPtr, LastListPtr : ListPointerType ; - begin - for Index in HeadPointer'range loop - -- Deallocate contents in the scoreboards - CurListPtr := HeadPointer(Index) ; - while CurListPtr /= Null loop - deallocate(CurListPtr.TagPtr) ; - deallocate(CurListPtr.ExpectedPtr) ; - LastListPtr := CurListPtr ; - CurListPtr := CurListPtr.NextPtr ; - Deallocate(LastListPtr) ; - end loop ; - end loop ; - - for Index in PopListPointer'range loop - -- Deallocate PopListPointer - only has single element - CurListPtr := PopListPointer(Index) ; - if CurListPtr /= NULL then - deallocate(CurListPtr.TagPtr) ; - deallocate(CurListPtr.ExpectedPtr) ; - deallocate(CurListPtr) ; - end if ; - end loop ; - - -- Deallocate arrays of pointers - Deallocate(HeadPointer) ; - Deallocate(TailPointer) ; - Deallocate(PopListPointer) ; - - -- Deallocate supporting arrays - Deallocate(ErrCntVar) ; - Deallocate(DropCountVar) ; - Deallocate(ItemNumberVar) ; - Deallocate(CheckCountVar) ; - Deallocate(AlertLogIDVar) ; - - -- Deallocate NameVar - NamePType - NameVar.Deallocate ; - - ArrayLengthVar := 0 ; - end procedure Deallocate ; - - ------------------------------------------------------------ - -- Construct initial data structure - procedure Initialize is - ------------------------------------------------------------ - begin - SetArrayIndex(1, 1) ; - end procedure Initialize ; - - ------------------------------------------------------------ - impure function GetArrayIndex return integer_vector is - ------------------------------------------------------------ - begin - return (1 => HeadPointer'left, 2 => HeadPointer'right) ; - end function GetArrayIndex ; - - ------------------------------------------------------------ - impure function GetArrayLength return natural is - ------------------------------------------------------------ - begin - return ArrayLengthVar ; -- HeadPointer'length ; - end function GetArrayLength ; - - ------------------------------------------------------------ - procedure SetAlertLogID (Index : Integer ; A : AlertLogIDType) is - ------------------------------------------------------------ - begin - AlertLogIDVar(Index) := A ; - end procedure SetAlertLogID ; - - ------------------------------------------------------------ - procedure SetAlertLogID (A : AlertLogIDType) is - ------------------------------------------------------------ - begin - AlertLogIDVar(FirstIndexVar) := A ; - end procedure SetAlertLogID ; - - ------------------------------------------------------------ - procedure SetAlertLogID(Index : Integer ; Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogIDVar(Index) := GetAlertLogID(Name, ParentID, CreateHierarchy) ; - end procedure SetAlertLogID ; - - ------------------------------------------------------------ - procedure SetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogIDVar(FirstIndexVar) := GetAlertLogID(Name, ParentID, CreateHierarchy) ; - end procedure SetAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogID(Index : Integer) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogIDVar(Index) ; - end function GetAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogID return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogIDVar(FirstIndexVar) ; - end function GetAlertLogID ; - - ------------------------------------------------------------ - impure function LocalOutOfRange( - ------------------------------------------------------------ - constant Index : in integer ; - constant Name : in string - ) return boolean is - begin - return AlertIf(OSVVM_SCOREBOARD_ALERTLOG_ID, Index < HeadPointer'Low or Index > HeadPointer'High, - GetName & " " & Name & " Index: " & to_string(Index) & - "is not in the range (" & to_string(HeadPointer'Low) & - "to " & to_string(HeadPointer'High) & ")", - FAILURE ) ; - end function LocalOutOfRange ; - - ------------------------------------------------------------ - procedure LocalPush ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Tag : in string ; - constant Item : in ExpectedType - ) is - variable ExpectedPtr : ExpectedPointerType ; - variable TagPtr : line ; - begin - if LocalOutOfRange(Index, "Push") then - return ; -- error reporting in LocalOutOfRange - end if ; - - ItemNumberVar(Index) := ItemNumberVar(Index) + 1 ; - ExpectedPtr := new ExpectedType'(Item) ; - TagPtr := new string'(Tag) ; - - if HeadPointer(Index) = NULL then - -- 2015.05: allocation using ListTtype'(...) in a protected type does not work in some simulators - -- HeadPointer(Index) := new ListType'(ItemNumberVar(Index), TagPtr, ExpectedPtr, NULL) ; - HeadPointer(Index) := new ListType ; - HeadPointer(Index).ItemNumber := ItemNumberVar(Index) ; - HeadPointer(Index).TagPtr := TagPtr ; - HeadPointer(Index).ExpectedPtr := ExpectedPtr ; - HeadPointer(Index).NextPtr := NULL ; - TailPointer(Index) := HeadPointer(Index) ; - else - -- 2015.05: allocation using ListTtype'(...) in a protected type does not work in some simulators - -- TailPointer(Index).NextPtr := new ListType'(ItemNumberVar(Index), TagPtr, ExpectedPtr, NULL) ; - TailPointer(Index).NextPtr := new ListType ; - TailPointer(Index).NextPtr.ItemNumber := ItemNumberVar(Index) ; - TailPointer(Index).NextPtr.TagPtr := TagPtr ; - TailPointer(Index).NextPtr.ExpectedPtr := ExpectedPtr ; - TailPointer(Index).NextPtr.NextPtr := NULL ; - TailPointer(Index) := TailPointer(Index).NextPtr ; - end if ; - end procedure LocalPush ; - - ------------------------------------------------------------ - -- Array of Tagged Scoreboards - procedure Push ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Tag : in string ; - constant Item : in ExpectedType - ) is - variable ExpectedPtr : ExpectedPointerType ; - variable TagPtr : line ; - begin - if LocalOutOfRange(Index, "Push") then - return ; -- error reporting in LocalOutOfRange - end if ; - LocalPush(Index, Tag, Item) ; - end procedure Push ; - - ------------------------------------------------------------ - -- Array of Scoreboards, no tag - procedure Push ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Item : in ExpectedType - ) is - begin - if LocalOutOfRange(Index, "Push") then - return ; -- error reporting in LocalOutOfRange - end if ; - LocalPush(Index, "", Item) ; - end procedure Push ; - - ------------------------------------------------------------ - -- Simple Tagged Scoreboard - procedure Push ( - ------------------------------------------------------------ - constant Tag : in string ; - constant Item : in ExpectedType - ) is - begin - LocalPush(FirstIndexVar, Tag, Item) ; - end procedure Push ; - - ------------------------------------------------------------ - -- Simple Scoreboard, no tag - procedure Push (Item : in ExpectedType) is - ------------------------------------------------------------ - begin - LocalPush(FirstIndexVar, "", Item) ; - end procedure Push ; - - ------------------------------------------------------------ - -- Array of Tagged Scoreboards - impure function Push ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Tag : in string ; - constant Item : in ExpectedType - ) return ExpectedType is - begin - if LocalOutOfRange(Index, "Push") then - return Item ; -- error reporting in LocalOutOfRange - end if ; - LocalPush(Index, Tag, Item) ; - return Item ; - end function Push ; - - ------------------------------------------------------------ - -- Array of Scoreboards, no tag - impure function Push ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Item : in ExpectedType - ) return ExpectedType is - begin - if LocalOutOfRange(Index, "Push") then - return Item ; -- error reporting in LocalOutOfRange - end if ; - LocalPush(Index, "", Item) ; - return Item ; - end function Push ; - - ------------------------------------------------------------ - -- Simple Tagged Scoreboard - impure function Push ( - ------------------------------------------------------------ - constant Tag : in string ; - constant Item : in ExpectedType - ) return ExpectedType is - begin - LocalPush(FirstIndexVar, Tag, Item) ; - return Item ; - end function Push ; - - ------------------------------------------------------------ - -- Simple Scoreboard, no tag - impure function Push (Item : ExpectedType) return ExpectedType is - ------------------------------------------------------------ - begin - LocalPush(FirstIndexVar, "", Item) ; - return Item ; - end function Push ; - - ------------------------------------------------------------ - -- Local Only - -- Pops highest element matching Tag into PopListPointer(Index) - procedure LocalPop (Index : integer ; Tag : string; Name : string) is - ------------------------------------------------------------ - variable CurPtr : ListPointerType ; - begin - if LocalOutOfRange(Index, "Pop/Check") then - return ; -- error reporting in LocalOutOfRange - end if ; - if HeadPointer(Index) = NULL then - ErrCntVar(Index) := ErrCntVar(Index) + 1 ; - Alert(AlertLogIDVar(Index), GetName & " Empty during " & Name, FAILURE) ; - return ; - end if ; - -- deallocate previous pointer - if PopListPointer(Index) /= NULL then - deallocate(PopListPointer(Index).TagPtr) ; - deallocate(PopListPointer(Index).ExpectedPtr) ; - deallocate(PopListPointer(Index)) ; - end if ; - -- Descend to find Tag field and extract - CurPtr := HeadPointer(Index) ; - if CurPtr.TagPtr.all = Tag then - -- Non-tagged scoreboards find this one. - PopListPointer(Index) := HeadPointer(Index) ; - HeadPointer(Index) := HeadPointer(Index).NextPtr ; - else - loop - if CurPtr.NextPtr = NULL then - ErrCntVar(Index) := ErrCntVar(Index) + 1 ; - Alert(AlertLogIDVar(Index), GetName & " Pop/Check (" & Name & "), tag: " & Tag & " not found", FAILURE) ; - exit ; - elsif CurPtr.NextPtr.TagPtr.all = Tag then - PopListPointer(Index) := CurPtr.NextPtr ; - CurPtr.NextPtr := CurPtr.NextPtr.NextPtr ; - if CurPtr.NextPtr = NULL then - TailPointer(Index) := CurPtr ; - end if ; - exit ; - else - CurPtr := CurPtr.NextPtr ; - end if ; - end loop ; - end if ; - end procedure LocalPop ; - - ------------------------------------------------------------ - -- Local Only - procedure LocalCheck ( - ------------------------------------------------------------ - constant Index : in integer ; - constant ActualData : in ActualType - ) is - variable ExpectedPtr : ExpectedPointerType ; - variable CurrentItem : integer ; - variable WriteBuf : line ; - variable FoundError : boolean ; - begin - CheckCountVar(Index) := CheckCountVar(Index) + 1 ; - ExpectedPtr := PopListPointer(Index).ExpectedPtr ; - CurrentItem := PopListPointer(Index).ItemNumber ; - - if not Match(ActualData, ExpectedPtr.all) then - ErrCntVar(Index) := ErrCntVar(Index) + 1 ; - FoundError := TRUE ; - else - FoundError := FALSE ; - end if ; - - IncAffirmCount ; - --- if FoundError or ReportModeVar = REPORT_ALL then - if FoundError or GetLogEnable(AlertLogIDVar(Index), PASSED) then - if AlertLogIDVar(Index) = OSVVM_SCOREBOARD_ALERTLOG_ID then - write(WriteBuf, GetName(DefaultName => "Scoreboard")) ; - else - write(WriteBuf, GetName(DefaultName => "")) ; - end if ; - if ArrayLengthVar > 1 then - write(WriteBuf, " (" & to_string(Index) & ") ") ; - end if ; - write(WriteBuf, " Received: " & actual_to_string(ActualData)) ; - if FoundError then - write(WriteBuf, " Expected: " & expected_to_string(ExpectedPtr.all)) ; - end if ; - if PopListPointer(Index).TagPtr.all /= "" then - write(WriteBuf, " Tag: " & PopListPointer(Index).TagPtr.all) ; - end if; - write(WriteBuf, " Item Number: " & to_string(CurrentItem)) ; - if FoundError then - if ReportModeVar /= REPORT_NONE then - -- Affirmation Failed - Alert(AlertLogIDVar(Index), WriteBuf.all, ERROR) ; - else - -- Affirmation Failed, but silent, unless in DEBUG mode - Log(AlertLogIDVar(Index), "ERROR " & WriteBuf.all, DEBUG) ; - IncAlertCount(AlertLogIDVar(Index)) ; -- Silent Counted Alert - end if ; - else - -- Affirmation passed - Log(AlertLogIDVar(Index), WriteBuf.all, PASSED) ; - end if ; - deallocate(WriteBuf) ; - end if ; - end procedure LocalCheck ; - - ------------------------------------------------------------ - -- Array of Tagged Scoreboards - procedure Check ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Tag : in string ; - constant ActualData : in ActualType - ) is - begin - if LocalOutOfRange(Index, "Check") then - return ; -- error reporting in LocalOutOfRange - end if ; - LocalPop(Index, Tag, "Check") ; - LocalCheck(Index, ActualData) ; - end procedure Check ; - - ------------------------------------------------------------ - -- Array of Scoreboards, no tag - procedure Check ( - ------------------------------------------------------------ - constant Index : in integer ; - constant ActualData : in ActualType - ) is - begin - if LocalOutOfRange(Index, "Check") then - return ; -- error reporting in LocalOutOfRange - end if ; - LocalPop(Index, "", "Check") ; - LocalCheck(Index, ActualData) ; - end procedure Check ; - - ------------------------------------------------------------ - -- Simple Tagged Scoreboard - procedure Check ( - ------------------------------------------------------------ - constant Tag : in string ; - constant ActualData : in ActualType - ) is - begin - LocalPop(FirstIndexVar, Tag, "Check") ; - LocalCheck(FirstIndexVar, ActualData) ; - end procedure Check ; - - ------------------------------------------------------------ - -- Simple Scoreboard, no tag - procedure Check (ActualData : ActualType) is - ------------------------------------------------------------ - begin - LocalPop(FirstIndexVar, "", "Check") ; - LocalCheck(FirstIndexVar, ActualData) ; - end procedure Check ; - - ------------------------------------------------------------ - -- Array of Tagged Scoreboards - procedure Pop ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Tag : in string ; - variable Item : out ExpectedType - ) is - begin - if LocalOutOfRange(Index, "Pop") then - return ; -- error reporting in LocalOutOfRange - end if ; - LocalPop(Index, Tag, "Pop") ; - Item := PopListPointer(Index).ExpectedPtr.all ; - end procedure Pop ; - - ------------------------------------------------------------ - -- Array of Scoreboards, no tag - procedure Pop ( - ------------------------------------------------------------ - constant Index : in integer ; - variable Item : out ExpectedType - ) is - begin - if LocalOutOfRange(Index, "Pop") then - return ; -- error reporting in LocalOutOfRange - end if ; - LocalPop(Index, "", "Pop") ; - Item := PopListPointer(Index).ExpectedPtr.all ; - end procedure Pop ; - - ------------------------------------------------------------ - -- Simple Tagged Scoreboard - procedure Pop ( - ------------------------------------------------------------ - constant Tag : in string ; - variable Item : out ExpectedType - ) is - begin - LocalPop(FirstIndexVar, Tag, "Pop") ; - Item := PopListPointer(FirstIndexVar).ExpectedPtr.all ; - end procedure Pop ; - - ------------------------------------------------------------ - -- Simple Scoreboard, no tag - procedure Pop (variable Item : out ExpectedType) is - ------------------------------------------------------------ - begin - LocalPop(FirstIndexVar, "", "Pop") ; - Item := PopListPointer(FirstIndexVar).ExpectedPtr.all ; - end procedure Pop ; - - ------------------------------------------------------------ - -- Array of Tagged Scoreboards - impure function Pop ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Tag : in string - ) return ExpectedType is - begin - if LocalOutOfRange(Index, "Pop") then - -- error reporting in LocalOutOfRange - return PopListPointer(FirstIndexVar).ExpectedPtr.all ; - end if ; - LocalPop(Index, Tag, "Pop") ; - return PopListPointer(Index).ExpectedPtr.all ; - end function Pop ; - - ------------------------------------------------------------ - -- Array of Scoreboards, no tag - impure function Pop (Index : integer) return ExpectedType is - ------------------------------------------------------------ - begin - if LocalOutOfRange(Index, "Pop") then - -- error reporting in LocalOutOfRange - return PopListPointer(FirstIndexVar).ExpectedPtr.all ; - end if ; - LocalPop(Index, "", "Pop") ; - return PopListPointer(Index).ExpectedPtr.all ; - end function Pop ; - - ------------------------------------------------------------ - -- Simple Tagged Scoreboard - impure function Pop ( - ------------------------------------------------------------ - constant Tag : in string - ) return ExpectedType is - begin - LocalPop(FirstIndexVar, Tag, "Pop") ; - return PopListPointer(FirstIndexVar).ExpectedPtr.all ; - end function Pop ; - - ------------------------------------------------------------ - -- Simple Scoreboard, no tag - impure function Pop return ExpectedType is - ------------------------------------------------------------ - begin - LocalPop(FirstIndexVar, "", "Pop") ; - return PopListPointer(FirstIndexVar).ExpectedPtr.all ; - end function Pop ; - - ------------------------------------------------------------ - -- Array of Tagged Scoreboards - impure function Empty (Index : integer; Tag : String) return boolean is - ------------------------------------------------------------ - variable CurPtr : ListPointerType ; - begin - CurPtr := HeadPointer(Index) ; - while CurPtr /= NULL loop - if CurPtr.TagPtr.all = Tag then - return FALSE ; -- Found Tag - end if ; - CurPtr := CurPtr.NextPtr ; - end loop ; - return TRUE ; -- Tag not found - end function Empty ; - - ------------------------------------------------------------ - -- Array of Scoreboards, no tag - impure function Empty (Index : integer) return boolean is - ------------------------------------------------------------ - begin - return HeadPointer(Index) = NULL ; - end function Empty ; - - ------------------------------------------------------------ - -- Simple Tagged Scoreboard - impure function Empty (Tag : String) return boolean is - ------------------------------------------------------------ - variable CurPtr : ListPointerType ; - begin - return Empty(FirstIndexVar, Tag) ; - end function Empty ; - - ------------------------------------------------------------ - -- Simple Scoreboard, no tag - impure function Empty return boolean is - ------------------------------------------------------------ - begin - return HeadPointer(FirstIndexVar) = NULL ; - end function Empty ; - - ------------------------------------------------------------ - procedure CheckFinish ( - ------------------------------------------------------------ - Index : integer ; - FinishCheckCount : integer ; - FinishEmpty : boolean - ) is - variable EmptyError : Boolean ; - variable WriteBuf : line ; - begin - if AlertLogIDVar(Index) = OSVVM_SCOREBOARD_ALERTLOG_ID then - write(WriteBuf, GetName(DefaultName => "Scoreboard")) ; - else - write(WriteBuf, GetName(DefaultName => "")) ; - end if ; - if ArrayLengthVar > 1 then - if WriteBuf.all /= "" then - swrite(WriteBuf, " ") ; - end if ; - write(WriteBuf, "Index(" & to_string(Index) & "), ") ; - else - if WriteBuf.all /= "" then - swrite(WriteBuf, ", ") ; - end if ; - end if ; - if FinishEmpty then - AffirmIf(AlertLogIDVar(Index), Empty(Index), WriteBuf.all & "Checking Empty: " & to_string(Empty(Index)) & - " FinishEmpty: " & to_string(FinishEmpty)) ; - if not Empty(Index) then - -- Increment internal count on FinishEmpty Error - ErrCntVar(Index) := ErrCntVar(Index) + 1 ; - end if ; - end if ; - AffirmIf(AlertLogIDVar(Index), CheckCountVar(Index) >= FinishCheckCount, WriteBuf.all & - "Checking CheckCount: " & to_string(CheckCountVar(Index)) & - " >= Expected: " & to_string(FinishCheckCount)) ; - if not (CheckCountVar(Index) >= FinishCheckCount) then - -- Increment internal count on FinishCheckCount Error - ErrCntVar(Index) := ErrCntVar(Index) + 1 ; - end if ; - deallocate(WriteBuf) ; - end procedure CheckFinish ; - - ------------------------------------------------------------ - procedure CheckFinish ( - ------------------------------------------------------------ - FinishCheckCount : integer ; - FinishEmpty : boolean - ) is - begin - for AlertLogID in AlertLogIDVar'range loop - CheckFinish(AlertLogID, FinishCheckCount, FinishEmpty) ; - end loop ; - end procedure CheckFinish ; - - ------------------------------------------------------------ - impure function GetErrorCount (Index : integer) return integer is - ------------------------------------------------------------ - begin - return ErrCntVar(Index) ; - end function GetErrorCount ; - - ------------------------------------------------------------ - impure function GetErrorCount return integer is - ------------------------------------------------------------ - variable TotalErrorCount : integer := 0 ; - begin - for Index in AlertLogIDVar'range loop - TotalErrorCount := TotalErrorCount + GetErrorCount(Index) ; - end loop ; - return TotalErrorCount ; - end function GetErrorCount ; - - ------------------------------------------------------------ - procedure IncErrorCount (Index : integer) is - ------------------------------------------------------------ - begin - ErrCntVar(Index) := ErrCntVar(Index) + 1 ; - IncAlertCount(AlertLogIDVar(Index), ERROR) ; - end IncErrorCount ; - - ------------------------------------------------------------ - procedure IncErrorCount is - ------------------------------------------------------------ - begin - ErrCntVar(FirstIndexVar) := ErrCntVar(FirstIndexVar) + 1 ; - IncAlertCount(AlertLogIDVar(FirstIndexVar), ERROR) ; - end IncErrorCount ; - - ------------------------------------------------------------ - procedure SetErrorCountZero (Index : integer) is - ------------------------------------------------------------ - begin - ErrCntVar(Index) := 0; - end procedure SetErrorCountZero ; - - ------------------------------------------------------------ - procedure SetErrorCountZero is - ------------------------------------------------------------ - begin - ErrCntVar(FirstIndexVar) := 0 ; - end procedure SetErrorCountZero ; - - ------------------------------------------------------------ - impure function GetItemCount (Index : integer) return integer is - ------------------------------------------------------------ - begin - return ItemNumberVar(Index) ; - end function GetItemCount ; - - ------------------------------------------------------------ - impure function GetItemCount return integer is - ------------------------------------------------------------ - begin - return ItemNumberVar(FirstIndexVar) ; - end function GetItemCount ; - - ------------------------------------------------------------ - impure function GetCheckCount (Index : integer) return integer is - ------------------------------------------------------------ - begin - return CheckCountVar(Index) ; - end function GetCheckCount ; - - ------------------------------------------------------------ - impure function GetCheckCount return integer is - ------------------------------------------------------------ - begin - return CheckCountVar(FirstIndexVar) ; - end function GetCheckCount ; - - ------------------------------------------------------------ - impure function GetDropCount (Index : integer) return integer is - ------------------------------------------------------------ - begin - return DropCountVar(Index) ; - end function GetDropCount ; - - ------------------------------------------------------------ - impure function GetDropCount return integer is - ------------------------------------------------------------ - begin - return DropCountVar(FirstIndexVar) ; - end function GetDropCount ; - - ------------------------------------------------------------ - procedure SetFinish ( - ------------------------------------------------------------ - Index : integer ; - FCheckCount : integer ; - FEmpty : boolean := TRUE; - FStatus : boolean := TRUE - ) is - begin - Alert(AlertLogIDVar(Index), "OSVVM.ScoreboardGenericPkg.SetFinish: Deprecated and removed. See CheckFinish", ERROR) ; - end procedure SetFinish ; - - ------------------------------------------------------------ - procedure SetFinish ( - ------------------------------------------------------------ - FCheckCount : integer ; - FEmpty : boolean := TRUE; - FStatus : boolean := TRUE - ) is - begin - SetFinish(FirstIndexVar, FCheckCount, FEmpty, FStatus) ; - end procedure SetFinish ; - - ------------------------------------------------------------ - -- Array of Tagged Scoreboards - -- Find Element with Matching Tag and ActualData - -- Returns integer'left if no match found - impure function Find ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Tag : in string; - constant ActualData : in ActualType - ) return integer is - variable CurPtr : ListPointerType ; - begin - if LocalOutOfRange(Index, "Find") then - return integer'left ; -- error reporting in LocalOutOfRange - end if ; - CurPtr := HeadPointer(Index) ; - loop - if CurPtr = NULL then - -- Failed to find it - ErrCntVar(Index) := ErrCntVar(Index) + 1 ; - if Tag /= "" then - Alert(AlertLogIDVar(Index), - GetName & " Did not find Tag: " & Tag & " and Actual Data: " & actual_to_string(ActualData), - FAILURE ) ; - else - Alert(AlertLogIDVar(Index), - GetName & " Did not find Actual Data: " & actual_to_string(ActualData), - FAILURE ) ; - end if ; - return integer'left ; - - elsif CurPtr.TagPtr.all = Tag and - Match(ActualData, CurPtr.ExpectedPtr.all) then - -- Found it. Return Index. - return CurPtr.ItemNumber ; - - else -- Descend - CurPtr := CurPtr.NextPtr ; - end if ; - end loop ; - end function Find ; - - ------------------------------------------------------------ - -- Array of Simple Scoreboards - -- Find Element with Matching ActualData - impure function Find ( - ------------------------------------------------------------ - constant Index : in integer ; - constant ActualData : in ActualType - ) return integer is - begin - return Find(Index, "", ActualData) ; - end function Find ; - - ------------------------------------------------------------ - -- Tagged Scoreboard - -- Find Element with Matching ActualData - impure function Find ( - ------------------------------------------------------------ - constant Tag : in string; - constant ActualData : in ActualType - ) return integer is - begin - return Find(FirstIndexVar, Tag, ActualData) ; - end function Find ; - - ------------------------------------------------------------ - -- Simple Scoreboard - -- Find Element with Matching ActualData - impure function Find ( - ------------------------------------------------------------ - constant ActualData : in ActualType - ) return integer is - begin - return Find(FirstIndexVar, "", ActualData) ; - end function Find ; - - ------------------------------------------------------------ - -- Array of Tagged Scoreboards - -- Flush Remove elements with tag whose itemNumber is <= ItemNumber parameter - procedure Flush ( - ------------------------------------------------------------ - constant Index : in integer ; - constant Tag : in string ; - constant ItemNumber : in integer - ) is - variable CurPtr, RemovePtr, LastPtr : ListPointerType ; - begin - if LocalOutOfRange(Index, "Find") then - return ; -- error reporting in LocalOutOfRange - end if ; - CurPtr := HeadPointer(Index) ; - LastPtr := NULL ; - loop - if CurPtr = NULL then - -- Done - return ; - elsif CurPtr.TagPtr.all = Tag then - if ItemNumber >= CurPtr.ItemNumber then - -- remove it - RemovePtr := CurPtr ; - if CurPtr = TailPointer(Index) then - TailPointer(Index) := LastPtr ; - end if ; - if CurPtr = HeadPointer(Index) then - HeadPointer(Index) := CurPtr.NextPtr ; - else -- if LastPtr /= NULL then - LastPtr.NextPtr := LastPtr.NextPtr.NextPtr ; - end if ; - CurPtr := CurPtr.NextPtr ; - -- LastPtr := LastPtr ; -- no change - DropCountVar(Index) := DropCountVar(Index) + 1 ; - deallocate(RemovePtr.TagPtr) ; - deallocate(RemovePtr.ExpectedPtr) ; - deallocate(RemovePtr) ; - else - -- Done - return ; - end if ; - else - -- Descend - LastPtr := CurPtr ; - CurPtr := CurPtr.NextPtr ; - end if ; - end loop ; - end procedure Flush ; - - ------------------------------------------------------------ - -- Tagged Scoreboard - -- Flush Remove elements with tag whose itemNumber is <= ItemNumber parameter - procedure Flush ( - ------------------------------------------------------------ - constant Tag : in string ; - constant ItemNumber : in integer - ) is - begin - Flush(FirstIndexVar, Tag, ItemNumber) ; - end procedure Flush ; - - ------------------------------------------------------------ - -- Array of Simple Scoreboards - -- Flush - Remove Elements upto and including the one with ItemNumber - procedure Flush ( - ------------------------------------------------------------ - constant Index : in integer ; - constant ItemNumber : in integer - ) is - variable CurPtr : ListPointerType ; - begin - if LocalOutOfRange(Index, "Find") then - return ; -- error reporting in LocalOutOfRange - end if ; - CurPtr := HeadPointer(Index) ; - loop - if CurPtr = NULL then - -- Done - return ; - elsif ItemNumber >= CurPtr.ItemNumber then - -- Descend, Check Tail, Deallocate - HeadPointer(Index) := HeadPointer(Index).NextPtr ; - if CurPtr = TailPointer(Index) then - TailPointer(Index) := NULL ; - end if ; - DropCountVar(Index) := DropCountVar(Index) + 1 ; - deallocate(CurPtr.TagPtr) ; - deallocate(CurPtr.ExpectedPtr) ; - deallocate(CurPtr) ; - CurPtr := HeadPointer(Index) ; - else - -- Done - return ; - end if ; - end loop ; - end procedure Flush ; - - ------------------------------------------------------------ - -- Simple Scoreboard - -- Flush - Remove Elements upto and including the one with ItemNumber - procedure Flush ( - ------------------------------------------------------------ - constant ItemNumber : in integer - ) is - begin - Flush(FirstIndexVar, ItemNumber) ; - end procedure Flush ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- Remaining Deprecated. - ------------------------------------------------------------ - ------------------------------------------------------------ - - ------------------------------------------------------------ - -- Deprecated. Maintained for backward compatibility. - -- Use TranscriptPkg.TranscriptOpen - procedure FileOpen (FileName : string; OpenKind : File_Open_Kind ) is - ------------------------------------------------------------ - begin - -- WriteFileInit := TRUE ; - -- file_open( WriteFile , FileName , OpenKind ); - TranscriptOpen(FileName, OpenKind) ; - end procedure FileOpen ; - - - ------------------------------------------------------------ - -- Deprecated. Maintained for backward compatibility. - procedure PutExpectedData (ExpectedData : ExpectedType) is - ------------------------------------------------------------ - begin - Push(ExpectedData) ; - end procedure PutExpectedData ; - - ------------------------------------------------------------ - -- Deprecated. Maintained for backward compatibility. - procedure CheckActualData (ActualData : ActualType) is - ------------------------------------------------------------ - begin - Check(ActualData) ; - end procedure CheckActualData ; - - ------------------------------------------------------------ - -- Deprecated. Maintained for backward compatibility. - impure function GetItemNumber return integer is - ------------------------------------------------------------ - begin - return GetItemCount(FirstIndexVar) ; - end GetItemNumber ; - - ------------------------------------------------------------ - -- Deprecated. Maintained for backward compatibility. - procedure SetMessage (MessageIn : String) is - ------------------------------------------------------------ - begin - -- deallocate(Message) ; - -- Message := new string'(MessageIn) ; - SetName(MessageIn) ; - end procedure SetMessage ; - - ------------------------------------------------------------ - -- Deprecated. Maintained for backward compatibility. - impure function GetMessage return string is - ------------------------------------------------------------ - begin - -- return Message.all ; - return GetName("Scoreboard") ; - end function GetMessage ; - - end protected body ScoreBoardPType ; +-- +-- File Name: ScoreBoardGenericPkg.vhd +-- Design Unit Name: ScoreBoardGenericPkg +-- Revision: STANDARD VERSION +-- +-- Maintainer: Jim Lewis email: jim@synthworks.com +-- Contributor(s): +-- Jim Lewis email: jim@synthworks.com +-- +-- +-- Description: +-- Defines types and methods to implement a FIFO based Scoreboard +-- Defines type ScoreBoardPType +-- Defines methods for putting values the scoreboard +-- +-- Developed for: +-- SynthWorks Design Inc. +-- VHDL Training Classes +-- 11898 SW 128th Ave. Tigard, Or 97223 +-- http://www.SynthWorks.com +-- +-- Latest standard version available at: +-- http://www.SynthWorks.com/downloads +-- +-- Revision History: +-- Date Version Description +-- 12/2006: 2006.12 Initial revision +-- 08/2010 2010.08 Added Tailpointer +-- 05/2012 2012.05 Changed FIFO to store pointers to ExpectedType +-- Allows usage of unconstrained arrays +-- 08/2012 2012.08 Added Type and Subprogram Generics +-- 08/2013 2013.08 Generics: to_string replaced write, Match replaced check +-- Added Tags - Experimental +-- Added Array of Scoreboards +-- 09/2013 2013.09 Added file handling, Check Count, Finish Status +-- Find, Flush +-- 06/2015 2015.06 Added Alerts, SetAlertLogID, Revised LocalPush, GetDropCount, +-- Deprecated SetFinish and ReportMode - REPORT_NONE, FileOpen +-- Deallocate, Initialized, Function SetName +-- 11/2016 2016.11 Released as part of OSVVM +-- 05/2017 2017.05 First print Actual then only print Expected if mis-match +-- +-- +-- Copyright (c) 2006 - 2016 by SynthWorks Design Inc. All rights reserved. +-- +-- Verbatim copies of this source file may be used and +-- distributed without restriction. +-- +-- This source file is free software; you can redistribute it +-- and/or modify it under the terms of the ARTISTIC License +-- as published by The Perl Foundation; either version 2.0 of +-- the License, or (at your option) any later version. +-- +-- This source is distributed in the hope that it will be +-- useful, but WITHOUT ANY WARRANTY; without even the implied +-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +-- PURPOSE. See the Artistic License for details. +-- +-- You should have received a copy of the license with this source. +-- If not download it from, +-- http://www.perlfoundation.org/artistic_license_2_0 +-- +-- + +use std.textio.all ; + +library ieee ; + use ieee.std_logic_1164.all ; + use ieee.numeric_std.all ; + + use work.TranscriptPkg.all ; + use work.AlertLogPkg.all ; + use work.NamePkg.all ; + + +package ScoreboardGenericPkg is + generic ( + type ExpectedType ; + type ActualType ; + function Match(Actual : ActualType ; -- defaults + Expected : ExpectedType) return boolean ; -- is "=" ; + function expected_to_string(A : ExpectedType) return string ; -- is to_string ; + function actual_to_string (A : ActualType) return string -- is to_string ; + ) ; + +-- -- For a VHDL-2002 package, comment out the generics and +-- -- uncomment the following, it replaces a generic instance of the package. +-- -- As a result, you will have multiple copies of the entire package. +-- -- Inconvenient, but ok as it still works the same. +-- subtype ExpectedType is std_logic_vector ; +-- subtype ActualType is std_logic_vector ; +-- alias Match is std_match [ActualType, ExpectedType return boolean] ; -- for std_logic_vector +-- alias expected_to_string is to_hstring [ExpectedType return string]; -- VHDL-2008 +-- alias actual_to_string is to_hstring [ActualType return string]; -- VHDL-2008 + + -- ScoreboardReportType is deprecated + -- Replaced by Affirmations. ERROR is the default. ALL turns on PASSED flag + type ScoreboardReportType is (REPORT_ERROR, REPORT_ALL, REPORT_NONE) ; -- replaced by affirmations + + type ScoreBoardPType is protected + + ------------------------------------------------------------ + -- Emulate arrays of scoreboards + procedure SetArrayIndex(L, R : integer) ; -- supports integer indices + procedure SetArrayIndex(R : natural) ; -- indicies 1 to R + impure function GetArrayIndex return integer_vector ; + impure function GetArrayLength return natural ; + + ------------------------------------------------------------ + -- Push items into the scoreboard/FIFO + + -- Simple Scoreboard, no tag + procedure Push (Item : in ExpectedType) ; + + -- Simple Tagged Scoreboard + procedure Push ( + constant Tag : in string ; + constant Item : in ExpectedType + ) ; + + -- Array of Scoreboards, no tag + procedure Push ( + constant Index : in integer ; + constant Item : in ExpectedType + ) ; + + -- Array of Tagged Scoreboards + procedure Push ( + constant Index : in integer ; + constant Tag : in string ; + constant Item : in ExpectedType + ) ; + +-- ------------------------------------------------------------ +-- -- Push items into the scoreboard/FIFO +-- -- Function form supports chaining of operations +-- -- In 2013, this caused overloading issues in some simulators, will retest later +-- +-- -- Simple Scoreboard, no tag +-- impure function Push (Item : ExpectedType) return ExpectedType ; +-- +-- -- Simple Tagged Scoreboard +-- impure function Push ( +-- constant Tag : in string ; +-- constant Item : in ExpectedType +-- ) return ExpectedType ; +-- +-- -- Array of Scoreboards, no tag +-- impure function Push ( +-- constant Index : in integer ; +-- constant Item : in ExpectedType +-- ) return ExpectedType ; +-- +-- -- Array of Tagged Scoreboards +-- impure function Push ( +-- constant Index : in integer ; +-- constant Tag : in string ; +-- constant Item : in ExpectedType +-- ) return ExpectedType ; -- for chaining of operations + + ------------------------------------------------------------ + -- Check received item with item in the scoreboard/FIFO + + -- Simple Scoreboard, no tag + procedure Check (ActualData : ActualType) ; + + -- Simple Tagged Scoreboard + procedure Check ( + constant Tag : in string ; + constant ActualData : in ActualType + ) ; + + -- Array of Scoreboards, no tag + procedure Check ( + constant Index : in integer ; + constant ActualData : in ActualType + ) ; + + -- Array of Tagged Scoreboards + procedure Check ( + constant Index : in integer ; + constant Tag : in string ; + constant ActualData : in ActualType + ) ; + + ------------------------------------------------------------ + -- Pop the top item (FIFO) from the scoreboard/FIFO + + -- Simple Scoreboard, no tag + procedure Pop (variable Item : out ExpectedType) ; + + -- Simple Tagged Scoreboard + procedure Pop ( + constant Tag : in string ; + variable Item : out ExpectedType + ) ; + + -- Array of Scoreboards, no tag + procedure Pop ( + constant Index : in integer ; + variable Item : out ExpectedType + ) ; + + -- Array of Tagged Scoreboards + procedure Pop ( + constant Index : in integer ; + constant Tag : in string ; + variable Item : out ExpectedType + ) ; + + ------------------------------------------------------------ + -- Pop the top item (FIFO) from the scoreboard/FIFO + -- Function form supports chaining of operations + -- In 2013, this caused overloading issues in some simulators, will retest later + + -- Simple Scoreboard, no tag + impure function Pop return ExpectedType ; + + -- Simple Tagged Scoreboard + impure function Pop ( + constant Tag : in string + ) return ExpectedType ; + + -- Array of Scoreboards, no tag + impure function Pop (Index : integer) return ExpectedType ; + + -- Array of Tagged Scoreboards + impure function Pop ( + constant Index : in integer ; + constant Tag : in string + ) return ExpectedType ; + + ------------------------------------------------------------ + -- Empty - check to see if scoreboard is empty + impure function Empty return boolean ; -- Simple + impure function Empty (Tag : String) return boolean ; -- Simple, Tagged + impure function Empty (Index : integer) return boolean ; -- Array + impure function Empty (Index : integer; Tag : String) return boolean ; -- Array, Tagged + + ------------------------------------------------------------ + -- SetAlertLogID - associate an AlertLogID with a scoreboard to allow integrated error reporting + procedure SetAlertLogID(Index : Integer ; Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) ; + procedure SetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) ; + -- Use when an AlertLogID is used by multiple items (Model or other Scoreboards). See also AlertLogPkg.GetAlertLogID + procedure SetAlertLogID (Index : Integer ; A : AlertLogIDType) ; + procedure SetAlertLogID (A : AlertLogIDType) ; + impure function GetAlertLogID(Index : Integer) return AlertLogIDType ; + impure function GetAlertLogID return AlertLogIDType ; + + ------------------------------------------------------------ + -- Set a scoreboard name. + -- Used when scoreboard AlertLogID is shared between different sources. + procedure SetName (Name : String) ; + impure function SetName (Name : String) return string ; + impure function GetName (DefaultName : string := "Scoreboard") return string ; + + + ------------------------------------------------------------ + -- Scoreboard Introspection + + -- Number of items put into scoreboard + impure function GetItemCount return integer ; -- Simple, with or without tags + impure function GetItemCount (Index : integer) return integer ; -- Arrays, with or without tags + + -- Number of items checked by scoreboard + impure function GetCheckCount return integer ; -- Simple, with or without tags + impure function GetCheckCount (Index : integer) return integer ; -- Arrays, with or without tags + + -- Number of items dropped by scoreboard. See Find/Flush + impure function GetDropCount return integer ; -- Simple, with or without tags + impure function GetDropCount (Index : integer) return integer ; -- Arrays, with or without tags + + ------------------------------------------------------------ + -- Find - Returns the ItemNumber for a value and tag (if applicable) in a scoreboard. + -- Find returns integer'left if no match found + -- Also See Flush. Flush will drop items up through the ItemNumber + + -- Simple Scoreboard + impure function Find ( + constant ActualData : in ActualType + ) return integer ; + + -- Tagged Scoreboard + impure function Find ( + constant Tag : in string; + constant ActualData : in ActualType + ) return integer ; + + -- Array of Simple Scoreboards + impure function Find ( + constant Index : in integer ; + constant ActualData : in ActualType + ) return integer ; + + -- Array of Tagged Scoreboards + impure function Find ( + constant Index : in integer ; + constant Tag : in string; + constant ActualData : in ActualType + ) return integer ; + + ------------------------------------------------------------ + -- Flush - Remove elements in the scoreboard upto and including the one with ItemNumber + -- See Find to identify an ItemNumber of a particular value and tag (if applicable) + + -- Simple Scoreboard + procedure Flush ( + constant ItemNumber : in integer + ) ; + + -- Tagged Scoreboard - only removes items that also match the tag + procedure Flush ( + constant Tag : in string ; + constant ItemNumber : in integer + ) ; + + -- Array of Simple Scoreboards + procedure Flush ( + constant Index : in integer ; + constant ItemNumber : in integer + ) ; + + -- Array of Tagged Scoreboards - only removes items that also match the tag + procedure Flush ( + constant Index : in integer ; + constant Tag : in string ; + constant ItemNumber : in integer + ) ; + + ------------------------------------------------------------ + -- Generally these are not required. When a simulation ends and + -- another simulation is started, a simulator will release all allocated items. + procedure Deallocate ; -- Deletes all allocated items + procedure Initialize ; -- Creates initial data structure if it was destroyed with Deallocate + + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- Deprecated. Use alerts directly instead. + -- AlertIF(SB.GetCheckCount < 10, ....) ; + -- AlertIf(Not SB.Empty, ...) ; + ------------------------------------------------------------ + -- Set alerts if scoreboard not empty or if CheckCount < + -- Use if need to check empty or CheckCount for a specific scoreboard. + + -- Simple Scoreboards, with or without tag + procedure CheckFinish ( + FinishCheckCount : integer ; + FinishEmpty : boolean + ) ; + + -- Array of Scoreboards, with or without tag + procedure CheckFinish ( + Index : integer ; + FinishCheckCount : integer ; + FinishEmpty : boolean + ) ; + + ------------------------------------------------------------ + -- Get error count + -- Deprecated, replaced by usage of Alerts + -- AlertFLow: Instead use AlertLogPkg.ReportAlerts or AlertLogPkg.GetAlertCount + -- Not AlertFlow: use GetErrorCount to get total error count + + -- Simple Scoreboards, with or without tag + impure function GetErrorCount return integer ; + + -- Array of Scoreboards, with or without tag + impure function GetErrorCount(Index : integer) return integer ; + + ------------------------------------------------------------ + -- Error count manipulation + + -- IncErrorCount - not recommended, use alerts instead - may be deprecated in the future + procedure IncErrorCount ; -- Simple, with or without tags + procedure IncErrorCount (Index : integer) ; -- Arrays, with or without tags + + -- Clear error counter. Caution does not change AlertCounts, must also use AlertLogPkg.ClearAlerts + procedure SetErrorCountZero ; -- Simple, with or without tags + procedure SetErrorCountZero (Index : integer) ; -- Arrays, with or without tags + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- Deprecated. Names changed. Maintained for backward compatibility - would prefer an alias + ------------------------------------------------------------ + procedure FileOpen (FileName : string; OpenKind : File_Open_Kind ) ; -- Replaced by TranscriptPkg.TranscriptOpen + procedure PutExpectedData (ExpectedData : ExpectedType) ; -- Replaced by push + procedure CheckActualData (ActualData : ActualType) ; -- Replaced by Check + impure function GetItemNumber return integer ; -- Replaced by GetItemCount + procedure SetMessage (MessageIn : String) ; -- Replaced by SetName + impure function GetMessage return string ; -- Replaced by GetName + + -- Deprecated and may be deleted in a future revision + procedure SetFinish ( -- Replaced by CheckFinish + Index : integer ; + FCheckCount : integer ; + FEmpty : boolean := TRUE; + FStatus : boolean := TRUE + ) ; + + procedure SetFinish ( -- Replaced by CheckFinish + FCheckCount : integer ; + FEmpty : boolean := TRUE; + FStatus : boolean := TRUE + ) ; + + ------------------------------------------------------------ + -- SetReportMode + -- Not AlertFlow + -- REPORT_ALL: Replaced by AlertLogPkg.SetLogEnable(PASSED, TRUE) + -- REPORT_ERROR: Replaced by AlertLogPkg.SetLogEnable(PASSED, FALSE) + -- REPORT_NONE: Deprecated, do not use. + -- AlertFlow: + -- REPORT_ALL: Replaced by AlertLogPkg.SetLogEnable(AlertLogID, PASSED, TRUE) + -- REPORT_ERROR: Replaced by AlertLogPkg.SetLogEnable(AlertLogID, PASSED, FALSE) + -- REPORT_NONE: Replaced by AlertLogPkg.SetAlertEnable(AlertLogID, ERROR, FALSE) + procedure SetReportMode (ReportModeIn : ScoreboardReportType) ; + impure function GetReportMode return ScoreboardReportType ; + + + end protected ScoreBoardPType ; + +end ScoreboardGenericPkg ; + + +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +package body ScoreboardGenericPkg is + + type ScoreBoardPType is protected body + type ExpectedPointerType is access ExpectedType ; + + type ListType ; + type ListPointerType is access ListType ; + type ListType is record + ItemNumber : integer ; + TagPtr : line ; + ExpectedPtr : ExpectedPointerType ; + NextPtr : ListPointerType ; + end record ; + type ListArrayType is array (integer range <>) of ListPointerType ; + type ListArrayPointerType is access ListArrayType ; + + variable ArrayLengthVar : integer := 1 ; + variable HeadPointer : ListArrayPointerType := new ListArrayType(1 to 1) ; + variable TailPointer : ListArrayPointerType := new ListArrayType(1 to 1) ; + variable PopListPointer : ListArrayPointerType := new ListArrayType(1 to 1) ; + + type IntegerArrayType is array (integer range <>) of Integer ; + type IntegerArrayPointerType is access IntegerArrayType ; + type AlertLogIDArrayType is array (integer range <>) of AlertLogIDType ; + type AlertLogIDArrayPointerType is access AlertLogIDArrayType ; + + + variable ErrCntVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; + variable DropCountVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; + variable ItemNumberVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; + variable CheckCountVar : IntegerArrayPointerType := new IntegerArrayType'(1 => 0) ; + variable AlertLogIDVar : AlertLogIDArrayPointerType := new AlertLogIDArrayType'(1 => OSVVM_SCOREBOARD_ALERTLOG_ID) ; + + variable NameVar : NamePType ; + variable ReportModeVar : ScoreboardReportType ; + variable FirstIndexVar : integer := 1 ; + + + ------------------------------------------------------------ + procedure SetName (Name : String) is + ------------------------------------------------------------ + begin + NameVar.Set(Name) ; + end procedure SetName ; + + ------------------------------------------------------------ + impure function SetName (Name : String) return string is + ------------------------------------------------------------ + begin + NameVar.Set(Name) ; + return Name ; + end function SetName ; + + ------------------------------------------------------------ + impure function GetName (DefaultName : string := "Scoreboard") return string is + ------------------------------------------------------------ + begin + return NameVar.Get(DefaultName) ; + end function GetName ; + + ------------------------------------------------------------ + procedure SetReportMode (ReportModeIn : ScoreboardReportType) is + ------------------------------------------------------------ + begin + ReportModeVar := ReportModeIn ; + if ReportModeVar = REPORT_ALL then + Alert(OSVVM_SCOREBOARD_ALERTLOG_ID, "ScoreboardGenericPkg.SetReportMode: To turn off REPORT_ALL, use osvvm.AlertLogPkg.SetLogEnable(PASSED, FALSE)", WARNING) ; + for i in AlertLogIDVar'range loop + SetLogEnable(AlertLogIDVar(i), PASSED, TRUE) ; + end loop ; + end if ; + if ReportModeVar = REPORT_NONE then + Alert(OSVVM_SCOREBOARD_ALERTLOG_ID, "ScoreboardGenericPkg.SetReportMode: ReportMode REPORT_NONE has been deprecated and will be removed in next revision. Please contact OSVVM architect Jim Lewis if you need this capability.", WARNING) ; + end if ; + end procedure SetReportMode ; + + ------------------------------------------------------------ + impure function GetReportMode return ScoreboardReportType is + ------------------------------------------------------------ + begin + return ReportModeVar ; + end function GetReportMode ; + + ------------------------------------------------------------ + procedure SetArrayIndex(L, R : integer) is + ------------------------------------------------------------ + variable OldHeadPointer, OldTailPointer, OldPopListPointer : ListArrayPointerType ; + variable OldErrCnt, OldDropCount, OldItemNumber, OldCheckCount : IntegerArrayPointerType ; + variable OldAlertLogIDVar : AlertLogIDArrayPointerType ; + variable Min, Max, Len, OldLen, OldMax : integer ; + begin + Min := minimum(L, R) ; + Max := maximum(L, R) ; + OldLen := ArrayLengthVar ; + OldMax := Min + ArrayLengthVar - 1 ; + Len := Max - Min + 1 ; + ArrayLengthVar := Len ; + if Len >= OldLen then + FirstIndexVar := Min ; + + OldHeadPointer := HeadPointer ; + HeadPointer := new ListArrayType(Min to Max) ; + if OldHeadPointer /= NULL then + HeadPointer(Min to OldMax) := OldHeadPointer.all ; -- (OldHeadPointer'range) ; + Deallocate(OldHeadPointer) ; + end if ; + + OldTailPointer := TailPointer ; + TailPointer := new ListArrayType(Min to Max) ; + if OldTailPointer /= NULL then + TailPointer(Min to OldMax) := OldTailPointer.all ; + Deallocate(OldTailPointer) ; + end if ; + + OldPopListPointer := PopListPointer ; + PopListPointer := new ListArrayType(Min to Max) ; + if OldPopListPointer /= NULL then + PopListPointer(Min to OldMax) := OldPopListPointer.all ; + Deallocate(OldPopListPointer) ; + end if ; + + OldErrCnt := ErrCntVar ; + ErrCntVar := new IntegerArrayType'(Min to Max => 0) ; + if OldErrCnt /= NULL then + ErrCntVar(Min to OldMax) := OldErrCnt.all ; + Deallocate(OldErrCnt) ; + end if ; + + OldDropCount := DropCountVar ; + DropCountVar := new IntegerArrayType'(Min to Max => 0) ; + if OldDropCount /= NULL then + DropCountVar(Min to OldMax) := OldDropCount.all ; + Deallocate(OldDropCount) ; + end if ; + + OldItemNumber := ItemNumberVar ; + ItemNumberVar := new IntegerArrayType'(Min to Max => 0) ; + if OldItemNumber /= NULL then + ItemNumberVar(Min to OldMax) := OldItemNumber.all ; + Deallocate(OldItemNumber) ; + end if ; + + OldCheckCount := CheckCountVar ; + CheckCountVar := new IntegerArrayType'(Min to Max => 0) ; + if OldCheckCount /= NULL then + CheckCountVar(Min to OldMax) := OldCheckCount.all ; + Deallocate(OldCheckCount) ; + end if ; + + OldAlertLogIDVar := AlertLogIDVar ; + AlertLogIDVar := new AlertLogIDArrayType'(Min to Max => OSVVM_SCOREBOARD_ALERTLOG_ID) ; + if OldAlertLogIDVar /= NULL then + AlertLogIDVar(Min to OldMax) := OldAlertLogIDVar.all ; + Deallocate(OldAlertLogIDVar) ; + end if ; + + elsif Len < OldLen then + report "ScoreboardGenericPkg: SetArrayIndex, new array Length <= current array length" + severity failure ; + + end if ; + end procedure SetArrayIndex ; + + ------------------------------------------------------------ + procedure SetArrayIndex(R : natural) is + ------------------------------------------------------------ + begin + SetArrayIndex(1, R) ; + end procedure SetArrayIndex ; + + ------------------------------------------------------------ + procedure Deallocate is + ------------------------------------------------------------ + variable CurListPtr, LastListPtr : ListPointerType ; + begin + for Index in HeadPointer'range loop + -- Deallocate contents in the scoreboards + CurListPtr := HeadPointer(Index) ; + while CurListPtr /= Null loop + deallocate(CurListPtr.TagPtr) ; + deallocate(CurListPtr.ExpectedPtr) ; + LastListPtr := CurListPtr ; + CurListPtr := CurListPtr.NextPtr ; + Deallocate(LastListPtr) ; + end loop ; + end loop ; + + for Index in PopListPointer'range loop + -- Deallocate PopListPointer - only has single element + CurListPtr := PopListPointer(Index) ; + if CurListPtr /= NULL then + deallocate(CurListPtr.TagPtr) ; + deallocate(CurListPtr.ExpectedPtr) ; + deallocate(CurListPtr) ; + end if ; + end loop ; + + -- Deallocate arrays of pointers + Deallocate(HeadPointer) ; + Deallocate(TailPointer) ; + Deallocate(PopListPointer) ; + + -- Deallocate supporting arrays + Deallocate(ErrCntVar) ; + Deallocate(DropCountVar) ; + Deallocate(ItemNumberVar) ; + Deallocate(CheckCountVar) ; + Deallocate(AlertLogIDVar) ; + + -- Deallocate NameVar - NamePType + NameVar.Deallocate ; + + ArrayLengthVar := 0 ; + end procedure Deallocate ; + + ------------------------------------------------------------ + -- Construct initial data structure + procedure Initialize is + ------------------------------------------------------------ + begin + SetArrayIndex(1, 1) ; + end procedure Initialize ; + + ------------------------------------------------------------ + impure function GetArrayIndex return integer_vector is + ------------------------------------------------------------ + begin + return (1 => HeadPointer'left, 2 => HeadPointer'right) ; + end function GetArrayIndex ; + + ------------------------------------------------------------ + impure function GetArrayLength return natural is + ------------------------------------------------------------ + begin + return ArrayLengthVar ; -- HeadPointer'length ; + end function GetArrayLength ; + + ------------------------------------------------------------ + procedure SetAlertLogID (Index : Integer ; A : AlertLogIDType) is + ------------------------------------------------------------ + begin + AlertLogIDVar(Index) := A ; + end procedure SetAlertLogID ; + + ------------------------------------------------------------ + procedure SetAlertLogID (A : AlertLogIDType) is + ------------------------------------------------------------ + begin + AlertLogIDVar(FirstIndexVar) := A ; + end procedure SetAlertLogID ; + + ------------------------------------------------------------ + procedure SetAlertLogID(Index : Integer ; Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogIDVar(Index) := GetAlertLogID(Name, ParentID, CreateHierarchy) ; + end procedure SetAlertLogID ; + + ------------------------------------------------------------ + procedure SetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogIDVar(FirstIndexVar) := GetAlertLogID(Name, ParentID, CreateHierarchy) ; + end procedure SetAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogID(Index : Integer) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogIDVar(Index) ; + end function GetAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogID return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogIDVar(FirstIndexVar) ; + end function GetAlertLogID ; + + ------------------------------------------------------------ + impure function LocalOutOfRange( + ------------------------------------------------------------ + constant Index : in integer ; + constant Name : in string + ) return boolean is + begin + return AlertIf(OSVVM_SCOREBOARD_ALERTLOG_ID, Index < HeadPointer'Low or Index > HeadPointer'High, + GetName & " " & Name & " Index: " & to_string(Index) & + "is not in the range (" & to_string(HeadPointer'Low) & + "to " & to_string(HeadPointer'High) & ")", + FAILURE ) ; + end function LocalOutOfRange ; + + ------------------------------------------------------------ + procedure LocalPush ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Tag : in string ; + constant Item : in ExpectedType + ) is + variable ExpectedPtr : ExpectedPointerType ; + variable TagPtr : line ; + begin + if LocalOutOfRange(Index, "Push") then + return ; -- error reporting in LocalOutOfRange + end if ; + + ItemNumberVar(Index) := ItemNumberVar(Index) + 1 ; + ExpectedPtr := new ExpectedType'(Item) ; + TagPtr := new string'(Tag) ; + + if HeadPointer(Index) = NULL then + -- 2015.05: allocation using ListTtype'(...) in a protected type does not work in some simulators + -- HeadPointer(Index) := new ListType'(ItemNumberVar(Index), TagPtr, ExpectedPtr, NULL) ; + HeadPointer(Index) := new ListType ; + HeadPointer(Index).ItemNumber := ItemNumberVar(Index) ; + HeadPointer(Index).TagPtr := TagPtr ; + HeadPointer(Index).ExpectedPtr := ExpectedPtr ; + HeadPointer(Index).NextPtr := NULL ; + TailPointer(Index) := HeadPointer(Index) ; + else + -- 2015.05: allocation using ListTtype'(...) in a protected type does not work in some simulators + -- TailPointer(Index).NextPtr := new ListType'(ItemNumberVar(Index), TagPtr, ExpectedPtr, NULL) ; + TailPointer(Index).NextPtr := new ListType ; + TailPointer(Index).NextPtr.ItemNumber := ItemNumberVar(Index) ; + TailPointer(Index).NextPtr.TagPtr := TagPtr ; + TailPointer(Index).NextPtr.ExpectedPtr := ExpectedPtr ; + TailPointer(Index).NextPtr.NextPtr := NULL ; + TailPointer(Index) := TailPointer(Index).NextPtr ; + end if ; + end procedure LocalPush ; + + ------------------------------------------------------------ + -- Array of Tagged Scoreboards + procedure Push ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Tag : in string ; + constant Item : in ExpectedType + ) is + variable ExpectedPtr : ExpectedPointerType ; + variable TagPtr : line ; + begin + if LocalOutOfRange(Index, "Push") then + return ; -- error reporting in LocalOutOfRange + end if ; + LocalPush(Index, Tag, Item) ; + end procedure Push ; + + ------------------------------------------------------------ + -- Array of Scoreboards, no tag + procedure Push ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Item : in ExpectedType + ) is + begin + if LocalOutOfRange(Index, "Push") then + return ; -- error reporting in LocalOutOfRange + end if ; + LocalPush(Index, "", Item) ; + end procedure Push ; + + ------------------------------------------------------------ + -- Simple Tagged Scoreboard + procedure Push ( + ------------------------------------------------------------ + constant Tag : in string ; + constant Item : in ExpectedType + ) is + begin + LocalPush(FirstIndexVar, Tag, Item) ; + end procedure Push ; + + ------------------------------------------------------------ + -- Simple Scoreboard, no tag + procedure Push (Item : in ExpectedType) is + ------------------------------------------------------------ + begin + LocalPush(FirstIndexVar, "", Item) ; + end procedure Push ; + + ------------------------------------------------------------ + -- Array of Tagged Scoreboards + impure function Push ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Tag : in string ; + constant Item : in ExpectedType + ) return ExpectedType is + begin + if LocalOutOfRange(Index, "Push") then + return Item ; -- error reporting in LocalOutOfRange + end if ; + LocalPush(Index, Tag, Item) ; + return Item ; + end function Push ; + + ------------------------------------------------------------ + -- Array of Scoreboards, no tag + impure function Push ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Item : in ExpectedType + ) return ExpectedType is + begin + if LocalOutOfRange(Index, "Push") then + return Item ; -- error reporting in LocalOutOfRange + end if ; + LocalPush(Index, "", Item) ; + return Item ; + end function Push ; + + ------------------------------------------------------------ + -- Simple Tagged Scoreboard + impure function Push ( + ------------------------------------------------------------ + constant Tag : in string ; + constant Item : in ExpectedType + ) return ExpectedType is + begin + LocalPush(FirstIndexVar, Tag, Item) ; + return Item ; + end function Push ; + + ------------------------------------------------------------ + -- Simple Scoreboard, no tag + impure function Push (Item : ExpectedType) return ExpectedType is + ------------------------------------------------------------ + begin + LocalPush(FirstIndexVar, "", Item) ; + return Item ; + end function Push ; + + ------------------------------------------------------------ + -- Local Only + -- Pops highest element matching Tag into PopListPointer(Index) + procedure LocalPop (Index : integer ; Tag : string; Name : string) is + ------------------------------------------------------------ + variable CurPtr : ListPointerType ; + begin + if LocalOutOfRange(Index, "Pop/Check") then + return ; -- error reporting in LocalOutOfRange + end if ; + if HeadPointer(Index) = NULL then + ErrCntVar(Index) := ErrCntVar(Index) + 1 ; + Alert(AlertLogIDVar(Index), GetName & " Empty during " & Name, FAILURE) ; + return ; + end if ; + -- deallocate previous pointer + if PopListPointer(Index) /= NULL then + deallocate(PopListPointer(Index).TagPtr) ; + deallocate(PopListPointer(Index).ExpectedPtr) ; + deallocate(PopListPointer(Index)) ; + end if ; + -- Descend to find Tag field and extract + CurPtr := HeadPointer(Index) ; + if CurPtr.TagPtr.all = Tag then + -- Non-tagged scoreboards find this one. + PopListPointer(Index) := HeadPointer(Index) ; + HeadPointer(Index) := HeadPointer(Index).NextPtr ; + else + loop + if CurPtr.NextPtr = NULL then + ErrCntVar(Index) := ErrCntVar(Index) + 1 ; + Alert(AlertLogIDVar(Index), GetName & " Pop/Check (" & Name & "), tag: " & Tag & " not found", FAILURE) ; + exit ; + elsif CurPtr.NextPtr.TagPtr.all = Tag then + PopListPointer(Index) := CurPtr.NextPtr ; + CurPtr.NextPtr := CurPtr.NextPtr.NextPtr ; + if CurPtr.NextPtr = NULL then + TailPointer(Index) := CurPtr ; + end if ; + exit ; + else + CurPtr := CurPtr.NextPtr ; + end if ; + end loop ; + end if ; + end procedure LocalPop ; + + ------------------------------------------------------------ + -- Local Only + procedure LocalCheck ( + ------------------------------------------------------------ + constant Index : in integer ; + constant ActualData : in ActualType + ) is + variable ExpectedPtr : ExpectedPointerType ; + variable CurrentItem : integer ; + variable WriteBuf : line ; + variable FoundError : boolean ; + begin + CheckCountVar(Index) := CheckCountVar(Index) + 1 ; + ExpectedPtr := PopListPointer(Index).ExpectedPtr ; + CurrentItem := PopListPointer(Index).ItemNumber ; + + if not Match(ActualData, ExpectedPtr.all) then + ErrCntVar(Index) := ErrCntVar(Index) + 1 ; + FoundError := TRUE ; + else + FoundError := FALSE ; + end if ; + + IncAffirmCount ; + +-- if FoundError or ReportModeVar = REPORT_ALL then + if FoundError or GetLogEnable(AlertLogIDVar(Index), PASSED) then + if AlertLogIDVar(Index) = OSVVM_SCOREBOARD_ALERTLOG_ID then + write(WriteBuf, GetName(DefaultName => "Scoreboard")) ; + else + write(WriteBuf, GetName(DefaultName => "")) ; + end if ; + if ArrayLengthVar > 1 then + write(WriteBuf, " (" & to_string(Index) & ") ") ; + end if ; + write(WriteBuf, " Received: " & actual_to_string(ActualData)) ; + if FoundError then + write(WriteBuf, " Expected: " & expected_to_string(ExpectedPtr.all)) ; + end if ; + if PopListPointer(Index).TagPtr.all /= "" then + write(WriteBuf, " Tag: " & PopListPointer(Index).TagPtr.all) ; + end if; + write(WriteBuf, " Item Number: " & to_string(CurrentItem)) ; + if FoundError then + if ReportModeVar /= REPORT_NONE then + -- Affirmation Failed + Alert(AlertLogIDVar(Index), WriteBuf.all, ERROR) ; + else + -- Affirmation Failed, but silent, unless in DEBUG mode + Log(AlertLogIDVar(Index), "ERROR " & WriteBuf.all, DEBUG) ; + IncAlertCount(AlertLogIDVar(Index)) ; -- Silent Counted Alert + end if ; + else + -- Affirmation passed + Log(AlertLogIDVar(Index), WriteBuf.all, PASSED) ; + end if ; + deallocate(WriteBuf) ; + end if ; + end procedure LocalCheck ; + + ------------------------------------------------------------ + -- Array of Tagged Scoreboards + procedure Check ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Tag : in string ; + constant ActualData : in ActualType + ) is + begin + if LocalOutOfRange(Index, "Check") then + return ; -- error reporting in LocalOutOfRange + end if ; + LocalPop(Index, Tag, "Check") ; + LocalCheck(Index, ActualData) ; + end procedure Check ; + + ------------------------------------------------------------ + -- Array of Scoreboards, no tag + procedure Check ( + ------------------------------------------------------------ + constant Index : in integer ; + constant ActualData : in ActualType + ) is + begin + if LocalOutOfRange(Index, "Check") then + return ; -- error reporting in LocalOutOfRange + end if ; + LocalPop(Index, "", "Check") ; + LocalCheck(Index, ActualData) ; + end procedure Check ; + + ------------------------------------------------------------ + -- Simple Tagged Scoreboard + procedure Check ( + ------------------------------------------------------------ + constant Tag : in string ; + constant ActualData : in ActualType + ) is + begin + LocalPop(FirstIndexVar, Tag, "Check") ; + LocalCheck(FirstIndexVar, ActualData) ; + end procedure Check ; + + ------------------------------------------------------------ + -- Simple Scoreboard, no tag + procedure Check (ActualData : ActualType) is + ------------------------------------------------------------ + begin + LocalPop(FirstIndexVar, "", "Check") ; + LocalCheck(FirstIndexVar, ActualData) ; + end procedure Check ; + + ------------------------------------------------------------ + -- Array of Tagged Scoreboards + procedure Pop ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Tag : in string ; + variable Item : out ExpectedType + ) is + begin + if LocalOutOfRange(Index, "Pop") then + return ; -- error reporting in LocalOutOfRange + end if ; + LocalPop(Index, Tag, "Pop") ; + Item := PopListPointer(Index).ExpectedPtr.all ; + end procedure Pop ; + + ------------------------------------------------------------ + -- Array of Scoreboards, no tag + procedure Pop ( + ------------------------------------------------------------ + constant Index : in integer ; + variable Item : out ExpectedType + ) is + begin + if LocalOutOfRange(Index, "Pop") then + return ; -- error reporting in LocalOutOfRange + end if ; + LocalPop(Index, "", "Pop") ; + Item := PopListPointer(Index).ExpectedPtr.all ; + end procedure Pop ; + + ------------------------------------------------------------ + -- Simple Tagged Scoreboard + procedure Pop ( + ------------------------------------------------------------ + constant Tag : in string ; + variable Item : out ExpectedType + ) is + begin + LocalPop(FirstIndexVar, Tag, "Pop") ; + Item := PopListPointer(FirstIndexVar).ExpectedPtr.all ; + end procedure Pop ; + + ------------------------------------------------------------ + -- Simple Scoreboard, no tag + procedure Pop (variable Item : out ExpectedType) is + ------------------------------------------------------------ + begin + LocalPop(FirstIndexVar, "", "Pop") ; + Item := PopListPointer(FirstIndexVar).ExpectedPtr.all ; + end procedure Pop ; + + ------------------------------------------------------------ + -- Array of Tagged Scoreboards + impure function Pop ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Tag : in string + ) return ExpectedType is + begin + if LocalOutOfRange(Index, "Pop") then + -- error reporting in LocalOutOfRange + return PopListPointer(FirstIndexVar).ExpectedPtr.all ; + end if ; + LocalPop(Index, Tag, "Pop") ; + return PopListPointer(Index).ExpectedPtr.all ; + end function Pop ; + + ------------------------------------------------------------ + -- Array of Scoreboards, no tag + impure function Pop (Index : integer) return ExpectedType is + ------------------------------------------------------------ + begin + if LocalOutOfRange(Index, "Pop") then + -- error reporting in LocalOutOfRange + return PopListPointer(FirstIndexVar).ExpectedPtr.all ; + end if ; + LocalPop(Index, "", "Pop") ; + return PopListPointer(Index).ExpectedPtr.all ; + end function Pop ; + + ------------------------------------------------------------ + -- Simple Tagged Scoreboard + impure function Pop ( + ------------------------------------------------------------ + constant Tag : in string + ) return ExpectedType is + begin + LocalPop(FirstIndexVar, Tag, "Pop") ; + return PopListPointer(FirstIndexVar).ExpectedPtr.all ; + end function Pop ; + + ------------------------------------------------------------ + -- Simple Scoreboard, no tag + impure function Pop return ExpectedType is + ------------------------------------------------------------ + begin + LocalPop(FirstIndexVar, "", "Pop") ; + return PopListPointer(FirstIndexVar).ExpectedPtr.all ; + end function Pop ; + + ------------------------------------------------------------ + -- Array of Tagged Scoreboards + impure function Empty (Index : integer; Tag : String) return boolean is + ------------------------------------------------------------ + variable CurPtr : ListPointerType ; + begin + CurPtr := HeadPointer(Index) ; + while CurPtr /= NULL loop + if CurPtr.TagPtr.all = Tag then + return FALSE ; -- Found Tag + end if ; + CurPtr := CurPtr.NextPtr ; + end loop ; + return TRUE ; -- Tag not found + end function Empty ; + + ------------------------------------------------------------ + -- Array of Scoreboards, no tag + impure function Empty (Index : integer) return boolean is + ------------------------------------------------------------ + begin + return HeadPointer(Index) = NULL ; + end function Empty ; + + ------------------------------------------------------------ + -- Simple Tagged Scoreboard + impure function Empty (Tag : String) return boolean is + ------------------------------------------------------------ + variable CurPtr : ListPointerType ; + begin + return Empty(FirstIndexVar, Tag) ; + end function Empty ; + + ------------------------------------------------------------ + -- Simple Scoreboard, no tag + impure function Empty return boolean is + ------------------------------------------------------------ + begin + return HeadPointer(FirstIndexVar) = NULL ; + end function Empty ; + + ------------------------------------------------------------ + procedure CheckFinish ( + ------------------------------------------------------------ + Index : integer ; + FinishCheckCount : integer ; + FinishEmpty : boolean + ) is + variable EmptyError : Boolean ; + variable WriteBuf : line ; + begin + if AlertLogIDVar(Index) = OSVVM_SCOREBOARD_ALERTLOG_ID then + write(WriteBuf, GetName(DefaultName => "Scoreboard")) ; + else + write(WriteBuf, GetName(DefaultName => "")) ; + end if ; + if ArrayLengthVar > 1 then + if WriteBuf.all /= "" then + swrite(WriteBuf, " ") ; + end if ; + write(WriteBuf, "Index(" & to_string(Index) & "), ") ; + else + if WriteBuf.all /= "" then + swrite(WriteBuf, ", ") ; + end if ; + end if ; + if FinishEmpty then + AffirmIf(AlertLogIDVar(Index), Empty(Index), WriteBuf.all & "Checking Empty: " & to_string(Empty(Index)) & + " FinishEmpty: " & to_string(FinishEmpty)) ; + if not Empty(Index) then + -- Increment internal count on FinishEmpty Error + ErrCntVar(Index) := ErrCntVar(Index) + 1 ; + end if ; + end if ; + AffirmIf(AlertLogIDVar(Index), CheckCountVar(Index) >= FinishCheckCount, WriteBuf.all & + "Checking CheckCount: " & to_string(CheckCountVar(Index)) & + " >= Expected: " & to_string(FinishCheckCount)) ; + if not (CheckCountVar(Index) >= FinishCheckCount) then + -- Increment internal count on FinishCheckCount Error + ErrCntVar(Index) := ErrCntVar(Index) + 1 ; + end if ; + deallocate(WriteBuf) ; + end procedure CheckFinish ; + + ------------------------------------------------------------ + procedure CheckFinish ( + ------------------------------------------------------------ + FinishCheckCount : integer ; + FinishEmpty : boolean + ) is + begin + for AlertLogID in AlertLogIDVar'range loop + CheckFinish(AlertLogID, FinishCheckCount, FinishEmpty) ; + end loop ; + end procedure CheckFinish ; + + ------------------------------------------------------------ + impure function GetErrorCount (Index : integer) return integer is + ------------------------------------------------------------ + begin + return ErrCntVar(Index) ; + end function GetErrorCount ; + + ------------------------------------------------------------ + impure function GetErrorCount return integer is + ------------------------------------------------------------ + variable TotalErrorCount : integer := 0 ; + begin + for Index in AlertLogIDVar'range loop + TotalErrorCount := TotalErrorCount + GetErrorCount(Index) ; + end loop ; + return TotalErrorCount ; + end function GetErrorCount ; + + ------------------------------------------------------------ + procedure IncErrorCount (Index : integer) is + ------------------------------------------------------------ + begin + ErrCntVar(Index) := ErrCntVar(Index) + 1 ; + IncAlertCount(AlertLogIDVar(Index), ERROR) ; + end IncErrorCount ; + + ------------------------------------------------------------ + procedure IncErrorCount is + ------------------------------------------------------------ + begin + ErrCntVar(FirstIndexVar) := ErrCntVar(FirstIndexVar) + 1 ; + IncAlertCount(AlertLogIDVar(FirstIndexVar), ERROR) ; + end IncErrorCount ; + + ------------------------------------------------------------ + procedure SetErrorCountZero (Index : integer) is + ------------------------------------------------------------ + begin + ErrCntVar(Index) := 0; + end procedure SetErrorCountZero ; + + ------------------------------------------------------------ + procedure SetErrorCountZero is + ------------------------------------------------------------ + begin + ErrCntVar(FirstIndexVar) := 0 ; + end procedure SetErrorCountZero ; + + ------------------------------------------------------------ + impure function GetItemCount (Index : integer) return integer is + ------------------------------------------------------------ + begin + return ItemNumberVar(Index) ; + end function GetItemCount ; + + ------------------------------------------------------------ + impure function GetItemCount return integer is + ------------------------------------------------------------ + begin + return ItemNumberVar(FirstIndexVar) ; + end function GetItemCount ; + + ------------------------------------------------------------ + impure function GetCheckCount (Index : integer) return integer is + ------------------------------------------------------------ + begin + return CheckCountVar(Index) ; + end function GetCheckCount ; + + ------------------------------------------------------------ + impure function GetCheckCount return integer is + ------------------------------------------------------------ + begin + return CheckCountVar(FirstIndexVar) ; + end function GetCheckCount ; + + ------------------------------------------------------------ + impure function GetDropCount (Index : integer) return integer is + ------------------------------------------------------------ + begin + return DropCountVar(Index) ; + end function GetDropCount ; + + ------------------------------------------------------------ + impure function GetDropCount return integer is + ------------------------------------------------------------ + begin + return DropCountVar(FirstIndexVar) ; + end function GetDropCount ; + + ------------------------------------------------------------ + procedure SetFinish ( + ------------------------------------------------------------ + Index : integer ; + FCheckCount : integer ; + FEmpty : boolean := TRUE; + FStatus : boolean := TRUE + ) is + begin + Alert(AlertLogIDVar(Index), "OSVVM.ScoreboardGenericPkg.SetFinish: Deprecated and removed. See CheckFinish", ERROR) ; + end procedure SetFinish ; + + ------------------------------------------------------------ + procedure SetFinish ( + ------------------------------------------------------------ + FCheckCount : integer ; + FEmpty : boolean := TRUE; + FStatus : boolean := TRUE + ) is + begin + SetFinish(FirstIndexVar, FCheckCount, FEmpty, FStatus) ; + end procedure SetFinish ; + + ------------------------------------------------------------ + -- Array of Tagged Scoreboards + -- Find Element with Matching Tag and ActualData + -- Returns integer'left if no match found + impure function Find ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Tag : in string; + constant ActualData : in ActualType + ) return integer is + variable CurPtr : ListPointerType ; + begin + if LocalOutOfRange(Index, "Find") then + return integer'left ; -- error reporting in LocalOutOfRange + end if ; + CurPtr := HeadPointer(Index) ; + loop + if CurPtr = NULL then + -- Failed to find it + ErrCntVar(Index) := ErrCntVar(Index) + 1 ; + if Tag /= "" then + Alert(AlertLogIDVar(Index), + GetName & " Did not find Tag: " & Tag & " and Actual Data: " & actual_to_string(ActualData), + FAILURE ) ; + else + Alert(AlertLogIDVar(Index), + GetName & " Did not find Actual Data: " & actual_to_string(ActualData), + FAILURE ) ; + end if ; + return integer'left ; + + elsif CurPtr.TagPtr.all = Tag and + Match(ActualData, CurPtr.ExpectedPtr.all) then + -- Found it. Return Index. + return CurPtr.ItemNumber ; + + else -- Descend + CurPtr := CurPtr.NextPtr ; + end if ; + end loop ; + end function Find ; + + ------------------------------------------------------------ + -- Array of Simple Scoreboards + -- Find Element with Matching ActualData + impure function Find ( + ------------------------------------------------------------ + constant Index : in integer ; + constant ActualData : in ActualType + ) return integer is + begin + return Find(Index, "", ActualData) ; + end function Find ; + + ------------------------------------------------------------ + -- Tagged Scoreboard + -- Find Element with Matching ActualData + impure function Find ( + ------------------------------------------------------------ + constant Tag : in string; + constant ActualData : in ActualType + ) return integer is + begin + return Find(FirstIndexVar, Tag, ActualData) ; + end function Find ; + + ------------------------------------------------------------ + -- Simple Scoreboard + -- Find Element with Matching ActualData + impure function Find ( + ------------------------------------------------------------ + constant ActualData : in ActualType + ) return integer is + begin + return Find(FirstIndexVar, "", ActualData) ; + end function Find ; + + ------------------------------------------------------------ + -- Array of Tagged Scoreboards + -- Flush Remove elements with tag whose itemNumber is <= ItemNumber parameter + procedure Flush ( + ------------------------------------------------------------ + constant Index : in integer ; + constant Tag : in string ; + constant ItemNumber : in integer + ) is + variable CurPtr, RemovePtr, LastPtr : ListPointerType ; + begin + if LocalOutOfRange(Index, "Find") then + return ; -- error reporting in LocalOutOfRange + end if ; + CurPtr := HeadPointer(Index) ; + LastPtr := NULL ; + loop + if CurPtr = NULL then + -- Done + return ; + elsif CurPtr.TagPtr.all = Tag then + if ItemNumber >= CurPtr.ItemNumber then + -- remove it + RemovePtr := CurPtr ; + if CurPtr = TailPointer(Index) then + TailPointer(Index) := LastPtr ; + end if ; + if CurPtr = HeadPointer(Index) then + HeadPointer(Index) := CurPtr.NextPtr ; + else -- if LastPtr /= NULL then + LastPtr.NextPtr := LastPtr.NextPtr.NextPtr ; + end if ; + CurPtr := CurPtr.NextPtr ; + -- LastPtr := LastPtr ; -- no change + DropCountVar(Index) := DropCountVar(Index) + 1 ; + deallocate(RemovePtr.TagPtr) ; + deallocate(RemovePtr.ExpectedPtr) ; + deallocate(RemovePtr) ; + else + -- Done + return ; + end if ; + else + -- Descend + LastPtr := CurPtr ; + CurPtr := CurPtr.NextPtr ; + end if ; + end loop ; + end procedure Flush ; + + ------------------------------------------------------------ + -- Tagged Scoreboard + -- Flush Remove elements with tag whose itemNumber is <= ItemNumber parameter + procedure Flush ( + ------------------------------------------------------------ + constant Tag : in string ; + constant ItemNumber : in integer + ) is + begin + Flush(FirstIndexVar, Tag, ItemNumber) ; + end procedure Flush ; + + ------------------------------------------------------------ + -- Array of Simple Scoreboards + -- Flush - Remove Elements upto and including the one with ItemNumber + procedure Flush ( + ------------------------------------------------------------ + constant Index : in integer ; + constant ItemNumber : in integer + ) is + variable CurPtr : ListPointerType ; + begin + if LocalOutOfRange(Index, "Find") then + return ; -- error reporting in LocalOutOfRange + end if ; + CurPtr := HeadPointer(Index) ; + loop + if CurPtr = NULL then + -- Done + return ; + elsif ItemNumber >= CurPtr.ItemNumber then + -- Descend, Check Tail, Deallocate + HeadPointer(Index) := HeadPointer(Index).NextPtr ; + if CurPtr = TailPointer(Index) then + TailPointer(Index) := NULL ; + end if ; + DropCountVar(Index) := DropCountVar(Index) + 1 ; + deallocate(CurPtr.TagPtr) ; + deallocate(CurPtr.ExpectedPtr) ; + deallocate(CurPtr) ; + CurPtr := HeadPointer(Index) ; + else + -- Done + return ; + end if ; + end loop ; + end procedure Flush ; + + ------------------------------------------------------------ + -- Simple Scoreboard + -- Flush - Remove Elements upto and including the one with ItemNumber + procedure Flush ( + ------------------------------------------------------------ + constant ItemNumber : in integer + ) is + begin + Flush(FirstIndexVar, ItemNumber) ; + end procedure Flush ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- Remaining Deprecated. + ------------------------------------------------------------ + ------------------------------------------------------------ + + ------------------------------------------------------------ + -- Deprecated. Maintained for backward compatibility. + -- Use TranscriptPkg.TranscriptOpen + procedure FileOpen (FileName : string; OpenKind : File_Open_Kind ) is + ------------------------------------------------------------ + begin + -- WriteFileInit := TRUE ; + -- file_open( WriteFile , FileName , OpenKind ); + TranscriptOpen(FileName, OpenKind) ; + end procedure FileOpen ; + + + ------------------------------------------------------------ + -- Deprecated. Maintained for backward compatibility. + procedure PutExpectedData (ExpectedData : ExpectedType) is + ------------------------------------------------------------ + begin + Push(ExpectedData) ; + end procedure PutExpectedData ; + + ------------------------------------------------------------ + -- Deprecated. Maintained for backward compatibility. + procedure CheckActualData (ActualData : ActualType) is + ------------------------------------------------------------ + begin + Check(ActualData) ; + end procedure CheckActualData ; + + ------------------------------------------------------------ + -- Deprecated. Maintained for backward compatibility. + impure function GetItemNumber return integer is + ------------------------------------------------------------ + begin + return GetItemCount(FirstIndexVar) ; + end GetItemNumber ; + + ------------------------------------------------------------ + -- Deprecated. Maintained for backward compatibility. + procedure SetMessage (MessageIn : String) is + ------------------------------------------------------------ + begin + -- deallocate(Message) ; + -- Message := new string'(MessageIn) ; + SetName(MessageIn) ; + end procedure SetMessage ; + + ------------------------------------------------------------ + -- Deprecated. Maintained for backward compatibility. + impure function GetMessage return string is + ------------------------------------------------------------ + begin + -- return Message.all ; + return GetName("Scoreboard") ; + end function GetMessage ; + + end protected body ScoreBoardPType ; end ScoreboardGenericPkg ; \ No newline at end of file From 0071120e4f6677e898d29c2c85696ce593a3f2de Mon Sep 17 00:00:00 2001 From: JimLewis Date: Thu, 1 Mar 2018 22:43:37 -0800 Subject: [PATCH 5/8] Add Increment and WaitForToggle for integer --- TbUtilPkg.vhd | 1777 ++++++++++++++++++++++++++----------------------- 1 file changed, 926 insertions(+), 851 deletions(-) diff --git a/TbUtilPkg.vhd b/TbUtilPkg.vhd index 083d4da..38dc949 100644 --- a/TbUtilPkg.vhd +++ b/TbUtilPkg.vhd @@ -1,851 +1,926 @@ --- --- File Name: TbUtilPkg.vhd --- Design Unit Name: TbUtilPkg --- Revision: STANDARD VERSION --- --- Maintainer: Jim Lewis email: jim@SynthWorks.com --- Contributor(s): --- Jim Lewis email: jim@SynthWorks.com --- --- Package Defines --- --- Developed for: --- SynthWorks Design Inc. --- VHDL Training Classes --- 11898 SW 128th Ave. Tigard, Or 97223 --- http://www.SynthWorks.com --- --- Revision History: --- Date Version Description --- 11/1999: 0.1 Initial revision --- Numerous revisions for VHDL Testbenches and Verification --- 10/2013 2013.10 Split out Text Utilities --- 11/2016 2016.11 First Public Release Version --- Updated naming for consistency. --- --- --- Copyright (c) 1999 - 2016 by SynthWorks Design Inc. All rights reserved. --- --- Verbatim copies of this source file may be used and --- distributed without restriction. --- --- This source file is free software; you can redistribute it --- and/or modify it under the terms of the ARTISTIC License --- as published by The Perl Foundation; either version 2.0 of --- the License, or (at your option) any later version. --- --- This source is distributed in the hope that it will be --- useful, but WITHOUT ANY WARRANTY; without even the implied --- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --- PURPOSE. See the Artistic License for details. --- --- You should have received a copy of the license with this source. --- If not download it from, --- http://www.perlfoundation.org/artistic_license_2_0 --- -library ieee ; - use ieee.std_logic_1164.all ; - -library osvvm ; - use osvvm.AlertLogPkg.all ; - use osvvm.TranscriptPkg.all ; - -package TbUtilPkg is - - constant CLK_ACTIVE : std_logic := '1' ; - - constant t_sim_resolution : time := std.env.resolution_limit ; -- VHDL-2008 - -- constant t_sim_resolution : time := 1 ns ; -- for non VHDL-2008 simulators - - ------------------------------------------------------------ - -- ZeroOneHot, OneHot - -- OneHot: return true if exactly one value is 1 - -- ZeroOneHot: return false when more than one value is a 1 - ------------------------------------------------------------ - function OneHot ( constant A : in std_logic_vector ) return boolean ; - function ZeroOneHot ( constant A : in std_logic_vector ) return boolean ; - - - ------------------------------------------------------------ - -- RequestTransaction - -- Transaction initiation side of handshaking - -- Pairs with WaitForTransaction or one of its variations - ------------------------------------------------------------ - procedure RequestTransaction ( - signal Rdy : Out std_logic ; - signal Ack : In std_logic - ) ; - - ------------------------------------------------------------ - -- WaitForTransaction - -- Model side of handshaking - -- Pairs with RequestTransaction - ------------------------------------------------------------ - procedure WaitForTransaction ( - signal Clk : In std_logic ; - signal Rdy : In std_logic ; - signal Ack : Out std_logic - ) ; - - -- Variation for model that stops waiting when TimeOut is asserted - -- Intended for models that need to switch between instruction streams - -- such as a CPU when interrupt is pending - procedure WaitForTransaction ( - signal Clk : In std_logic ; - signal Rdy : In std_logic ; - signal Ack : Out std_logic ; - signal TimeOut : In std_logic ; - constant Polarity : In std_logic := '1' - ) ; - - -- Set Ack to Model starting value - procedure StartTransaction ( signal Ack : Out std_logic ) ; - -- Set Ack to Model finishing value - procedure FinishTransaction ( signal Ack : Out std_logic ) ; - -- If a transaction is pending, return true - function TransactionPending ( signal Rdy : In std_logic ) return boolean ; - - -- Variation for clockless models - procedure WaitForTransaction ( - signal Rdy : In std_logic ; - signal Ack : Out std_logic - ) ; - - - ------------------------------------------------------------ - -- Toggle, WaitForToggle - -- Used for communicating between processes - ------------------------------------------------------------ - procedure Toggle ( - signal Sig : InOut std_logic ; - constant DelayVal : time - ) ; - procedure Toggle ( signal Sig : InOut std_logic ) ; - procedure ToggleHS ( signal Sig : InOut std_logic ) ; - function IsToggle ( signal Sig : In std_logic ) return boolean ; - procedure WaitForToggle ( signal Sig : In std_logic ) ; - - -- Bit type versions - procedure Toggle ( signal Sig : InOut bit ; constant DelayVal : time ) ; - procedure Toggle ( signal Sig : InOut bit ) ; - procedure ToggleHS ( signal Sig : InOut bit ) ; - function IsToggle ( signal Sig : In bit ) return boolean ; - procedure WaitForToggle ( signal Sig : In bit ) ; - - - ------------------------------------------------------------ - -- WaitForBarrier - -- Barrier Synchronization - -- Multiple processes call it, it finishes when all have called it - ------------------------------------------------------------ - procedure WaitForBarrier ( signal Sig : InOut std_logic ) ; - procedure WaitForBarrier ( signal Sig : InOut std_logic ; signal TimeOut : std_logic ; constant Polarity : in std_logic := '1') ; - procedure WaitForBarrier ( signal Sig : InOut std_logic ; constant TimeOut : time ) ; - -- resolved_barrier : summing resolution used in conjunction with integer based barriers - function resolved_barrier ( s : integer_vector ) return integer ; - subtype integer_barrier is resolved_barrier integer ; - -- Usage of integer barriers requires resolved_barrier. Initialization to 1 recommended, but not required - -- signal barrier1 : resolved_barrier integer := 1 ; -- using the resolution function - -- signal barrier2 : integer_barrier := 1 ; -- using the subtype that already applies the resolution function - procedure WaitForBarrier ( signal Sig : InOut integer ) ; - procedure WaitForBarrier ( signal Sig : InOut integer ; signal TimeOut : std_logic ; constant Polarity : in std_logic := '1') ; - procedure WaitForBarrier ( signal Sig : InOut integer ; constant TimeOut : time ) ; - -- Using separate signals - procedure WaitForBarrier2 ( signal SyncOut : out std_logic ; signal SyncIn : in std_logic ) ; - procedure WaitForBarrier2 ( signal SyncOut : out std_logic ; signal SyncInV : in std_logic_vector ) ; - - - ------------------------------------------------------------ - -- WaitForClock - -- Sync to Clock - after a delay, after a number of clocks - ------------------------------------------------------------ - procedure WaitForClock ( signal Clk : in std_logic ; constant Delay : in time ) ; - procedure WaitForClock ( signal Clk : in std_logic ; constant NumberOfClocks : in integer := 1) ; - procedure WaitForClock ( signal Clk : in std_logic ; signal Enable : in boolean ) ; - procedure WaitForClock ( signal Clk : in std_logic ; signal Enable : in std_logic ; constant Polarity : std_logic := '1' ) ; - - - ------------------------------------------------------------ - -- WaitForLevel - -- Find a signal at a level - ------------------------------------------------------------ - procedure WaitForLevel ( signal A : in boolean ) ; - procedure WaitForLevel ( signal A : in std_logic ; Polarity : std_logic := '1' ) ; - - ------------------------------------------------------------ - -- CreateClock, CreateReset - -- Note these do not exit - ------------------------------------------------------------ - procedure CreateClock ( - signal Clk : inout std_logic ; - constant Period : time ; - constant DutyCycle : real := 0.5 - ) ; - - procedure CheckClockPeriod ( - constant AlertLogID : AlertLogIDType ; - signal Clk : in std_logic ; - constant Period : time ; - constant ClkName : string := "Clock" ; - constant HowMany : integer := 5 - ) ; - - procedure CheckClockPeriod ( - signal Clk : in std_logic ; - constant Period : time ; - constant ClkName : string := "Clock" ; - constant HowMany : integer := 5 - ) ; - - procedure CreateReset ( - signal Reset : out std_logic ; - constant ResetActive : in std_logic ; - signal Clk : in std_logic ; - constant Period : time ; - constant tpd : time - ) ; - - procedure LogReset ( - constant AlertLogID : AlertLogIDType ; - signal Reset : in std_logic ; - constant ResetActive : in std_logic ; - constant ResetName : in string := "Reset" ; - constant LogLevel : in LogType := ALWAYS - ) ; - - procedure LogReset ( - signal Reset : in std_logic ; - constant ResetActive : in std_logic ; - constant ResetName : in string := "Reset" ; - constant LogLevel : in LogType := ALWAYS - ) ; - - ------------------------------------------------------------ - -- Deprecated subprogram names - -- Maintaining backward compatibility using aliases - ------------------------------------------------------------ - -- History of RequestTransaction / WaitForTransaction - alias RequestAction is RequestTransaction [std_logic, std_logic] ; - alias WaitForRequest is WaitForTransaction [std_logic, std_logic, std_logic] ; - -- History of WaitForToggle - alias WaitOnToggle is WaitForToggle [std_logic] ; - -- History of WaitForBarrier - alias WayPointBlock is WaitForBarrier [std_logic] ; - alias SyncTo is WaitForBarrier2[std_logic, std_logic] ; - alias SyncTo is WaitForBarrier2[std_logic, std_logic_vector] ; - -- Backward compatible name - alias SyncToClk is WaitForClock [std_logic, time] ; - - ------------------------------------------------------------ - -- Deprecated - -- subsumed by WaitForTransaction with Ack and TimeOut. - -- TimeOut works exactly like IntReq - ------------------------------------------------------------ - procedure WaitForTransactionOrIrq ( - signal Clk : In std_logic ; - signal Rdy : In std_logic ; - signal IntReq : In std_logic - ) ; - - ------------------------------------------------------------ - -- Deprecated - -- WaitForAck, StrobeAck - -- Replaced by WaitForToggle and Toggle - ------------------------------------------------------------ - procedure WaitForAck ( signal Ack : In std_logic ) ; - procedure StrobeAck ( signal Ack : Out std_logic ) ; - -end TbUtilPkg ; - --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -package body TbUtilPkg is - - ------------------------------------------------------------ - -- ZeroOneHot, OneHot - -- OneHot: return true if exactly one value is 1 - -- ZeroOneHot: return false when more than one value is a 1 - ------------------------------------------------------------ - function OneHot ( constant A : in std_logic_vector ) return boolean is - variable found_one : boolean := FALSE ; - begin - for i in A'range loop - if A(i) = '1' or A(i) = 'H' then - if found_one then - return FALSE ; - end if ; - found_one := TRUE ; - end if ; - end loop ; - return found_one ; -- found a one - end function OneHot ; - - function ZeroOneHot ( constant A : in std_logic_vector ) return boolean is - variable found_one : boolean := FALSE ; - begin - for i in A'range loop - if A(i) = '1' or A(i) = 'H' then - if found_one then - return FALSE ; - end if ; - found_one := TRUE ; - end if ; - end loop ; - return TRUE ; -- all zero or found a one - end function ZeroOneHot ; - - - ------------------------------------------------------------ - -- RequestTransaction - -- Transaction initiation side of handshaking - -- Pairs with WaitForTransaction or one of its variations - ------------------------------------------------------------ - procedure RequestTransaction ( - signal Rdy : Out std_logic ; - signal Ack : In std_logic - ) is - begin - -- Record contains new transaction - Rdy <= '1' ; - -- Find Ack low = '0' - wait until Ack = '0' ; - -- Prepare for Next Transaction - Rdy <= '0' ; - -- Transaction Done - wait until Ack = '1' ; - end procedure ; - - - ------------------------------------------------------------ - -- WaitForTransaction - -- Model side of handshaking - -- Pairs with RequestTransaction - ------------------------------------------------------------ - procedure WaitForTransaction ( - signal Clk : In std_logic ; - signal Rdy : In std_logic ; - signal Ack : Out std_logic - ) is - variable AckTime : time ; - begin - -- End of Previous Cycle. Signal Done - Ack <= '1' ; -- #6 - AckTime := NOW ; - -- Find Start of Transaction - if Rdy /= '1' then -- #2 - wait until Rdy = '1' ; - else - wait for 0 ns ; -- allow Ack to update - end if ; - -- align to clock if needed (not back-to-back transactions) - if NOW /= AckTime then - wait until Clk = CLK_ACTIVE ; - end if ; - -- Model active and owns the record - Ack <= '0' ; -- #3 - end procedure ; - - -- Variation for model that stops waiting when TimeOut is asserted - -- Intended for models that need to switch between instruction streams - -- such as a CPU when interrupt is pending - procedure WaitForTransaction ( - signal Clk : In std_logic ; - signal Rdy : In std_logic ; - signal Ack : Out std_logic ; - signal TimeOut : In std_logic ; - constant Polarity : In std_logic := '1' - ) is - variable AckTime : time ; - variable FoundRdy : boolean ; - begin - -- End of Previous Cycle. Signal Done - Ack <= '1' ; -- #6 - AckTime := NOW ; - -- Find Ready or Time out - if (Rdy /= '1' and TimeOut /= Polarity) then - wait until Rdy = '1' or TimeOut = Polarity ; - else - wait for 0 ns ; -- allow Ack to update - end if ; - FoundRdy := Rdy = '1' ; - -- align to clock if Rdy or TimeOut does not happen within delta cycles from Ack - if NOW /= AckTime then - wait until Clk = CLK_ACTIVE ; - end if ; - if FoundRdy then - -- Model active and owns the record - Ack <= '0' ; -- #3 - end if ; - end procedure ; - - -- Set Ack to Model starting value - -- Pairs with WaitForTransactionOrIrq above - procedure StartTransaction ( signal Ack : Out std_logic ) is - begin - Ack <= '0' ; - end procedure ; - - -- Set Ack to Model finishing value - -- Pairs with WaitForTransactionOrIrq above - procedure FinishTransaction ( signal Ack : Out std_logic ) is - begin - -- End of Cycle - Ack <= '1' ; - end procedure ; - - -- If a transaction is pending, return true - -- Used to detect presence of transaction stream, - -- such as an interrupt handler - function TransactionPending ( - signal Rdy : In std_logic - ) return boolean is - begin - return Rdy = '1' ; - end function ; - - -- Variation for clockless models - procedure WaitForTransaction ( - signal Rdy : In std_logic ; - signal Ack : Out std_logic - ) is - variable AckTime : time ; - begin - -- End of Previous Cycle. Signal Done - Ack <= '1' ; -- #6 - -- Find Start of Transaction - if Rdy /= '1' then -- #2 - wait until Rdy = '1' ; - else - wait for 0 ns ; -- allow Ack to update - end if ; - -- Model active and owns the record - Ack <= '0' ; -- #3 - end procedure ; - - - ------------------------------------------------------------ - -- Toggle, WaitForToggle - -- Used for communicating between processes - ------------------------------------------------------------ - type stdulogic_indexby_stdulogic is array (std_ulogic) of std_ulogic; - constant toggle_sl_table : stdulogic_indexby_stdulogic := ( - '0' => '1', - 'L' => '1', - others => '0' - ); - - procedure Toggle ( - signal Sig : InOut std_logic ; - constant DelayVal : time - ) is - variable iDelayVal : time ; - begin - iDelayVal := DelayVal ; - if iDelayVal > t_sim_resolution then - iDelayVal := iDelayVal - t_sim_resolution ; - end if ; - Sig <= toggle_sl_table(Sig) after iDelayVal ; - end procedure ; - - procedure Toggle ( signal Sig : InOut std_logic ) is - begin - Sig <= toggle_sl_table(Sig) ; - end procedure ; - - procedure ToggleHS ( signal Sig : InOut std_logic ) is - begin - Sig <= toggle_sl_table(Sig) ; - wait for 0 ns ; -- Sig toggles - wait for 0 ns ; -- new values updated into record - end procedure ; - - function IsToggle ( signal Sig : In std_logic ) return boolean is - begin - return Sig'event ; - end function ; - - procedure WaitForToggle ( signal Sig : In std_logic ) is - begin - wait on Sig ; - end procedure ; - - -- Bit type versions - procedure Toggle ( signal Sig : InOut bit ; constant DelayVal : time ) is - variable iDelayVal : time ; - begin - iDelayVal := DelayVal ; - if iDelayVal > t_sim_resolution then - iDelayVal := iDelayVal - t_sim_resolution ; - end if ; - Sig <= not Sig after iDelayVal ; - end procedure ; - - procedure Toggle ( signal Sig : InOut bit ) is - begin - Sig <= not Sig ; - end procedure ; - - procedure ToggleHS ( signal Sig : InOut bit ) is - begin - Sig <= not Sig ; - wait for 0 ns ; -- Sig toggles - wait for 0 ns ; -- new values updated into record - end procedure ; - - function IsToggle ( signal Sig : In bit ) return boolean is - begin - return Sig'event ; - end function ; - - procedure WaitForToggle ( signal Sig : In bit ) is - begin - wait on Sig ; - end procedure ; - - - ------------------------------------------------------------ - -- WaitForBarrier - -- Barrier Synchronization - -- Multiple processes call it, it finishes when all have called it - ------------------------------------------------------------ - procedure WaitForBarrier ( signal Sig : InOut std_logic ) is - begin - Sig <= 'H' ; - -- Wait until all processes set Sig to H - -- Level check not necessary since last value /= H yet - wait until Sig = 'H' ; - -- Deactivate and propagate to allow back to back calls - Sig <= '0' ; - wait for 0 ns ; - end procedure WaitForBarrier ; - - procedure WaitForBarrier ( signal Sig : InOut std_logic ; signal TimeOut : std_logic ; constant Polarity : in std_logic := '1') is - begin - Sig <= 'H' ; - -- Wait until all processes set Sig to H - -- Level check not necessary since last value /= H yet - wait until Sig = 'H' or TimeOut = Polarity ; - -- Deactivate and propagate to allow back to back calls - Sig <= '0' ; - wait for 0 ns ; - end procedure WaitForBarrier ; - - procedure WaitForBarrier ( signal Sig : InOut std_logic ; constant TimeOut : time ) is - begin - Sig <= 'H' ; - -- Wait until all processes set Sig to H - -- Level check not necessary since last value /= H yet - wait until Sig = 'H' for TimeOut ; - -- Deactivate and propagate to allow back to back calls - Sig <= '0' ; - wait for 0 ns ; - end procedure WaitForBarrier ; - - ------------------------------------------------------------ - -- resolved_barrier - -- summing resolution used in conjunction with integer based barriers - function resolved_barrier ( s : integer_vector ) return integer is - variable result : integer := 0 ; - begin - for i in s'RANGE loop - if s(i) /= integer'left then - result := s(i) + result; - else - return integer'left ; -- removes the initialization requirement - end if ; - end loop ; - return result ; - end function resolved_barrier ; - - -- Usage of integer barriers requires resolved_barrier. Initialization to 1 recommended, but not required - -- signal barrier1 : resolved_barrier integer := 1 ; -- using the resolution function - -- signal barrier2 : integer_barrier := 1 ; -- using the subtype that already applies the resolution function - procedure WaitForBarrier ( signal Sig : InOut integer ) is - begin - Sig <= 0 ; - -- Wait until all processes set Sig to 0 - -- Level check not necessary since last value /= 0 yet - wait until Sig = 0 ; - -- Deactivate and propagate to allow back to back calls - Sig <= 1 ; - wait for 0 ns ; - end procedure WaitForBarrier ; - - procedure WaitForBarrier ( signal Sig : InOut integer ; signal TimeOut : std_logic ; constant Polarity : in std_logic := '1') is - begin - Sig <= 0 ; - -- Wait until all processes set Sig to 0 - -- Level check not necessary since last value /= 0 yet - wait until Sig = 0 or TimeOut = Polarity ; - -- Deactivate and propagate to allow back to back calls - Sig <= 1 ; - wait for 0 ns ; - end procedure WaitForBarrier ; - - procedure WaitForBarrier ( signal Sig : InOut integer ; constant TimeOut : time ) is - begin - Sig <= 0 ; - -- Wait until all processes set Sig to 0 - -- Level check not necessary since last value /= 0 yet - wait until Sig = 0 for TimeOut ; - -- Deactivate and propagate to allow back to back calls - Sig <= 1 ; - wait for 0 ns ; - end procedure WaitForBarrier ; - - -- Using separate signals - procedure WaitForBarrier2 ( signal SyncOut : out std_logic ; signal SyncIn : in std_logic ) is - begin - -- Activate Rdy - SyncOut <= '1' ; - -- Make sure our Rdy is seen - wait for 0 ns ; - -- Wait until other process' Rdy is at level 1 - if SyncIn /= '1' then - wait until SyncIn = '1' ; - end if ; - -- Deactivate Rdy - SyncOut <= '0' ; - end procedure WaitForBarrier2 ; - - procedure WaitForBarrier2 ( signal SyncOut : out std_logic ; signal SyncInV : in std_logic_vector ) is - constant ALL_ONE : std_logic_vector(SyncInV'Range) := (others => '1'); - begin - -- Activate Rdy - SyncOut <= '1' ; - -- Make sure our Rdy is seen - wait for 0 ns ; - -- Wait until all other process' Rdy is at level 1 - if SyncInV /= ALL_ONE then - wait until SyncInV = ALL_ONE ; - end if ; - -- Deactivate Rdy - SyncOut <= '0' ; - end procedure WaitForBarrier2 ; - - - ------------------------------------------------------------ - -- WaitForClock - -- Sync to Clock - after a delay, after a number of clocks - ------------------------------------------------------------ - procedure WaitForClock ( signal Clk : in std_logic ; constant Delay : in time ) is - begin - if delay > t_sim_resolution then - wait for delay - t_sim_resolution ; - end if ; - wait until Clk = CLK_ACTIVE ; - end procedure WaitForClock ; - - procedure WaitForClock ( signal Clk : in std_logic ; constant NumberOfClocks : in integer := 1) is - begin - for i in 1 to NumberOfClocks loop - wait until Clk = CLK_ACTIVE ; - end loop ; - end procedure WaitForClock ; - - procedure WaitForClock ( signal Clk : in std_logic ; signal Enable : in boolean ) is - begin - wait on Clk until Clk = CLK_ACTIVE and Enable ; - end procedure WaitForClock ; - - procedure WaitForClock ( signal Clk : in std_logic ; signal Enable : in std_logic ; constant Polarity : std_logic := '1' ) is - begin - wait on Clk until Clk = CLK_ACTIVE and Enable = Polarity ; - end procedure WaitForClock ; - - - ------------------------------------------------------------ - -- WaitForLevel - -- Find a signal at a level - ------------------------------------------------------------ - procedure WaitForLevel ( signal A : in boolean ) is - begin - if not A then - wait until A ; - end if ; - end procedure WaitForLevel ; - - procedure WaitForLevel ( signal A : in std_logic ; Polarity : std_logic := '1' ) is - begin - if A /= Polarity then - -- wait on A until A = Polarity ; - if Polarity = '1' then - wait until A = '1' ; - else - wait until A = '0' ; - end if ; - end if ; - end procedure WaitForLevel ; - - - ------------------------------------------------------------ - -- CreateClock, CreateReset - -- Note these do not exit - ------------------------------------------------------------ - procedure CreateClock ( - signal Clk : inout std_logic ; - constant Period : time ; - constant DutyCycle : real := 0.5 - ) is - constant HIGH_TIME : time := Period * DutyCycle ; - constant LOW_TIME : time := Period - HIGH_TIME ; - begin - if HIGH_TIME = LOW_TIME then - loop - Clk <= toggle_sl_table(Clk) after HIGH_TIME ; - wait on Clk ; - end loop ; - else - -- Schedule s.t. all assignments after the first occur on delta cycle 0 - Clk <= '0', '1' after LOW_TIME ; - wait for period - 1 ns ; -- allows after on future Clk <= '0' - loop - Clk <= '0' after 1 ns, '1' after LOW_TIME + 1 ns ; - wait for period ; - end loop ; - end if ; - end procedure CreateClock ; - - procedure CheckClockPeriod ( - constant AlertLogID : AlertLogIDType ; - signal Clk : in std_logic ; - constant Period : time ; - constant ClkName : string := "Clock" ; - constant HowMany : integer := 5 - ) is - variable LastLogTime, ObservedPeriod : time ; - begin - wait until Clk = CLK_ACTIVE ; - LastLogTime := now ; - -- Check First HowMany clocks - for i in 1 to HowMany loop - wait until Clk = CLK_ACTIVE ; - ObservedPeriod := now - LastLogTime ; - AffirmIf(AlertLogID, ObservedPeriod = Period, - "CheckClockPeriod: " & ClkName & " Period: " & to_string(ObservedPeriod) & - " = Expected " & to_string(Period)) ; - LastLogTime := now ; - end loop ; - wait ; - end procedure CheckClockPeriod ; - - procedure CheckClockPeriod ( - signal Clk : in std_logic ; - constant Period : time ; - constant ClkName : string := "Clock" ; - constant HowMany : integer := 5 - ) is - begin - CheckClockPeriod ( - AlertLogID => ALERTLOG_DEFAULT_ID, - Clk => Clk, - Period => Period, - ClkName => ClkName, - HowMany => HowMany - ) ; - end procedure CheckClockPeriod ; - - procedure CreateReset ( - signal Reset : out std_logic ; - constant ResetActive : in std_logic ; - signal Clk : in std_logic ; - constant Period : time ; - constant tpd : time - ) is - begin - wait until Clk = CLK_ACTIVE ; - Reset <= ResetActive after tpd ; - wait for Period - t_sim_resolution ; - wait until Clk = CLK_ACTIVE ; - Reset <= not ResetActive after tpd ; - wait ; - end procedure CreateReset ; - - procedure LogReset ( - constant AlertLogID : AlertLogIDType ; - signal Reset : in std_logic ; - constant ResetActive : in std_logic ; - constant ResetName : in string := "Reset" ; - constant LogLevel : in LogType := ALWAYS - ) is - begin - -- Does not log the value of Reset at time 0. - for_ever : loop - wait on Reset ; - if Reset = ResetActive then - LOG(AlertLogID, ResetName & " now active", INFO) ; - print("") ; - elsif Reset = not ResetActive then - LOG(AlertLogID, ResetName & " now inactive", INFO) ; - print("") ; - else - LOG(AlertLogID, ResetName & " = " & to_string(Reset), INFO) ; - print("") ; - end if ; - end loop for_ever ; - end procedure LogReset ; - - procedure LogReset ( - signal Reset : in std_logic ; - constant ResetActive : in std_logic ; - constant ResetName : in string := "Reset" ; - constant LogLevel : in LogType := ALWAYS - ) is - begin - LogReset ( - AlertLogID => ALERTLOG_DEFAULT_ID, - Reset => Reset, - ResetActive => ResetActive, - ResetName => ResetName, - LogLevel => LogLevel - ) ; - end procedure LogReset ; - - ------------------------------------------------------------ - -- Deprecated - -- subsumed by WaitForTransaction with Ack and TimeOut. - -- TimeOut works exactly like IntReq - ------------------------------------------------------------ - procedure WaitForTransactionOrIrq ( - signal Clk : In std_logic ; - signal Rdy : In std_logic ; - signal IntReq : In std_logic - ) is - variable AckTime : time ; - constant POLARITY : std_logic := '1' ; - begin - AckTime := NOW ; - -- Find Ready or Time out - if (Rdy /= '1' and IntReq /= POLARITY) then - wait until Rdy = '1' or IntReq = POLARITY ; - else - wait for 0 ns ; -- allow Ack to update - end if ; - -- align to clock if Rdy or IntReq does not happen within delta cycles from Ack - if NOW /= AckTime then - wait until Clk = CLK_ACTIVE ; - end if ; - end procedure ; - - ------------------------------------------------------------ - -- Deprecated - -- WaitForAck, StrobeAck - -- Replaced by WaitForToggle and Toggle - ------------------------------------------------------------ - procedure WaitForAck ( signal Ack : In std_logic ) is - begin - -- Wait for Model to be done - wait until Ack = '1' ; - end procedure ; - - procedure StrobeAck ( signal Ack : Out std_logic ) is - begin - -- Model done, drive rising edge on Ack - Ack <= '0' ; - wait for 0 ns ; - Ack <= '1' ; - end procedure ; - - -end TbUtilPkg ; - +-- +-- File Name: TbUtilPkg.vhd +-- Design Unit Name: TbUtilPkg +-- Revision: STANDARD VERSION +-- +-- Maintainer: Jim Lewis email: jim@SynthWorks.com +-- Contributor(s): +-- Jim Lewis email: jim@SynthWorks.com +-- +-- Package Defines +-- +-- Developed for: +-- SynthWorks Design Inc. +-- VHDL Training Classes +-- 11898 SW 128th Ave. Tigard, Or 97223 +-- http://www.SynthWorks.com +-- +-- Revision History: +-- Date Version Description +-- 11/1999: 0.1 Initial revision +-- Numerous revisions for VHDL Testbenches and Verification +-- 10/2013 2013.10 Split out Text Utilities +-- 11/2016 2016.11 First Public Release Version +-- Updated naming for consistency. +-- +-- +-- Copyright (c) 1999 - 2016 by SynthWorks Design Inc. All rights reserved. +-- +-- Verbatim copies of this source file may be used and +-- distributed without restriction. +-- +-- This source file is free software; you can redistribute it +-- and/or modify it under the terms of the ARTISTIC License +-- as published by The Perl Foundation; either version 2.0 of +-- the License, or (at your option) any later version. +-- +-- This source is distributed in the hope that it will be +-- useful, but WITHOUT ANY WARRANTY; without even the implied +-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +-- PURPOSE. See the Artistic License for details. +-- +-- You should have received a copy of the license with this source. +-- If not download it from, +-- http://www.perlfoundation.org/artistic_license_2_0 +-- +library ieee ; + use ieee.std_logic_1164.all ; + +library osvvm ; + use osvvm.AlertLogPkg.all ; + use osvvm.TranscriptPkg.all ; + +package TbUtilPkg is + + constant CLK_ACTIVE : std_logic := '1' ; + + constant t_sim_resolution : time := std.env.resolution_limit ; -- VHDL-2008 + -- constant t_sim_resolution : time := 1 ns ; -- for non VHDL-2008 simulators + + ------------------------------------------------------------ + -- ZeroOneHot, OneHot + -- OneHot: return true if exactly one value is 1 + -- ZeroOneHot: return false when more than one value is a 1 + ------------------------------------------------------------ + function OneHot ( constant A : in std_logic_vector ) return boolean ; + function ZeroOneHot ( constant A : in std_logic_vector ) return boolean ; + + + ------------------------------------------------------------ + -- RequestTransaction + -- Transaction initiation side of handshaking + -- Pairs with WaitForTransaction or one of its variations + ------------------------------------------------------------ + procedure RequestTransaction ( + signal Rdy : Out std_logic ; + signal Ack : In std_logic + ) ; + + procedure RequestTransaction ( + signal Rdy : Out bit ; + signal Ack : In bit + ) ; + + ------------------------------------------------------------ + -- WaitForTransaction + -- Model side of handshaking + -- Pairs with RequestTransaction + ------------------------------------------------------------ + procedure WaitForTransaction ( + signal Clk : In std_logic ; + signal Rdy : In std_logic ; + signal Ack : Out std_logic + ) ; + + procedure WaitForTransaction ( + signal Clk : In std_logic ; + signal Rdy : In bit ; + signal Ack : Out bit + ) ; + + + -- Variation for model that stops waiting when TimeOut is asserted + -- Intended for models that need to switch between instruction streams + -- such as a CPU when interrupt is pending + procedure WaitForTransaction ( + signal Clk : In std_logic ; + signal Rdy : In std_logic ; + signal Ack : Out std_logic ; + signal TimeOut : In std_logic ; + constant Polarity : In std_logic := '1' + ) ; + + -- Set Ack to Model starting value + procedure StartTransaction ( signal Ack : Out std_logic ) ; + -- Set Ack to Model finishing value + procedure FinishTransaction ( signal Ack : Out std_logic ) ; + -- If a transaction is pending, return true + function TransactionPending ( signal Rdy : In std_logic ) return boolean ; + + -- Variation for clockless models + procedure WaitForTransaction ( + signal Rdy : In std_logic ; + signal Ack : Out std_logic + ) ; + + + ------------------------------------------------------------ + -- Toggle, WaitForToggle + -- Used for communicating between processes + ------------------------------------------------------------ + procedure Toggle ( + signal Sig : InOut std_logic ; + constant DelayVal : time + ) ; + procedure Toggle ( signal Sig : InOut std_logic ) ; + procedure ToggleHS ( signal Sig : InOut std_logic ) ; + function IsToggle ( signal Sig : In std_logic ) return boolean ; + procedure WaitForToggle ( signal Sig : In std_logic ) ; + + -- Bit type versions + procedure Toggle ( signal Sig : InOut bit ; constant DelayVal : time ) ; + procedure Toggle ( signal Sig : InOut bit ) ; + procedure ToggleHS ( signal Sig : InOut bit ) ; + function IsToggle ( signal Sig : In bit ) return boolean ; + procedure WaitForToggle ( signal Sig : In bit ) ; + + -- Integer type versions + procedure Increment ( signal Sig : InOut integer ; constant RollOverValue : in integer := 0) ; + procedure WaitForToggle ( signal Sig : In integer ) ; + + + ------------------------------------------------------------ + -- WaitForBarrier + -- Barrier Synchronization + -- Multiple processes call it, it finishes when all have called it + ------------------------------------------------------------ + procedure WaitForBarrier ( signal Sig : InOut std_logic ) ; + procedure WaitForBarrier ( signal Sig : InOut std_logic ; signal TimeOut : std_logic ; constant Polarity : in std_logic := '1') ; + procedure WaitForBarrier ( signal Sig : InOut std_logic ; constant TimeOut : time ) ; + -- resolved_barrier : summing resolution used in conjunction with integer based barriers + function resolved_barrier ( s : integer_vector ) return integer ; + subtype integer_barrier is resolved_barrier integer ; + -- Usage of integer barriers requires resolved_barrier. Initialization to 1 recommended, but not required + -- signal barrier1 : resolved_barrier integer := 1 ; -- using the resolution function + -- signal barrier2 : integer_barrier := 1 ; -- using the subtype that already applies the resolution function + procedure WaitForBarrier ( signal Sig : InOut integer ) ; + procedure WaitForBarrier ( signal Sig : InOut integer ; signal TimeOut : std_logic ; constant Polarity : in std_logic := '1') ; + procedure WaitForBarrier ( signal Sig : InOut integer ; constant TimeOut : time ) ; + -- Using separate signals + procedure WaitForBarrier2 ( signal SyncOut : out std_logic ; signal SyncIn : in std_logic ) ; + procedure WaitForBarrier2 ( signal SyncOut : out std_logic ; signal SyncInV : in std_logic_vector ) ; + + + ------------------------------------------------------------ + -- WaitForClock + -- Sync to Clock - after a delay, after a number of clocks + ------------------------------------------------------------ + procedure WaitForClock ( signal Clk : in std_logic ; constant Delay : in time ) ; + procedure WaitForClock ( signal Clk : in std_logic ; constant NumberOfClocks : in integer := 1) ; + procedure WaitForClock ( signal Clk : in std_logic ; signal Enable : in boolean ) ; + procedure WaitForClock ( signal Clk : in std_logic ; signal Enable : in std_logic ; constant Polarity : std_logic := '1' ) ; + + + ------------------------------------------------------------ + -- WaitForLevel + -- Find a signal at a level + ------------------------------------------------------------ + procedure WaitForLevel ( signal A : in boolean ) ; + procedure WaitForLevel ( signal A : in std_logic ; Polarity : std_logic := '1' ) ; + + ------------------------------------------------------------ + -- CreateClock, CreateReset + -- Note these do not exit + ------------------------------------------------------------ + procedure CreateClock ( + signal Clk : inout std_logic ; + constant Period : time ; + constant DutyCycle : real := 0.5 + ) ; + + procedure CheckClockPeriod ( + constant AlertLogID : AlertLogIDType ; + signal Clk : in std_logic ; + constant Period : time ; + constant ClkName : string := "Clock" ; + constant HowMany : integer := 5 + ) ; + + procedure CheckClockPeriod ( + signal Clk : in std_logic ; + constant Period : time ; + constant ClkName : string := "Clock" ; + constant HowMany : integer := 5 + ) ; + + procedure CreateReset ( + signal Reset : out std_logic ; + constant ResetActive : in std_logic ; + signal Clk : in std_logic ; + constant Period : time ; + constant tpd : time + ) ; + + procedure LogReset ( + constant AlertLogID : AlertLogIDType ; + signal Reset : in std_logic ; + constant ResetActive : in std_logic ; + constant ResetName : in string := "Reset" ; + constant LogLevel : in LogType := ALWAYS + ) ; + + procedure LogReset ( + signal Reset : in std_logic ; + constant ResetActive : in std_logic ; + constant ResetName : in string := "Reset" ; + constant LogLevel : in LogType := ALWAYS + ) ; + + ------------------------------------------------------------ + -- Deprecated subprogram names + -- Maintaining backward compatibility using aliases + ------------------------------------------------------------ + -- History of RequestTransaction / WaitForTransaction + alias RequestAction is RequestTransaction [std_logic, std_logic] ; + alias WaitForRequest is WaitForTransaction [std_logic, std_logic, std_logic] ; + -- History of WaitForToggle + alias WaitOnToggle is WaitForToggle [std_logic] ; + -- History of WaitForBarrier + alias WayPointBlock is WaitForBarrier [std_logic] ; + alias SyncTo is WaitForBarrier2[std_logic, std_logic] ; + alias SyncTo is WaitForBarrier2[std_logic, std_logic_vector] ; + -- Backward compatible name + alias SyncToClk is WaitForClock [std_logic, time] ; + + ------------------------------------------------------------ + -- Deprecated + -- subsumed by WaitForTransaction with Ack and TimeOut. + -- TimeOut works exactly like IntReq + ------------------------------------------------------------ + procedure WaitForTransactionOrIrq ( + signal Clk : In std_logic ; + signal Rdy : In std_logic ; + signal IntReq : In std_logic + ) ; + + ------------------------------------------------------------ + -- Deprecated + -- WaitForAck, StrobeAck + -- Replaced by WaitForToggle and Toggle + ------------------------------------------------------------ + procedure WaitForAck ( signal Ack : In std_logic ) ; + procedure StrobeAck ( signal Ack : Out std_logic ) ; + +end TbUtilPkg ; + +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +package body TbUtilPkg is + + ------------------------------------------------------------ + -- ZeroOneHot, OneHot + -- OneHot: return true if exactly one value is 1 + -- ZeroOneHot: return false when more than one value is a 1 + ------------------------------------------------------------ + function OneHot ( constant A : in std_logic_vector ) return boolean is + variable found_one : boolean := FALSE ; + begin + for i in A'range loop + if A(i) = '1' or A(i) = 'H' then + if found_one then + return FALSE ; + end if ; + found_one := TRUE ; + end if ; + end loop ; + return found_one ; -- found a one + end function OneHot ; + + function ZeroOneHot ( constant A : in std_logic_vector ) return boolean is + variable found_one : boolean := FALSE ; + begin + for i in A'range loop + if A(i) = '1' or A(i) = 'H' then + if found_one then + return FALSE ; + end if ; + found_one := TRUE ; + end if ; + end loop ; + return TRUE ; -- all zero or found a one + end function ZeroOneHot ; + + + ------------------------------------------------------------ + -- RequestTransaction + -- Transaction initiation side of handshaking + -- Pairs with WaitForTransaction or one of its variations + ------------------------------------------------------------ + procedure RequestTransaction ( + signal Rdy : Out std_logic ; + signal Ack : In std_logic + ) is + begin + -- Record contains new transaction + Rdy <= '1' ; + -- Find Ack low = '0' + wait until Ack = '0' ; + -- Prepare for Next Transaction + Rdy <= '0' ; + -- Transaction Done + wait until Ack = '1' ; + end procedure RequestTransaction ; + + procedure RequestTransaction ( + signal Rdy : Out bit ; + signal Ack : In bit + ) is + begin + -- Record contains new transaction + Rdy <= '1' ; + -- Find Ack low = '0' + wait until Ack = '0' ; + -- Prepare for Next Transaction + Rdy <= '0' ; + -- Transaction Done + wait until Ack = '1' ; + end procedure RequestTransaction ; + + + ------------------------------------------------------------ + -- WaitForTransaction + -- Model side of handshaking + -- Pairs with RequestTransaction + ------------------------------------------------------------ + procedure WaitForTransaction ( + signal Clk : In std_logic ; + signal Rdy : In std_logic ; + signal Ack : Out std_logic + ) is + variable AckTime : time ; + begin + -- End of Previous Cycle. Signal Done + Ack <= '1' ; -- #6 + AckTime := NOW ; + -- Find Start of Transaction + if Rdy /= '1' then -- #2 + wait until Rdy = '1' ; + else + wait for 0 ns ; -- allow Ack to update + end if ; + -- align to clock if needed (not back-to-back transactions) + if NOW /= AckTime then + wait until Clk = CLK_ACTIVE ; + end if ; + -- Model active and owns the record + Ack <= '0' ; -- #3 + end procedure WaitForTransaction ; + + procedure WaitForTransaction ( + signal Clk : In std_logic ; + signal Rdy : In bit ; + signal Ack : Out bit + ) is + variable AckTime : time ; + begin + -- End of Previous Cycle. Signal Done + Ack <= '1' ; -- #6 + AckTime := NOW ; + -- Find Start of Transaction + if Rdy /= '1' then -- #2 + wait until Rdy = '1' ; + else + wait for 0 ns ; -- allow Ack to update + end if ; + -- align to clock if needed (not back-to-back transactions) + if NOW /= AckTime then + wait until Clk = CLK_ACTIVE ; + end if ; + -- Model active and owns the record + Ack <= '0' ; -- #3 + end procedure WaitForTransaction ; + + -- Variation for model that stops waiting when TimeOut is asserted + -- Intended for models that need to switch between instruction streams + -- such as a CPU when interrupt is pending + procedure WaitForTransaction ( + signal Clk : In std_logic ; + signal Rdy : In std_logic ; + signal Ack : Out std_logic ; + signal TimeOut : In std_logic ; + constant Polarity : In std_logic := '1' + ) is + variable AckTime : time ; + variable FoundRdy : boolean ; + begin + -- End of Previous Cycle. Signal Done + Ack <= '1' ; -- #6 + AckTime := NOW ; + -- Find Ready or Time out + if (Rdy /= '1' and TimeOut /= Polarity) then + wait until Rdy = '1' or TimeOut = Polarity ; + else + wait for 0 ns ; -- allow Ack to update + end if ; + FoundRdy := Rdy = '1' ; + -- align to clock if Rdy or TimeOut does not happen within delta cycles from Ack + if NOW /= AckTime then + wait until Clk = CLK_ACTIVE ; + end if ; + if FoundRdy then + -- Model active and owns the record + Ack <= '0' ; -- #3 + end if ; + end procedure WaitForTransaction ; + + -- Set Ack to Model starting value + -- Pairs with WaitForTransactionOrIrq above + procedure StartTransaction ( signal Ack : Out std_logic ) is + begin + Ack <= '0' ; + end procedure StartTransaction ; + + -- Set Ack to Model finishing value + -- Pairs with WaitForTransactionOrIrq above + procedure FinishTransaction ( signal Ack : Out std_logic ) is + begin + -- End of Cycle + Ack <= '1' ; + end procedure FinishTransaction ; + + -- If a transaction is pending, return true + -- Used to detect presence of transaction stream, + -- such as an interrupt handler + function TransactionPending ( + signal Rdy : In std_logic + ) return boolean is + begin + return Rdy = '1' ; + end function TransactionPending ; + + -- Variation for clockless models + procedure WaitForTransaction ( + signal Rdy : In std_logic ; + signal Ack : Out std_logic + ) is + variable AckTime : time ; + begin + -- End of Previous Cycle. Signal Done + Ack <= '1' ; -- #6 + -- Find Start of Transaction + if Rdy /= '1' then -- #2 + wait until Rdy = '1' ; + else + wait for 0 ns ; -- allow Ack to update + end if ; + -- Model active and owns the record + Ack <= '0' ; -- #3 + end procedure WaitForTransaction ; + + + ------------------------------------------------------------ + -- Toggle, WaitForToggle + -- Used for communicating between processes + ------------------------------------------------------------ + type stdulogic_indexby_stdulogic is array (std_ulogic) of std_ulogic; + constant toggle_sl_table : stdulogic_indexby_stdulogic := ( + '0' => '1', + 'L' => '1', + others => '0' + ); + + procedure Toggle ( + signal Sig : InOut std_logic ; + constant DelayVal : time + ) is + variable iDelayVal : time ; + begin + if DelayVal > t_sim_resolution then + iDelayVal := DelayVal - t_sim_resolution ; + else + iDelayVal := 0 sec ; + AlertIf(OSVVM_ALERTLOG_ID, DelayVal < 0 sec, "osvvm.TbUtilPkg.Toggle: Delay value < 0 ns") ; + end if ; + Sig <= toggle_sl_table(Sig) after iDelayVal ; + end procedure Toggle ; + + procedure Toggle ( signal Sig : InOut std_logic ) is + begin + Sig <= toggle_sl_table(Sig) ; + end procedure Toggle ; + + procedure ToggleHS ( signal Sig : InOut std_logic ) is + begin + Sig <= toggle_sl_table(Sig) ; + wait for 0 ns ; -- Sig toggles + wait for 0 ns ; -- new values updated into record + end procedure ToggleHS ; + + function IsToggle ( signal Sig : In std_logic ) return boolean is + begin + return Sig'event ; + end function IsToggle ; + + procedure WaitForToggle ( signal Sig : In std_logic ) is + begin + wait on Sig ; + end procedure WaitForToggle ; + + -- Bit type versions + procedure Toggle ( signal Sig : InOut bit ; constant DelayVal : time ) is + variable iDelayVal : time ; + begin + if DelayVal > t_sim_resolution then + iDelayVal := DelayVal - t_sim_resolution ; + else + iDelayVal := 0 sec ; + AlertIf(OSVVM_ALERTLOG_ID, DelayVal < 0 sec, "osvvm.TbUtilPkg.Toggle: Delay value < 0 ns") ; + end if ; + Sig <= not Sig after iDelayVal ; + end procedure Toggle ; + + procedure Toggle ( signal Sig : InOut bit ) is + begin + Sig <= not Sig ; + end procedure Toggle ; + + procedure ToggleHS ( signal Sig : InOut bit ) is + begin + Sig <= not Sig ; + wait for 0 ns ; -- Sig toggles + wait for 0 ns ; -- new values updated into record + end procedure ToggleHS ; + + function IsToggle ( signal Sig : In bit ) return boolean is + begin + return Sig'event ; + end function IsToggle ; + + procedure WaitForToggle ( signal Sig : In bit ) is + begin + wait on Sig ; + end procedure WaitForToggle ; + + -- Integer type versions + procedure Increment ( signal Sig : InOut integer ; constant RollOverValue : in integer := 0) is + begin + if Sig = integer'high then + Sig <= RollOverValue ; + else + Sig <= Sig + 1 ; + end if ; + end procedure Increment ; + + procedure WaitForToggle ( signal Sig : In integer ) is + begin + wait on Sig ; + end procedure WaitForToggle ; + + + + ------------------------------------------------------------ + -- WaitForBarrier + -- Barrier Synchronization + -- Multiple processes call it, it finishes when all have called it + ------------------------------------------------------------ + procedure WaitForBarrier ( signal Sig : InOut std_logic ) is + begin + Sig <= 'H' ; + -- Wait until all processes set Sig to H + -- Level check not necessary since last value /= H yet + wait until Sig = 'H' ; + -- Deactivate and propagate to allow back to back calls + Sig <= '0' ; + wait for 0 ns ; + end procedure WaitForBarrier ; + + procedure WaitForBarrier ( signal Sig : InOut std_logic ; signal TimeOut : std_logic ; constant Polarity : in std_logic := '1') is + begin + Sig <= 'H' ; + -- Wait until all processes set Sig to H + -- Level check not necessary since last value /= H yet + wait until Sig = 'H' or TimeOut = Polarity ; + -- Deactivate and propagate to allow back to back calls + Sig <= '0' ; + wait for 0 ns ; + end procedure WaitForBarrier ; + + procedure WaitForBarrier ( signal Sig : InOut std_logic ; constant TimeOut : time ) is + begin + Sig <= 'H' ; + -- Wait until all processes set Sig to H + -- Level check not necessary since last value /= H yet + wait until Sig = 'H' for TimeOut ; + -- Deactivate and propagate to allow back to back calls + Sig <= '0' ; + wait for 0 ns ; + end procedure WaitForBarrier ; + + ------------------------------------------------------------ + -- resolved_barrier + -- summing resolution used in conjunction with integer based barriers + function resolved_barrier ( s : integer_vector ) return integer is + variable result : integer := 0 ; + begin + for i in s'RANGE loop + if s(i) /= integer'left then + result := s(i) + result; + else + result := s(i) + 1; -- removes the initialization requirement + end if ; + end loop ; + return result ; + end function resolved_barrier ; + + -- Usage of integer barriers requires resolved_barrier. Initialization to 1 recommended, but not required + -- signal barrier1 : resolved_barrier integer := 1 ; -- using the resolution function + -- signal barrier2 : integer_barrier := 1 ; -- using the subtype that already applies the resolution function + procedure WaitForBarrier ( signal Sig : InOut integer ) is + begin + Sig <= 0 ; + -- Wait until all processes set Sig to 0 + -- Level check not necessary since last value /= 0 yet + wait until Sig = 0 ; + -- Deactivate and propagate to allow back to back calls + Sig <= 1 ; + wait for 0 ns ; + end procedure WaitForBarrier ; + + procedure WaitForBarrier ( signal Sig : InOut integer ; signal TimeOut : std_logic ; constant Polarity : in std_logic := '1') is + begin + Sig <= 0 ; + -- Wait until all processes set Sig to 0 + -- Level check not necessary since last value /= 0 yet + wait until Sig = 0 or TimeOut = Polarity ; + -- Deactivate and propagate to allow back to back calls + Sig <= 1 ; + wait for 0 ns ; + end procedure WaitForBarrier ; + + procedure WaitForBarrier ( signal Sig : InOut integer ; constant TimeOut : time ) is + begin + Sig <= 0 ; + -- Wait until all processes set Sig to 0 + -- Level check not necessary since last value /= 0 yet + wait until Sig = 0 for TimeOut ; + -- Deactivate and propagate to allow back to back calls + Sig <= 1 ; + wait for 0 ns ; + end procedure WaitForBarrier ; + + -- Using separate signals + procedure WaitForBarrier2 ( signal SyncOut : out std_logic ; signal SyncIn : in std_logic ) is + begin + -- Activate Rdy + SyncOut <= '1' ; + -- Make sure our Rdy is seen + wait for 0 ns ; + -- Wait until other process' Rdy is at level 1 + if SyncIn /= '1' then + wait until SyncIn = '1' ; + end if ; + -- Deactivate Rdy + SyncOut <= '0' ; + end procedure WaitForBarrier2 ; + + procedure WaitForBarrier2 ( signal SyncOut : out std_logic ; signal SyncInV : in std_logic_vector ) is + constant ALL_ONE : std_logic_vector(SyncInV'Range) := (others => '1'); + begin + -- Activate Rdy + SyncOut <= '1' ; + -- Make sure our Rdy is seen + wait for 0 ns ; + -- Wait until all other process' Rdy is at level 1 + if SyncInV /= ALL_ONE then + wait until SyncInV = ALL_ONE ; + end if ; + -- Deactivate Rdy + SyncOut <= '0' ; + end procedure WaitForBarrier2 ; + + + ------------------------------------------------------------ + -- WaitForClock + -- Sync to Clock - after a delay, after a number of clocks + ------------------------------------------------------------ + procedure WaitForClock ( signal Clk : in std_logic ; constant Delay : in time ) is + begin + if delay > t_sim_resolution then + wait for delay - t_sim_resolution ; + end if ; + wait until Clk = CLK_ACTIVE ; + end procedure WaitForClock ; + + procedure WaitForClock ( signal Clk : in std_logic ; constant NumberOfClocks : in integer := 1) is + begin + for i in 1 to NumberOfClocks loop + wait until Clk = CLK_ACTIVE ; + end loop ; + end procedure WaitForClock ; + + procedure WaitForClock ( signal Clk : in std_logic ; signal Enable : in boolean ) is + begin + wait on Clk until Clk = CLK_ACTIVE and Enable ; + end procedure WaitForClock ; + + procedure WaitForClock ( signal Clk : in std_logic ; signal Enable : in std_logic ; constant Polarity : std_logic := '1' ) is + begin + wait on Clk until Clk = CLK_ACTIVE and Enable = Polarity ; + end procedure WaitForClock ; + + + ------------------------------------------------------------ + -- WaitForLevel + -- Find a signal at a level + ------------------------------------------------------------ + procedure WaitForLevel ( signal A : in boolean ) is + begin + if not A then + wait until A ; + end if ; + end procedure WaitForLevel ; + + procedure WaitForLevel ( signal A : in std_logic ; Polarity : std_logic := '1' ) is + begin + if A /= Polarity then + -- wait on A until A = Polarity ; + if Polarity = '1' then + wait until A = '1' ; + else + wait until A = '0' ; + end if ; + end if ; + end procedure WaitForLevel ; + + + ------------------------------------------------------------ + -- CreateClock, CreateReset + -- Note these do not exit + ------------------------------------------------------------ + procedure CreateClock ( + signal Clk : inout std_logic ; + constant Period : time ; + constant DutyCycle : real := 0.5 + ) is + constant HIGH_TIME : time := Period * DutyCycle ; + constant LOW_TIME : time := Period - HIGH_TIME ; + begin + if HIGH_TIME = LOW_TIME then + loop + Clk <= toggle_sl_table(Clk) after HIGH_TIME ; + wait on Clk ; + end loop ; + else + -- Schedule s.t. all assignments after the first occur on delta cycle 0 + Clk <= '0', '1' after LOW_TIME ; + wait for period - 1 ns ; -- allows after on future Clk <= '0' + loop + Clk <= '0' after 1 ns, '1' after LOW_TIME + 1 ns ; + wait for period ; + end loop ; + end if ; + end procedure CreateClock ; + + procedure CheckClockPeriod ( + constant AlertLogID : AlertLogIDType ; + signal Clk : in std_logic ; + constant Period : time ; + constant ClkName : string := "Clock" ; + constant HowMany : integer := 5 + ) is + variable LastLogTime, ObservedPeriod : time ; + begin + wait until Clk = CLK_ACTIVE ; + LastLogTime := now ; + -- Check First HowMany clocks + for i in 1 to HowMany loop + wait until Clk = CLK_ACTIVE ; + ObservedPeriod := now - LastLogTime ; + AffirmIf(AlertLogID, ObservedPeriod = Period, + "CheckClockPeriod: " & ClkName & " Period: " & to_string(ObservedPeriod) & + " = Expected " & to_string(Period)) ; + LastLogTime := now ; + end loop ; + wait ; + end procedure CheckClockPeriod ; + + procedure CheckClockPeriod ( + signal Clk : in std_logic ; + constant Period : time ; + constant ClkName : string := "Clock" ; + constant HowMany : integer := 5 + ) is + begin + CheckClockPeriod ( + AlertLogID => ALERTLOG_DEFAULT_ID, + Clk => Clk, + Period => Period, + ClkName => ClkName, + HowMany => HowMany + ) ; + end procedure CheckClockPeriod ; + + procedure CreateReset ( + signal Reset : out std_logic ; + constant ResetActive : in std_logic ; + signal Clk : in std_logic ; + constant Period : time ; + constant tpd : time + ) is + begin + wait until Clk = CLK_ACTIVE ; + Reset <= ResetActive after tpd ; + wait for Period - t_sim_resolution ; + wait until Clk = CLK_ACTIVE ; + Reset <= not ResetActive after tpd ; + wait ; + end procedure CreateReset ; + + procedure LogReset ( + constant AlertLogID : AlertLogIDType ; + signal Reset : in std_logic ; + constant ResetActive : in std_logic ; + constant ResetName : in string := "Reset" ; + constant LogLevel : in LogType := ALWAYS + ) is + begin + -- Does not log the value of Reset at time 0. + for_ever : loop + wait on Reset ; + if Reset = ResetActive then + LOG(AlertLogID, ResetName & " now active", INFO) ; + print("") ; + elsif Reset = not ResetActive then + LOG(AlertLogID, ResetName & " now inactive", INFO) ; + print("") ; + else + LOG(AlertLogID, ResetName & " = " & to_string(Reset), INFO) ; + print("") ; + end if ; + end loop for_ever ; + end procedure LogReset ; + + procedure LogReset ( + signal Reset : in std_logic ; + constant ResetActive : in std_logic ; + constant ResetName : in string := "Reset" ; + constant LogLevel : in LogType := ALWAYS + ) is + begin + LogReset ( + AlertLogID => ALERTLOG_DEFAULT_ID, + Reset => Reset, + ResetActive => ResetActive, + ResetName => ResetName, + LogLevel => LogLevel + ) ; + end procedure LogReset ; + + ------------------------------------------------------------ + -- Deprecated + -- subsumed by WaitForTransaction with Ack and TimeOut. + -- TimeOut works exactly like IntReq + ------------------------------------------------------------ + procedure WaitForTransactionOrIrq ( + signal Clk : In std_logic ; + signal Rdy : In std_logic ; + signal IntReq : In std_logic + ) is + variable AckTime : time ; + constant POLARITY : std_logic := '1' ; + begin + AckTime := NOW ; + -- Find Ready or Time out + if (Rdy /= '1' and IntReq /= POLARITY) then + wait until Rdy = '1' or IntReq = POLARITY ; + else + wait for 0 ns ; -- allow Ack to update + end if ; + -- align to clock if Rdy or IntReq does not happen within delta cycles from Ack + if NOW /= AckTime then + wait until Clk = CLK_ACTIVE ; + end if ; + end procedure ; + + ------------------------------------------------------------ + -- Deprecated + -- WaitForAck, StrobeAck + -- Replaced by WaitForToggle and Toggle + ------------------------------------------------------------ + procedure WaitForAck ( signal Ack : In std_logic ) is + begin + -- Wait for Model to be done + wait until Ack = '1' ; + end procedure ; + + procedure StrobeAck ( signal Ack : Out std_logic ) is + begin + -- Model done, drive rising edge on Ack + Ack <= '0' ; + wait for 0 ns ; + Ack <= '1' ; + end procedure ; + + +end TbUtilPkg ; + From 0ba36f5f2694d71c641535fef4c7b35c4c1b1fab Mon Sep 17 00:00:00 2001 From: JimLewis Date: Mon, 9 Apr 2018 16:35:23 -0700 Subject: [PATCH 6/8] Minor update to messages --- MessagePkg.vhd | 328 ++++++++++++++++++++++++------------------------- 1 file changed, 164 insertions(+), 164 deletions(-) diff --git a/MessagePkg.vhd b/MessagePkg.vhd index 3d442c9..fc426b8 100644 --- a/MessagePkg.vhd +++ b/MessagePkg.vhd @@ -1,165 +1,165 @@ --- --- File Name: MessagePkg.vhd --- Design Unit Name: MessagePkg --- Revision: STANDARD VERSION, revision 2015.01 --- --- Maintainer: Jim Lewis email: jim@synthworks.com --- Contributor(s): --- Jim Lewis SynthWorks --- --- --- Package Defines --- Data structure for multi-line name/message to be associated with a data structure. --- --- Developed for: --- SynthWorks Design Inc. --- VHDL Training Classes --- 11898 SW 128th Ave. Tigard, Or 97223 --- http://www.SynthWorks.com --- --- Latest standard version available at: --- http://www.SynthWorks.com/downloads --- --- Revision History: --- Date Version Description --- 06/2010: 0.1 Initial revision --- 07/2014: 2014.07 Moved specialization required by CoveragePkg to CoveragePkg --- 07/2014: 2014.07a Removed initialized pointers which can lead to memory leaks. --- 01/2015: 2015.01 Removed initialized parameter from Get --- --- --- Copyright (c) 2010 - 2015 by SynthWorks Design Inc. All rights reserved. --- --- Verbatim copies of this source file may be used and --- distributed without restriction. --- --- This source file is free software; you can redistribute it --- and/or modify it under the terms of the ARTISTIC License --- as published by The Perl Foundation; either version 2.0 of --- the License, or (at your option) any later version. --- --- This source is distributed in the hope that it will be --- useful, but WITHOUT ANY WARRANTY; without even the implied --- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR --- PURPOSE. See the Artistic License for details. --- --- You should have received a copy of the license with this source. --- If not download it from, --- http://www.perlfoundation.org/artistic_license_2_0 --- -use work.OsvvmGlobalPkg.all ; -use work.AlertLogPkg.all ; - -library ieee ; -use ieee.std_logic_1164.all ; -use ieee.numeric_std.all ; -use ieee.math_real.all ; -use std.textio.all ; - -package MessagePkg is - - type MessagePType is protected - - procedure Set (MessageIn : String) ; - impure function Get (ItemNumber : integer) return string ; - impure function GetCount return integer ; - impure function IsSet return boolean ; - procedure Clear ; -- clear message - procedure Deallocate ; -- clear message - - end protected MessagePType ; - -end package MessagePkg ; - ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// - -package body MessagePkg is - - -- Local Data Structure Types - type LineArrayType is array (natural range <>) of line ; - type LineArrayPtrType is access LineArrayType ; - - type MessagePType is protected body - - variable MessageCount : integer := 0 ; - constant INITIAL_ITEM_COUNT : integer := 16 ; - variable MaxMessageCount : integer := 0 ; - variable MessagePtr : LineArrayPtrType ; - - ------------------------------------------------------------ - procedure Set (MessageIn : String) is - ------------------------------------------------------------ - variable NamePtr : line ; - variable OldMaxMessageCount : integer ; - variable OldMessagePtr : LineArrayPtrType ; - begin - MessageCount := MessageCount + 1 ; - if MessageCount > MaxMessageCount then - OldMaxMessageCount := MaxMessageCount ; - MaxMessageCount := MaxMessageCount + INITIAL_ITEM_COUNT ; - OldMessagePtr := MessagePtr ; - MessagePtr := new LineArrayType(1 to MaxMessageCount) ; - for i in 1 to OldMaxMessageCount loop - MessagePtr(i) := OldMessagePtr(i) ; - end loop ; - Deallocate( OldMessagePtr ) ; - end if ; - MessagePtr(MessageCount) := new string'(MessageIn) ; - end procedure Set ; - - ------------------------------------------------------------ - impure function Get (ItemNumber : integer) return string is - ------------------------------------------------------------ - begin - if MessageCount > 0 then - if ItemNumber >= 1 and ItemNumber <= MessageCount then - return MessagePtr(ItemNumber).all ; - else - Alert(OSVVM_ALERTLOG_ID, "%% MessagePkg.Get input value out of range", FAILURE) ; - return "" ; -- error if this happens - end if ; - else - Alert(OSVVM_ALERTLOG_ID, "%% MessagePkg.Get message is not set", FAILURE) ; - return "" ; -- error if this happens - end if ; - end function Get ; - - ------------------------------------------------------------ - impure function GetCount return integer is - ------------------------------------------------------------ - begin - return MessageCount ; - end function GetCount ; - - ------------------------------------------------------------ - impure function IsSet return boolean is - ------------------------------------------------------------ - begin - return MessageCount > 0 ; - end function IsSet ; - - ------------------------------------------------------------ - procedure Deallocate is -- clear message - ------------------------------------------------------------ - variable CurPtr : LineArrayPtrType ; - begin - for i in 1 to MessageCount loop - deallocate( MessagePtr(i) ) ; - end loop ; - MessageCount := 0 ; - MaxMessageCount := 0 ; - deallocate( MessagePtr ) ; - end procedure Deallocate ; - - ------------------------------------------------------------ - procedure Clear is -- clear - ------------------------------------------------------------ - begin - Deallocate ; - end procedure Clear ; - - end protected body MessagePType ; - +-- +-- File Name: MessagePkg.vhd +-- Design Unit Name: MessagePkg +-- Revision: STANDARD VERSION, revision 2015.01 +-- +-- Maintainer: Jim Lewis email: jim@synthworks.com +-- Contributor(s): +-- Jim Lewis SynthWorks +-- +-- +-- Package Defines +-- Data structure for multi-line name/message to be associated with a data structure. +-- +-- Developed for: +-- SynthWorks Design Inc. +-- VHDL Training Classes +-- 11898 SW 128th Ave. Tigard, Or 97223 +-- http://www.SynthWorks.com +-- +-- Latest standard version available at: +-- http://www.SynthWorks.com/downloads +-- +-- Revision History: +-- Date Version Description +-- 06/2010: 0.1 Initial revision +-- 07/2014: 2014.07 Moved specialization required by CoveragePkg to CoveragePkg +-- 07/2014: 2014.07a Removed initialized pointers which can lead to memory leaks. +-- 01/2015: 2015.01 Removed initialized parameter from Get +-- +-- +-- Copyright (c) 2010 - 2015 by SynthWorks Design Inc. All rights reserved. +-- +-- Verbatim copies of this source file may be used and +-- distributed without restriction. +-- +-- This source file is free software; you can redistribute it +-- and/or modify it under the terms of the ARTISTIC License +-- as published by The Perl Foundation; either version 2.0 of +-- the License, or (at your option) any later version. +-- +-- This source is distributed in the hope that it will be +-- useful, but WITHOUT ANY WARRANTY; without even the implied +-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +-- PURPOSE. See the Artistic License for details. +-- +-- You should have received a copy of the license with this source. +-- If not download it from, +-- http://www.perlfoundation.org/artistic_license_2_0 +-- +use work.OsvvmGlobalPkg.all ; +use work.AlertLogPkg.all ; + +library ieee ; +use ieee.std_logic_1164.all ; +use ieee.numeric_std.all ; +use ieee.math_real.all ; +use std.textio.all ; + +package MessagePkg is + + type MessagePType is protected + + procedure Set (MessageIn : String) ; + impure function Get (ItemNumber : integer) return string ; + impure function GetCount return integer ; + impure function IsSet return boolean ; + procedure Clear ; -- clear message + procedure Deallocate ; -- clear message + + end protected MessagePType ; + +end package MessagePkg ; + +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// + +package body MessagePkg is + + -- Local Data Structure Types + type LineArrayType is array (natural range <>) of line ; + type LineArrayPtrType is access LineArrayType ; + + type MessagePType is protected body + + variable MessageCount : integer := 0 ; + constant INITIAL_ITEM_COUNT : integer := 16 ; + variable MaxMessageCount : integer := 0 ; + variable MessagePtr : LineArrayPtrType ; + + ------------------------------------------------------------ + procedure Set (MessageIn : String) is + ------------------------------------------------------------ + variable NamePtr : line ; + variable OldMaxMessageCount : integer ; + variable OldMessagePtr : LineArrayPtrType ; + begin + MessageCount := MessageCount + 1 ; + if MessageCount > MaxMessageCount then + OldMaxMessageCount := MaxMessageCount ; + MaxMessageCount := MaxMessageCount + INITIAL_ITEM_COUNT ; + OldMessagePtr := MessagePtr ; + MessagePtr := new LineArrayType(1 to MaxMessageCount) ; + for i in 1 to OldMaxMessageCount loop + MessagePtr(i) := OldMessagePtr(i) ; + end loop ; + Deallocate( OldMessagePtr ) ; + end if ; + MessagePtr(MessageCount) := new string'(MessageIn) ; + end procedure Set ; + + ------------------------------------------------------------ + impure function Get (ItemNumber : integer) return string is + ------------------------------------------------------------ + begin + if MessageCount > 0 then + if ItemNumber >= 1 and ItemNumber <= MessageCount then + return MessagePtr(ItemNumber).all ; + else + Alert(OSVVM_ALERTLOG_ID, "OSVVM.MessagePkg.Get input value out of range", FAILURE) ; + return "" ; -- error if this happens + end if ; + else + Alert(OSVVM_ALERTLOG_ID, "OSVVM.MessagePkg.Get message is not set", FAILURE) ; + return "" ; -- error if this happens + end if ; + end function Get ; + + ------------------------------------------------------------ + impure function GetCount return integer is + ------------------------------------------------------------ + begin + return MessageCount ; + end function GetCount ; + + ------------------------------------------------------------ + impure function IsSet return boolean is + ------------------------------------------------------------ + begin + return MessageCount > 0 ; + end function IsSet ; + + ------------------------------------------------------------ + procedure Deallocate is -- clear message + ------------------------------------------------------------ + variable CurPtr : LineArrayPtrType ; + begin + for i in 1 to MessageCount loop + deallocate( MessagePtr(i) ) ; + end loop ; + MessageCount := 0 ; + MaxMessageCount := 0 ; + deallocate( MessagePtr ) ; + end procedure Deallocate ; + + ------------------------------------------------------------ + procedure Clear is -- clear + ------------------------------------------------------------ + begin + Deallocate ; + end procedure Clear ; + + end protected body MessagePType ; + end package body MessagePkg ; \ No newline at end of file From 86602d69d4c7b9546dac0f78f2331c78b1182877 Mon Sep 17 00:00:00 2001 From: JimLewis Date: Mon, 9 Apr 2018 16:44:56 -0700 Subject: [PATCH 7/8] minor formatting updates to alert --- TbUtilPkg.vhd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TbUtilPkg.vhd b/TbUtilPkg.vhd index 38dc949..041a70d 100644 --- a/TbUtilPkg.vhd +++ b/TbUtilPkg.vhd @@ -534,7 +534,8 @@ package body TbUtilPkg is iDelayVal := DelayVal - t_sim_resolution ; else iDelayVal := 0 sec ; - AlertIf(OSVVM_ALERTLOG_ID, DelayVal < 0 sec, "osvvm.TbUtilPkg.Toggle: Delay value < 0 ns") ; + AlertIf(OSVVM_ALERTLOG_ID, DelayVal < 0 sec, + "osvvm.TbUtilPkg.Toggle: Delay value < 0 ns", WARNING) ; end if ; Sig <= not Sig after iDelayVal ; end procedure Toggle ; From b69c77e516cef3d234cd1cca8571115c7fc2f21c Mon Sep 17 00:00:00 2001 From: JimLewis Date: Mon, 9 Apr 2018 22:10:31 -0700 Subject: [PATCH 8/8] 2018.04 Release - updated comments --- AlertLogPkg.vhd | 3 +- CoveragePkg.vhd | 6 ++- MessagePkg.vhd | 3 +- README.md | 88 ++++++++++++++++++------------------ ScoreboardGenericPkg.vhd | 3 +- TbUtilPkg.vhd | 4 +- doc/osvvm_release_notes.pdf | Bin 712427 -> 715107 bytes 7 files changed, 58 insertions(+), 49 deletions(-) diff --git a/AlertLogPkg.vhd b/AlertLogPkg.vhd index 4f941bb..7b55a73 100644 --- a/AlertLogPkg.vhd +++ b/AlertLogPkg.vhd @@ -35,9 +35,10 @@ -- 05/2017 2017.05 AffirmIfEqual, AffirmIfDiff, -- GetAffirmCount (deprecates GetAffirmCheckCount), IncAffirmCount (deprecates IncAffirmCheckCount), -- IsAlertEnabled (alias), IsLogEnabled (alias) +-- 04/2018 2018.04 Fix to PathTail. Prep to change AlertLogIDType to a type. -- -- --- Copyright (c) 2015 - 2017 by SynthWorks Design Inc. All rights reserved. +-- Copyright (c) 2015 - 2018 by SynthWorks Design Inc. All rights reserved. -- -- Verbatim copies of this source file may be used and -- distributed without restriction. diff --git a/CoveragePkg.vhd b/CoveragePkg.vhd index f029ba0..545d8b0 100644 --- a/CoveragePkg.vhd +++ b/CoveragePkg.vhd @@ -48,7 +48,9 @@ -- 11/2016 2016.11 Added VendorCovApiPkg and calls to bind it in. -- 05/2017 2017.05 Updated WriteBin name printing -- ClearCov (deprecates SetCovZero) --- 03/2018 2018.03 Updated PercentCov calculation so AtLeast of <= 0 is correct +-- 04/2018 2018.04 Updated PercentCov calculation so AtLeast of <= 0 is correct +-- String' Fix for GHDL +-- Removed Deprecated procedure Increment - see TbUtilPkg as it moved there -- -- -- Development Notes: @@ -60,7 +62,7 @@ -- composites with unconstrained elements -- -- --- Copyright (c) 2010 - 2017 by SynthWorks Design Inc. All rights reserved. +-- Copyright (c) 2010 - 2018 by SynthWorks Design Inc. All rights reserved. -- -- Verbatim copies of this source file may be used and -- distributed without restriction. diff --git a/MessagePkg.vhd b/MessagePkg.vhd index fc426b8..74dfb2f 100644 --- a/MessagePkg.vhd +++ b/MessagePkg.vhd @@ -26,9 +26,10 @@ -- 07/2014: 2014.07 Moved specialization required by CoveragePkg to CoveragePkg -- 07/2014: 2014.07a Removed initialized pointers which can lead to memory leaks. -- 01/2015: 2015.01 Removed initialized parameter from Get +-- 04/2018: 2018.04 Minor updates to alert message -- -- --- Copyright (c) 2010 - 2015 by SynthWorks Design Inc. All rights reserved. +-- Copyright (c) 2010 - 2018 by SynthWorks Design Inc. All rights reserved. -- -- Verbatim copies of this source file may be used and -- distributed without restriction. diff --git a/README.md b/README.md index 98cd5f8..b5c7fe6 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,45 @@ -*"Open Source VHDL Verification Methodology" (OSVVM) Repository* - -[![https://gitter.im/OSVVM/Lobby](https://badges.gitter.im/OSVVM/Lobby.svg)](https://gitter.im/OSVVM/Lobby) -![Latest tag](https://img.shields.io/github/tag/JimLewis/OSVVM.svg?style=flat) -[![Artistic License 2.0](https://img.shields.io/github/license/JimLewis/OSVVM.svg?style=flat)](LICENSE.md) - ------- -[**Open Source VHDL Verification Methodology (OSVVM)**][osvvm] is an intelligent testbench methodology that allows mixing of “Intelligent Coverage” (coverage driven randomization) with directed, algorithmic, file based, and constrained random test approaches. The methodology can be adopted in part or in whole as needed. With OSVVM you can add advanced verification methodologies to your current testbench without having to learn a new language or throw out your existing testbench or testbench models. - -**Source:** [http://www.osvvm.org/][osvvm] -**OSVVM Blog:** [http://www.synthworks.com/blog/osvvm/][osvvm-blog] -**License:** [Artistic License 2.0][PAL2.0] -**Copyright:** Copyright © 2006-2016 by [SynthWorks Design Inc.](http://www.synthworks.com/) - -## Release History - For current release information see [osvvm_release_notes.pdf](doc/osvvm_release_notes.pdf) - - The following has a bad habit of falling behind the current release: - - Nov-2016 - **2016.11** Added VendorCovApiPkg, ScoreboardGenericPkg, TbUtilPkg, ResolutionPkg - - Jan-2016 - **2016.01** Fix limit of 32 AlertLogIDs, Updates for GHDL (Purity and L.all(L'left)), - - Jul-2015 - **2015.06** Addition of MemoryPkg - - Mar-2015 - **2015.03** Bug fixes to AlertLogPkg (primarily ClearAlerts, but also matching names) - - Jan-2015 **2015.01** Not here. Addition of AlertLogPkg, TranscriptPkg,OsvvmContext, and OsvvmGlobalPkg. - - Dec-2014 - **2014.07a** Fixed memory leak in CoveragePkg.Deallocate. Replaced initialized pointers with initialization functions - - Jul-2014 - **2014.07** Not here. Added names to coverage bins. Added option during WriteBin so that a bin prints PASSED if its count is greater than the coverage goal, otherwise FAILED. - - Jan-2014 - **2014.01** RandomPkg: RandTime, RandIntV, RandRealV, RandTimeV. CoveragePkg: Support merging of coverage bins. - - May-2013 - **2013.05** RandomPkg: Big Vector Randomization. - - ------- - -*Starting with 2016.01, this repository was handed off to Jim Lewis (OSVVM Developer) and became the GIT site for OSVVM* -*Releases prior to 2016.01 were uploaded by Patrick Lehmann* - - [osvvm]: http://www.osvvm.org/ - [osvvm-blog]: http://www.synthworks.com/blog/osvvm/ - [aldec]: http://www.aldec.com/ - [PAL2.0]: http://www.perlfoundation.org/artistic_license_2_0 - - - - - +*"Open Source VHDL Verification Methodology" (OSVVM) Repository* + +[![https://gitter.im/OSVVM/Lobby](https://badges.gitter.im/OSVVM/Lobby.svg)](https://gitter.im/OSVVM/Lobby) +![Latest tag](https://img.shields.io/github/tag/JimLewis/OSVVM.svg?style=flat) +[![Artistic License 2.0](https://img.shields.io/github/license/JimLewis/OSVVM.svg?style=flat)](LICENSE.md) + +------ +[**Open Source VHDL Verification Methodology (OSVVM)**][osvvm] is an intelligent testbench methodology that allows mixing of “Intelligent Coverage” (coverage driven randomization) with directed, algorithmic, file based, and constrained random test approaches. The methodology can be adopted in part or in whole as needed. With OSVVM you can add advanced verification methodologies to your current testbench without having to learn a new language or throw out your existing testbench or testbench models. + +**Source:** [http://www.osvvm.org/][osvvm] +**OSVVM Blog:** [http://www.synthworks.com/blog/osvvm/][osvvm-blog] +**License:** [Artistic License 2.0][PAL2.0] +**Copyright:** Copyright © 2006-2016 by [SynthWorks Design Inc.](http://www.synthworks.com/) + +## Release History + For current release information see [osvvm_release_notes.pdf](doc/osvvm_release_notes.pdf) + + The following has a bad habit of falling behind the current release: + - Apr-2018 - **2018.04** Minor updates to AlertLogPkg, CoveragePkg, ScoreboardGenericPkg, TbUtilPkg, MessagePkg + - May-2017 - **2017.05** Minor additions to AlertLogPkg, CoveragePkg, and ScoreboardGenericPkg + - Nov-2016 - **2016.11** Added VendorCovApiPkg, ScoreboardGenericPkg, TbUtilPkg, ResolutionPkg + - Jan-2016 - **2016.01** Fix limit of 32 AlertLogIDs, Updates for GHDL (Purity and L.all(L'left)), + - Jul-2015 - **2015.06** Addition of MemoryPkg + - Mar-2015 - **2015.03** Bug fixes to AlertLogPkg (primarily ClearAlerts, but also matching names) + - Jan-2015 - **2015.01** Not here. Addition of AlertLogPkg, TranscriptPkg,OsvvmContext, and OsvvmGlobalPkg. + - Dec-2014 - **2014.07a** Fixed memory leak in CoveragePkg.Deallocate. Replaced initialized pointers with initialization functions + - Jul-2014 - **2014.07** Not here. Added names to coverage bins. Added option during WriteBin so that a bin prints PASSED if its count is greater than the coverage goal, otherwise FAILED. + - Jan-2014 - **2014.01** RandomPkg: RandTime, RandIntV, RandRealV, RandTimeV. CoveragePkg: Support merging of coverage bins. + - May-2013 - **2013.05** RandomPkg: Big Vector Randomization. + + +------ + +*Starting with 2016.01, this repository was handed off to Jim Lewis (OSVVM Developer) and became the GIT site for OSVVM* +*Releases prior to 2016.01 were uploaded by Patrick Lehmann* + + [osvvm]: http://www.osvvm.org/ + [osvvm-blog]: http://www.synthworks.com/blog/osvvm/ + [aldec]: http://www.aldec.com/ + [PAL2.0]: http://www.perlfoundation.org/artistic_license_2_0 + + + + + diff --git a/ScoreboardGenericPkg.vhd b/ScoreboardGenericPkg.vhd index d840211..82773a1 100644 --- a/ScoreboardGenericPkg.vhd +++ b/ScoreboardGenericPkg.vhd @@ -39,9 +39,10 @@ -- Deallocate, Initialized, Function SetName -- 11/2016 2016.11 Released as part of OSVVM -- 05/2017 2017.05 First print Actual then only print Expected if mis-match +-- 04/2018 2018.04 Made Pop Functions Visible. Prep for AlertLogIDType being a type. -- -- --- Copyright (c) 2006 - 2016 by SynthWorks Design Inc. All rights reserved. +-- Copyright (c) 2006 - 2018 by SynthWorks Design Inc. All rights reserved. -- -- Verbatim copies of this source file may be used and -- distributed without restriction. diff --git a/TbUtilPkg.vhd b/TbUtilPkg.vhd index 041a70d..e3ac155 100644 --- a/TbUtilPkg.vhd +++ b/TbUtilPkg.vhd @@ -22,9 +22,11 @@ -- 10/2013 2013.10 Split out Text Utilities -- 11/2016 2016.11 First Public Release Version -- Updated naming for consistency. +-- 04/2018 2018.04 Added RequestTransaction, WaitForTransaction, Toggle, WaitForToggle for bit. +-- Added Increment and WaitForToggle for integer. -- -- --- Copyright (c) 1999 - 2016 by SynthWorks Design Inc. All rights reserved. +-- Copyright (c) 1999 - 2018 by SynthWorks Design Inc. All rights reserved. -- -- Verbatim copies of this source file may be used and -- distributed without restriction. diff --git a/doc/osvvm_release_notes.pdf b/doc/osvvm_release_notes.pdf index b9105fc5c96a549ba923b4e50bdb95535c5003a1..9a745b5b5a7bd1be91a10acb350db9ef93f7a92b 100644 GIT binary patch delta 691785 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

pe*(UC~S|kAL5|C z8u>P(8N1hcw3NX}>0nBSqa_>DAoMO57W)(6j#9{Si_}HJf|!KVf}D`y8)VoaPwcX? zUFczGZZ&#^~Y2YQ{v zHbQH6;?DbE-<(H!sv-;goFCxhdy=f4HV}U{RyNIgnj^u{gUNrx#?x5XE~PXatMD8454M~AqsNmw zng@R6-s~1o-%RlPdO995qlF1;?=d^-D6vw8Ali`ZS_{8OA@BEF0GBfD0H zRqTILb`Wd6h%KV~=@3E-*2G8tBjU~Sj46#rNf2o{n&@Yzb3Z$k>+SQ3&n38%IB8T6 zevci0iQUDXW)Jav(8+{Bt(^P9HSVBZ$XS5e4*;5$*PBxf54jMiUa{UHsf?qXG^6O$)=Pk5=1>qxKi91fFKf@xv z34Q;O`jGyKnxWXiZ=v<4gWH^tSQmlAom2x2xE!+=CxgOo?GG6uf*Wy*)E)g(FZO>( z@-0$cXFpk)yNH)cUf2r{y;HpBlsncWt@zwbuwa&UJo(c-5r#`?2;8&0(eSwWs4NS^+E<=B)A8;tu z0GlKZquSH~=)eBJ5mW~pNdthRfM0-K2LeaaAmA9_=X5O91IJ1{js^qAQDf>e=mLQg zC<#2Ch5#o5{|0&=3Y;u)3Jp(vik%+`Y?jzUqkz-snA9hrQGqjPG_Y0T2{b0PA5!dC zU>l7E&Z6T|A49v1ONlpS0#ARW@xZw>A+--)sK9x2JaE3mlW9`wuXGAc2A(Q$0ZmDL z1WuX?JYC{KY6dO>eh7|g0iHqAflGiNK!42uo<*&|vn8HGC#2p7KeYkRqglZ7X*Tcz znv?nqT}USaFQU1?i-CWJwmb>AjOGC^k$5T1PrV1*RN!yu6yS0?6?lI+@Ljrs767lL z(|}h2-=P(BI&h`LRkRRzH7!d030BQw;A%PpxQ3PhuLb@QlIBd{^%8HOvr=zEcb^Ts zN#f0PF7OsQFZC8IV}ZBPg}}8EZ>Nh=Z_;n+V&EMT*U{3{8<1_60PmFeJGvBj7hRTm z9db+HJ@gyky%O)E<*9$yAmc9wK0sFhAEYZ&ufi6%3iy!3jkE&zFmNwqSV13fD7F}fDmLDvDd1NXr8xgNNKZcGV@c5~`wNV!{pPtvWx zof3D^ZK;=Fod|rI)&ifQ+kw03w~%$u(jCCx(>maDz!xB;*8_iFkoY3q34DoumwKLF zmbi!R2L6HW0lor!j`q^Mz*i-{M)#$DPp{Mcz&9kmNe=+uf~c`=^@~sB)&r% z;d#DG4+Gzm_-A?~^$h)mHUrRvkQQ$s_AJb#0r{H6C06&rV zDQ!>fqQB7&;AejlKc~lmUjTQ)`g#KRB|QoJO5)eFGxa3=on63h=_%mf>FLxHbWq}V z^bGKO+70{%@NxQqo(29$&jbG{@h5sAwF7!xU>Cgz?53Aeos^Q;Tc#VNOgH@hQl=OG zSEm10rvF!_|KE`5xBOS8|5v8}*G~U`NTv__AIkJG|CN8~|5Bze{;y2`ubuucWqRlT zt7JOK^BoZbnQzeVPJeTry-2F~%>txn1UW4*A9Aw-@~i=J=@@w?bu#$#Jka0+v{AXZ z@MU=}B-#~2l2)PJ5J;_KA#rAb%g^ZDF7?-64RcZ-rRE%3zwe%(eWU+ZKTJ!9e;B~I z_-f%%4a9#VroaAU6laQ78#$aVx5w+t^9O<<%$ca5FkVzlrHL}4%BntnQBvE#Zot5v zF@_BvF>=%~qsJUe$Bi35;rNL(dCJu0mTA*x(EseS^4~R3=zsP3|IBVBo0=z2N;VE| zs2?ZR8>}#mnBL|ii_ff1+n~SBpiPV2K;$GugC3jI_x&9CD&{+8uYpx ztwvQiqq5<#5p9w7cw4&~kBu5tF0NydVU_!();5J;P#=4mNENp1)#v+b|5b$!KVbHO)1Ym(eDJ5m_U0?Vi}8P0TZx$qe@lAGnE=&WuU5 z=f#E%Z}-K9i5avjg~Ml^*gk$j^YCH*XtbrgterK@iOp`O*wA)MLN=i$d7E}^Q+tlQ zP2^sM9`_nsUPmn&9W5oupPp}BW$RA5UB#z0?QIHGOE2;6!V7IDnP2=2z0w=}o2<+x=; zJc)R!^z+S)4HqSCr$pNIv7xc~D^6*{*5s{dr{m9yZqCa~ZilkZ8y;CPsW}#HZ}fl1 zT4oIkY;w|yBWlFS#*6&DU1)cPe8tSw8_C$Z8y|h%2NKO;>6muLbuWQQ7&hFqR#}-*5NU(e~ z9&0&HxtjhQg5IWl}jTV`#?OgiE!U0;9KQTeKb)=Tf zjzz4o72B1#5?`@scw2TyJ5qn0EB);wR<+} zIjMOwXS}IxXv?Mo)HQF1eoM+yE=onAxQK`g8pA;7o4HQ5_is-UEt9pXERff8IvB|^ zUABzToDQBYv!-tpmp4j6_0H)~(>2L#YZYa>blI|W>*7pn9crwirjvifPbp+&`Xi)9 z)1>C!^dOl`3Jlb=vsn8Dv2&xF(5d~5*m*LuqCEoHf>!Nw0xc_6L=a*af6kQVG-CPN z*>r*OpB!*gEyV&DyG023_GPm%z=|0wrp2O=Awi6iE{clF+(3&Q0sC-E0L(xzaVMpA zDZ4gLu1omqWfv_%d<5|oM3rU&mu5;73IiJvMd@l; zzh2ov?TEV&_acgtPLy<_q!T5bC}~tWh$)XLk8Umq1w2uRr`(QN-Hut^j#=G~S$zd$7O(GT$ikjhVc_ z%3c_jXc4F!uS|c0^%PbnD5GUMUKvh>NXOw?q{k`8$aJhSQl`hE+>3M!+S!qgR^;~? zm1A%{4CyFbi*%$iV)L+Y)sRKFo{2h+`-$>ln8Ps4X&4qsl&nTvkNCbUnF(Bq_zI#T zTQX%BLKDIeWe9pCF-8(KNm7&~LLPGwW`O+_1KN>>5!(KVsVT3oWyl#y36`mZ)*&jGatWqff=A6>g%LSOr-*hUzJmBZ zqFC@EEJhI)qX-XJg#Jacl~%U<3NeMKfQX7P{*i4ovUeDH9z?dx-k+h^rBIX6o`KG3QI-%*R;ym~ADnQRaUvz_60Pnd>bbSYI~KGNcjfJ`NF; z{A#S`)mXQyg(%^Ii7gTt)gs?)rgNEYL)E>B?v_b#R&NbQG^Hrc2o&rH`gGn zMz{vyYJ^n?E3rGyM-n>|d}htUnx!?XYu42~QnRxrX9u5!(8k-626DS$3)pSCydhSu z(hPqxvwuq5DDe!5Nr|3h-VF1;8Rq9_m~Wk7zHx@Rd4~D88Rii)%#}0D9c*^elQ6%V zFt16NrzFg^33E-tT%9nNB+Nr>tc6V_Gd(GBsKmY!^Cbq^)XiqnKhCC8R0j@VMO&kn zgg=gUsBClivS^16$))M5>FH#UD10ITbnOImJ0eIkB8@j#FpXS#`NOlg^;i>9jgk$91H0cBDQ?CWI&I)LKQNRRyXt zZx!FNluoPAflS9~G_^aFF?`I#p=?b1t~oSjcBK9LiLnl5fK{Q14Q1{2F*IheLyoufym`SkxrZE$n+aC=nS^ko#7S&yI;9io4f#8kn^9KH{y+~7Wwq zdM4E;bsBn2rZzf@F2oF$(H*phweSYMGj)~xdl7R{`WU^$5+Hx5HduJaqxEm-7TQiv z(kt{w`j|0hVa042d!49pR8;oKQ+j|@^CHI><+Bt3-mtIv3_hIOR~$^ zL;P%2=@RF)D!G5Kf}`Z>UrTGTruWbzw43(Qs~Gbe`R#Qdwth03!7gIU*){A2b`N`q zJ!$!kVEdL~501rt?xD}{e5I_6HL}-uf|n^w zHFb4&SEoj%mZqLfy-hJHLfZz|xx;BJO~tIwqswRq{T_dP_s}0`Km7x%q%Z@sV=W>q z#*Swb*;$yyM)no!;%@9;9bdpV^EZ@)vPYe&KHRmn+tt0f`>XC$YD20$^-Stzxxclz zPZM^al@@`)#ExyleV(O#^f&qr_t3I1<~oXv!SmjN@!w~MKu$V-F@K1sU=6QPUQm7N zE#1d;pVohUOZS#kztmXJmN+2xQ9p!%peFIX1Idodr?5^9op6RaW9@c$o_sZ_4 zy5H*lC}m9TOnnT~vR@F7t%tXuD4+4ycs;v_|HSU&LG~2x7KHybo;UG9u#I+r z%1RMl0D0Dq~%27ro4{rCK&udGe62tC+Jx2iPWM6m4QZsV}H6!1(?N zD;Wgk>R@nx2%27tyZoM_N*q*EM;d<)zYhG=241)E@7RTW0iDclQU1p6;X`N~%~h80 z5$vY!@6;hmHCC(>(xgc{Ku4N-O;GKJ9sh&|%io)lcE0+)=2DSYURMsLT2j&OnVQ`0 z_vn1A&L~K?mEfgO^bT{g6W9bb#mA_r)D+slA5q^+d6D3fCta}@)X9a($2wR*o zvI(H@6U5(pQdg?W)w9$Kp__h!)V!Roquc0dXp_64w~DZi$6_^SK=zz0-)Z!v8a&-# z8Vad&4C=C|?2%bpc%r{=b4&K?dAJ z_tLBULB0+?@0I*nel|au-l2bYl;@Nrn?i4>SE);BB7EWr%z-=i$1a7@Z&m7b+^vNC zkpBI^rJ(!N=c%_+_jkR5@$MDBuGJ2u&$UfdOyk)1Y97--zF`g3c^dH=D2GOD(<9 z(^k$%ql%0|2CW8}M-_$V>2pNcql|pIaTjI)-|Q^lf+RvXKY7ah*vUL&*-pD&_i^JLbW7tyG%b?3#y;W*o$ zPKoi>?nB_rPoS5^CyPo#RGWr59c49rf z%(q;uOzYULgZ0(})_s^xW4+BjU;q<b`E5GY5Y{+i4f?oG`nhIFIwz z`Ui_lxprU9=_j0UdXCSYYbv}y$-Z5}I6FRO^x6!j7rQ&|zNfq61(U(%Gv>3=-SDl- zyAScDnc0@;xjxUweR-;wvEHurxUCv3W@|8D(wMIW#KI{rcy}jksLXu77xUeR3Crmo zFfV@d@?o|wuu*s4!$!S`*?Nun z-H&3n)X8&H2VV+`%S)PQ7v`ejK6TCpK~npy`>As50o>UYtx+9^?&C|(Jr_^7C-o7` zxo_ZL2S6{Ibw>4%Mqln}+gXStC62|+(W_7{t2QR*Tg!hZ7u1cP&|kne?DPt%10cB)`S8gqUuH`-t?YtYy=8gpI)X!hkt`xG?f z`l{~iWLkeLdD-&xl&#-m){UT&16XVMfo80Wz_*Nxju%vRI$g>$oVzQONzHsouJ8rUb($v~A| zFIP7nsIC-qtm@<64%Yfhvdmx5Zpc9^!7>dkh8yT(*ks+Pn` zLkVY5s5oYF8U?}lKC>Ti|I^;(R*Qdi#ie%d(8&pj*~NYDvCP_Po?!b(Pex{j?3lh) zuQ!$8f=_vvy5u}{-EGffRHc; z8nNX2tOr|S?aB<_lOljMlmlFSo!CYikekYTz@E=hlH13t8v zEl#xbk4ky!c0u43^dHP?`hkkIIogcStxanRtu}{py7+Q0HsR14jJ{nwDg5vSr$6Y^ z>P=Rg=j83Pe)~~;`q|xo?3@%8dw14_`@dW`e_Zi`doOPF<`_KIs=H5kXT`u-OU~?m z?@sL7GpUbMtQCPAwk)V))B%54R^7L6jcs7TF$JRwo9fOW?b7JwbvLTl*W6ThPtCn` z+Z~;rmmDuS_julQ{Mqw`=#QihsKp;1vT*`bE@_vk=&L`@Ig}7y10(&7BhERA;)`EU3K4DY)d@7A=MsvB{wO{ zIq5x89A}>YUB`k?D=dE=tJS%7<8{x@dbBl^=ktwPeEn?~PQ9+oYBSorQ_s6?-OIE2 zhJM>--~7ppDy!Y(81&6T}(@$7a-_NP{Sc@Ab@BGcAo1n4Y5?luT9wb<+ zNi#HOgomPM}ux zy@u^5=-H0NV_|qLu7}mtRS$c|T7N)fzJxIWJ4~2jUG=sBnky<27g=|MVZb}zy-}Y{ zEq$sMvuF*gwq<`ccQ%s|Pt`VCj44Xj>+JPMMuhY7!XqShKQHjNW!+QR%vnm&p_j$l zb$^$YQEVoEzbgtl-!14ID_2H;N#+~<`ar(E#5d5ZDK9y;WM;|fCAXBk;Ct8mxmV{C zMC=ws>_EmJiRqlyNP#2rhMC)Q^%SsAiNghSHvHY|&$%=lqbo7-Ccf9%a z)^kojE*XFKT5XP-H($T&-es3v7BR!D8!aS=dR_P2aQH9Vp8uhyuz%ET_t~$0;l67& z4!3&Uyj+MONKiXgHxE)IMpf*=q^Tm`SsQc`dLwBN(gVEjo zaiwE1DtSd2luAiXqEzG2=9&xofJg4xR^Ff} zdVhZh`%BUtZg6Uf8uVuGhuQ`zwU$Oot4h_`K>Nfv@Ito72q6LM{_)Hl+GN^713 zJ4`B)QlNDNtz>8?mQOAxjH<(=!xkKO&)m!RK6&41Pt-OwR;_>Y!bx>rx6N!XX?Ui4 zr!Rij!bR)W&z&``o;#MD{{G!J{doDxjj!Et<;m;j=39JrkHOi!>67TIkKX>ss>^>K zn%Ey)`Fg5bc?(?WqGg-(iqPF!h^|tu)hhf+y~%8z=OU-eMJ|{aCXdl&BE`!1Jfp#8 zu^LpX$=C@_Wc>cE9=*@~MK7az-&ko5HA=w)x#N-CB$(-n+=@i5kU&SMZul8B(ey&p zAj7f(UAd&|ULi{qrTbx>JJ;^jstbSOk}cL<{?qe$Hm}uShZOzocboD0qIHSe%O7BO6>Z}?4V|XW z#2&+o3CDTto+$6*EQg`9IS>nVr2f3QDpt{%`ZHXRAGX?b#l;1pth6}4GxdK36{bGh zT$CRbR*^kXoYch{N=mfB28X7yL2Hh6us^{PD{))n4a$dk4UO(`Ztm`22a?9>NQ3pm zvIf1c?@`VONc5oapM@yeF9}u9sU*#+@;?5s&86x>_DGTfPROB(9C#8{8mQ5*4HC)k z0+j12lhg-p$6*&kDAu3*7u0{sS{KveCh=M=k@|ECd;~nmr(57Uh%{LR&q3qGmBx!4 z6FKIUWlmG0%ZuhNQRWh5E>U)b!_d;BzaazrXGNj(w);!94F>_V?dX+P94DXp!TR+d zoO;TP(t&T@bn_bnOU!qkb>^Mx&OT?I=b>fG9@@Bc=|;Y?`o6Xs-+6!M#+mo^s~Iq1 z_KH_tSuuP3z`re6d;2M~ufM)KXW`vK@|@c zbQWmiLP*BS0J&a(IXBd|pD7>E*Iiv!ROS+vm}PpOkL^Fk{$6^pLbH=tA0Z`0uMV;4 zZtVYO)EDbij$T^lwmyHm`@G&qJwazKpm?sS$XKi|g-?i_IgSFeYAGmbFldB4OByO6 z&jPknPukpCJhA*mb{w04|5vIp5XUWzr&)-daw(I*7qQdk10(J`x?_;hE4jb z8NpRlRFNN3UFKX!G`n%tqG-ye6l>dIonI}GV%57cO zT(R-v&1a9lsj`1D-|Dq_j1E@)N$DS7x_;}`S8Yiq6WC{YDxu6KGd#gQNxfyW+o;=2 zTKf*>hD=bIdz;bd^92qcQ`C>OrX2}!Siz1stZ@9=(ZyjYb=r|F(Rv$jkV0Ecd zh2$)})SR^K%H5m$N9zZ0p0(Nj>Ig`MdQgx7xwnNwcwE z?rRn|bHC#wZDy9#$RG#~3XKJ0?f|msbD$%pr$l>1C7)DSH*S1?z=Ro0*Zr}}XY)q1 zy{7tdcU8VU#^ zPP)yj&FjqkeKRwc*vw|DEoiXWV;wAyN^;(~f!?sLc@ zw|k1+?RMCMKD#YHAc{tXDZDJaCamlYvv7$&91i${`To4TveMF!KhNp+=hp6?~rgd@U!QH(J{zsRxcMcT1 zh>|j+%26%@%Q$LLc2tF;#1!R%u0JlmQ_z1!_wNM`VM~6HrycjP+lI*E=Y(sq{`ybD zAF?aD_helPSJT%rC^9fQu&}XoP-3`cq*bS{^hE+uf1$tBUm3HMCUoanA1`>WQW+6Brts{@ z<&hOtH%9J>Y>Vj1bZ`n2L_s&#X%dVDbybmEC03lu;aE=d$z1-!rRgmAHPEmCPL1FzkkNy0@?gCY(FC<&KrzuT4sC_qOwIn^}4L z36oaN7F*71V}Vopk6V7oJ?fMJ$#VybZ+)iTSC3UUQXRdYJh$A*Dyfmik)mM`^W)K-6uc8{)|?wMY5if4Y!^1!W?hUz|+h(Di^qRVxA`uB~* zLKgVwy0&OMo;T1RxAY13sqE9(NA2Sqa7C|87<)kI z>#i=b{PJ8mz4}sNXWl`01_<2^kxpaUjT6VT7fhH2D=Yw;)8-^$SO$MnUu<)`Jpr#f zW39CaV-1|1J*LXI4Moy55CKIbwQR=961uoTsj2B_M~U*sw6wK(xMs?kH_V!nj1Mge zFzeO@8^+sQc6Z|VJtt2;Vblp%^c`9eL#{8o;Tswbt!-Y(IVOad_CiQIaUJ#XC{jzr!Yz3fWuXv@V7EE>%6G58J9d@UkYompwhJp$fam6ZFp(Rnl^6lY@ z%u#?i&d;1K!sqMFAL2M%>|4%ZNhrBOSV={aGlC=^JvGxnnr`%%N} z$-J52h1#WB#b(S+*zG}Mejr>Eiv;YHETNMdiZV=B0^vJXj8QcR{i~kF&TjRuIptp?H5`h{%}7jk^4}CBVK4qyjuJ zM2VB0jn}W&@6~^x|5~rn*Tmx$RBkQjsx(Vz_%%KpsuINF z)MtO&3f%ebSXTBy_$_V~!p|n8S_RJtHBaVPJ}V2;hrzg1g&fRot|onOuU5A0oO#8b zYsOvm<*Juf<%rV+uifTh+E*_)bH{{QMjsw~>D2U2F<7crC)?b8OHJ+gHJh)xZ3WY; zSlGvD$qPLh_IZMn7tFn;_3T?;{XSC6`eT2Cz0Bhs>nn?>l2w*eS623|4wlsq6-8D{W4Mtw zCYl->hc*T4(>AP8o5+~3X#>{iF3H%hi9$J!rI-~b3W|#h3xbJ3HKM4A;Q1%|)zyF1 z^a~D(<%ftdy{~V)tSk|U=M}~iiL||1KWLBv#%y({pkJt$-{r9RwfTUDk1jt7H6Y738;h+d@R?23qbk+Bl@#L z@Qj$~IV6w%tmJ4@_p+|nrKsqBPjY=fVbuO8B?vEH6w333e-tJCW@g*?!i#uqcj!oS zR|=71+170SkULusn)?{W@83XkVR}1RUa3}SVy1{W;*7W|1C^n{nrc&(v&w(f7-$R~ zr)e@Jok`c2z_{SJkW2ic0F+~@m9IuYNnv>%sHH$4OhI2-4;wYL89nT^i|Zm+twZ1IY#}V8W`<+3iBTcMuP2MdQaP>;`GOq>ROxL*l~hLx=%Rjff#x5JiG8bb-XUw_)&0wh>xJrb-RCPFTKwG76hL7(*;@y3G47ky&5*>$Dn%kP}w*Ri_7b*}{yDXN;7ApjZ zc2n`Brf75+&^;%!cj^KuOefXkvJqVaFF)iGkx38-MS8=d7sib7N5~O>LI_22rS-_; zAaszDg_i_CCJf0NaAU&-f%dW^E$4%Q06IWb%bt&}f`&3ybpT@$KRb~ZBoc#sNj-;55+V79LUPHHoVO_A6~RmXh6$M9eDoJkp_?*c=uPS( z08NUpKa{6b)XR@aHlsuHI2UKwhpD2Uar8KpL+pCyG3HGw+;@|Y>v3<^Ae4)~8)=73 ztO#pYtTwaB^ajEdsoaGyndXv9?T{g2I@s~Y`NjLZLe_nP;I7&sZ2$DVpDWtle#D-yMT$66uq7!Y#%yKMK7tcs?&KR5Mq14h&!MgqfqM3;1-##ZU)uLD>Oj=2v zHng$WTj=A8NXdKR>-P49HEL#Z#z;99C1s<__&+%hS%3=dm|>_R+Mi+PALcIfn6Tgh z;676q)W|nn0C>R1R95t6M`AdIs7W@@l+#y#Ege}`$v7i^sZKD zbOAcq%zLA2yL0a3<-| zr))vffYwIU8Q?y(pPacg`7{|lS>^gHYga7SJbPF3i2Htx?bdqb%D3k|Q=ER5x?}rT z1=Meyv}}2|KdWZjwivZowRkl=t8X)pGoRnO>V&!F6fVtfv-Egnm^8Sw=$I{FI{Q@W zsToo@BDd=2zonKrsZUTIy6gL_|ALjY&1IhplSio}gU#Hhp18Fcwc_NvZ{)lU*ThyE z&j)kZql43DG^5wwSW=xCU~MMQw`y=J0J^sQ7uMq53?eqyPf+zD#$4X8Hg(-R8(dP2cs!e)bGR5QS9F zW=OP(S5}ECkv@h$Q<$b3(T{_t-ichLbnB3wqz*je7|bV3O5zK6{j0rpDUwdH0T*W< zRNZZ7g;y!+lTvEl9*YNb*((o7>~Rc(!L*w2SoRCiT()tL6@^8E~P2tqH7yW2r{=#Jkr zY&`Eg+a8V|>Qj?&c9k!ZeG|fUK!JgL)^eT$;(7LZGi8zT1JbcDYd)Q>-uATWigD!0 zqYxRES{Vve#2boeI&u=)Y2MvT39vgc)At+xFv=d4^nJkS_8>NhL`q6ErGm<%Kv-!H z>uX&W_3E+7a~p)-=Z!1(G@)QZL9uVmBw@QwqPtNRkQ3n4zbPLm4af-r@?*m0>kI)Z2Vx83(xKW1gDmTriM@c8kdULmDTnUPr?UU4Jv>yTUZVtl=UB11tlFt ztmcZbOUvp(YQ2;!T0$EH#L0+O_>J*v?IihHLNP-Ofty00f~!K}LUrKHfPblyGdHlq za;CmUOXq*&Jt&a<5X(mU(Ee!(4+UrT^4G24^A+Cj+IgF9Tf+_+D0eG(UHvp8z*^8(4@)tq}59j?oejO0ctUesS{QQEI6AAgcPm95(?*Xw27MJl+XNL<`%=Sk;F zX9`+vI|+}};shO0+b%b$v_D`jdG0iw-H-a^A5DTl`9VR&ETy1{$&&MD5SpA=w|ach zc{lZM*0KggwB|m_(GJ(-^bDWv-$skw%463Yw;t0d>0 zvfAz%I-D|P0gto^qlI$&1kHCE*H*baIhl*?weN%BMhU7PVetjahljQ?qUC}~XvZ9l zx1nLcIdn@o@n^V5XtL*PK3Hzm=O_~D5zPY~3^k1IY1c-*RQ>pCsn)isO?~6)I`$b= zhQ_9<++5~EiSE^N;GbRnl9mCbajQ*lZlaf;&%foM)30owv`<^N??HjB&*))|3lwA# zM3(ruo!Zj)xmbqr0D^QEZtgqG;>9z2h)G#MtwB67_!l8~#4mOfb?70q3(6I(913+M zZFzZR>`2rE399rHnzx!Ptp~2h>+|lp;+_*LX3tJlBxZ{R@htN_m?@Y#{U|#0iF) zI}^rZe*k@hO=J;eF#j9PYa0|##D&G@dg9{3)Xi*r)tHSSZL_04K9D$&pOE?h#4mQ> zcNS=TEI*v0C)b(P75#r94&{v<3RofvsRhx+={41nBTQnoO1PVYgY|XoKxMRG*C1V7To9U+qcDK4mtw^1K6Ca0Pw z(I3hjd<^$68&M5^ME#!>Hc3EO-Ws4&d^n$uRKYNji9PiW1wFiVhjlL=FAkAB8!bPo z2Ez8;3UztB&k{B)r*L*%+h(@_*#NGqopFk)2FDNgpKpNyVGN! zzZ=U@Q=exdE#Y;MIPG8t^Luf<5q`*4ZXc-;s@6j=#5>H(VZn0vyM+y4zjEZu+dOig z>16V*cI`f87{+~8VyI4?f`waFLX#={P(2rAbJJN{Yw((DO2?J(GPuzS;6tyFdUAE- z`n(EsmJ{?}-j`{Dtr06Ya2J>Tbyy#1(3K(UImVY+B|-W|4R81JAA)9Z`E1{t!b8-k zZeKUT%r|*6Hk8`yBi;!pSQVP*A>ujAvf|-;;y&}3y3Z0jb~qN@$l66%{Y1ST-gDaX z%ENC9F5=zfN}BUSYU8C=(!HkQvhXvCIA!89xu?uRgl_ZgujqdREa-hwq;R^9Ls7BA zFS6>5fBKdmZ|t+`{FU9*4iQjhJHUy3v_J&YxZs(t=h~5&dVm2G-jxMb zM-+L8c@eHli@je;<+>c6pOm_Bx{Cfhp8Xv@pqC2VVm{sq$Gf&Q>HiSik|B|sqSBgc z+BxMIZ?d(}_zGODD>A>L_b!+$V{2EsPM>#yku&7eZ%jN^NnVm`O|JY6*}Ec#@FkvS z;D`5(&h#&R5K;gqCVMsVrLjXh70yUT^^bAlW#WraQ2uO zQlC{n3>dfR4mVkw(tcT}0-Re75vHkF#6Az?wSD148;vvj3Vwz_4EE>kpQ4_ehAO5w zvjsN1l=lmx588ZA^sllZ`o9Jvp?C@09IdRcXj|EXd=fx5<3)@I;c3nh$|l2Z!Bymu zQRX5AOi|k3av1Q24S7VSG}*a{g(>ERxz@j={e)MXpDqmJh5&j!-4n+3)<2s9x|tgm z^=M777xhr-pB4H9+6>W3deI+CvJ;0f=gqOj1jX0pXGhzvinZ@{UUFNnf+Jj2?{d~F z_Wpi1!&Lwqyvz4LJK$A)h)-~KPGpbGSU=y_=QRM+(*k$@dVbiN%>>$ z8fKV7Uf6vPrigp9!KT*P`{KSzLp`L#AFN&@x zG(2GQ<-xDHdAUOo!?sp*;q&2!YI9q@pQ?MW(7cFbdZ>*kZ>Zwyuh*PEUW$PB zXlUTW6r`SpkFVomA-?dMhEH0KJig=dVAMuBp5qT&I$Zn(A)`nCc8;4Z)G=f0tTqW- z2-g5kUH1j20oN`k#$(6`ykWPiWYx*Si8U>oskXAkMP$ioEscUqEmi)Kh)viQ;(ftT z$4D#P8$K}er1&7kkaq=Mu9e(7TMNM52%Ce)Eb3P{9@`K#pfHyt`0T{ojCnBIr3W;z zXE}Ai6^YxoaF=ok3On}|yI-8oGx;I)xepY_#I0UBhw39f33C`4>Eql<%q%FqTsv^S zxth@hjJ51_FuF~!6BK+3dQQdfYra>m(-{}{USjZH? zrw_WZBHg?pFC`Z~I3oA7-9RGl6}%lRK&1WC4OZg;nMZJ;(w&<(*6#H;8u{ymyfzx{ z>$MxGrD=D*e9?lR0)0-GIwL(LNpc;@+`s1P7u+&8K4qS}H7{2^7=lRgc&)lVA{@^5&BsZp6ZqK~NgX3lE$|H`XCg7%IfO<;uSj1X<({c zO0Pe%5vmmSfpmxk-9x>`pi{1pe>F9>CKB56`{Bw=2EjzQJs?zPqmkx4m7`ZZ;e8ud z$way%5ycmy6@SoiSgGf8KS{UUc9^7P=ly#4ZwTV*K%p5@QpxwOkH3ZCw~#n1xtCLD zbE6~K+-Jk}c$|u=?)ue659MqCaw14;a}U3^_a%Dt15?&&P-M@uEpA;D@4$6-nB#ML zAf&;I*{d-GXc%t1Zf&&9WC6WwT17bD!Db@Fi4GO7W+B1B!QGC8$)@A!PdA*UdeY6C zgV|WQ)kOYYjHMTP)N^9e;I*o!CHveS4v8v-%VIYXgi+r7;$r zJl$0R-QbTY-KMYj9umuBz11#auti}$4_W(1Jf1=>HhQi9o{7td zOG!-1;xbbE8271A5Y=PhMEz@_bj38Au5|*#Ii$EI?nwBQ=p$R*CjOI9iIqjq-OkVj zIE)ZQi|q}(5I8spGZ+WwphTD&c83hit*EP(&N4Eh#wY|_V{j4CvMymAM@16_)XD2H zGKSYPG1k>}2GoV9!>Y$p=-4r0Jm^w+$-r9uJj8K1K>Z_e8RfX*9Y*afEjbn$n3y>5 zqneI@mw;CnH~tcxk(g`Bpn25<@mL=Ktd@C+w{pYsw>nNvZaT;r7^YK_*vw<6hcWJ~ zRrAL4Gq!qB;|ypVm~E{DKMDxmPgvvsqfoSZI7KbWrb3k!$G;f3HDg-|$l@-zE};X&31M(8A<; zC9hZZ8D1|)rfY}uLnw2pl%R+p3|iLXxZ_Lo9yjt{dwaE{&!A7oug@RVUZsw~O}g;g zmyAcJ;n5+yrb~x6Z&%^|IGIc~F@b>)d|`uJ=|8;1I_wB>IzwF)6V!Qi!SL`vaNw&2 z{XH)qM$%q&yfLQn!a?~{xyn@!XjydQz^r{Ua}~Y|B}>uGwE30LA}VE`UCF-fTmGT( zOfEcf*_J_btA^F!_LlLM_PdD)oo*`zk7;ZU5aofzJp3;zoS5lzm1XyGmo2#e!75{{ zgY+h$h!JlT6~iZG@hpmX2NQu(izeA|+zEAS&oO8X?8CxeYTZw2&6n#9(DbEC1^>xD zO<)SUhB?)>^N+-mD)o4r9`e^orhlS;^7W{E!pF(4m3$)Ee1hRBZ0!;$-W=|bRAkxQ zDvzrHXZA0)jj3~76S-%+YCNB=##Ae ztP4Uzj;kU6k9mTVNIOJa1S^UAn?}**Odi0cKvm-DSVuw~vI;pmASMnxCrQBGeHext zwXbq@oVpJKGdw5|MwQdf93jcV6PP=UBU({~!?@iDT^73`(l$~A01S*etN#XiKJmj6V{aW8SN7&T})Wt$Da9=t-9!;A}br_d>Z9H6dOxOJg69TGAA}L zXDnk$9mU*cl%({1Aw>TXXn!P~YM<{3Z+qs&O9blMbo^t%1+?gz4QvZdrHg8z4z)#W zN5bf*hLo#N$w%Y}AnnC|MX}3SH4ha33xl(q%)=rG0Rd(46 z@Xol}eK}bfQjeDR+c$J(HDR%Zi-A4vi@0^kTwdBPS1KY#Vo*@3<)os}%?u(|M{Mz_ z%49B3cerG{cNA%h$s%N|IK2ep_DAjDPM<7;pC7+^)?OGSMTX{dKWA$43ph61(y5-$ zd2Q0!H}ASZ!QAu2{(7ulIA4uu!G7yXY6Xl}t<)8~PGc z@sgaqx6Zd^+N*YewyzC2{+{mk{9_&hJmLXsG6i;$3c+&B6*A7rMYtZyKS}2 z7<%6bt6CLZj)dt9`zBgCs%e&ul?(lRV=9Mk_j4YT=ZD-;yQragc+U)75d7-km%J-P z8tj!GnOg+k+!4a(#YPw2T|?+}San44Kz*L*ML{uM%nu~wn+*fU_XevY!6Rl!pYxJw zf{S7x3@KS7I?Kt68ZLpzP;c5I)j^Jrc2M2OQ%#v^m3eGo&Cb4#NDMBx!a88uHX6gi z{=d0X5DSdDI=MVZ-{E2xbZdL0*m;8}^j-atD|#;V=l~zA-<~||R-D1?TiEGxV8i@^ zydv>;8>`M?(Rg}<@rbrXSfN(5@^U$`?#N1y!c>H*6z753{ z_b{~sKM4Q8iFUnTJzuroe8c5FixEY6E{V6}C<1@OnWQnM&$VGDiFqiaW=2F=SdjkD zzng#0uPAeh8^Aj#bdB6V%t|L9{gCRSd^~lBkbrH3E6=;L20{ZC2vRjMb7|&$37S5g zeYB7GW=M51j#mV`i7&}&dSL{7!ijq4D8y4>J@)c+1Jo2%)3shtnYno;)XN zpA>IVkZT{(VRRzr7_*{>`C0X8bG%OE!}bPTn$_`PdT;sAzL(Fk2Ix3jiUvkSH->Qa ziwQ@4#XVPD6i)_IJe{_}wnll3JEz-7rZF_8R55-Iaa%I9`so{pWVFBgiAfGc&E7d$wZ%ZR^j9?B^uIusu| zf}jSA7Yl!%#YM-*#!8mVE~+tmX_!#szYyTajt3zM$Yl{};dOQ&#}MZoBPsrr%0h_F z)px{u=Dg4Ma_hZ;#5K($ONM@8htXc(hRo46%_O4P{SBr(0!%pMg2CA5f+dg7R$%YI zj6V>k2V%nnr5dF|(LNy%zPHB5-kZQN9Q@I^mP;ch87l9_?5UPl<-MR0w>_k3PCi62 z+xRdycxD=lHhsbpA;Xq_#mHmKY3#m^FM6_a{qvF-)aE|q{D(mKy=Pfn6IyU)nJ^fU7T%_n5K7=TVd;t3INAkmDrjq;(@1gjr} zjDa_d0R5fE)I#A+dqaT2bz9k?+O{(;Y{IsNQ^8ffwalv>L@!f@E zIr~m^UkqjqB4phHEdTly#oa zZbx3Qs|sv3!ETO^Y%04APx0b2)k_;UMc^kptB_Z|U-Kc`HT$1TAg|6!UhnCQh#e+7 zf81lU6I=<+fq@;pS(WulP26NTDoOzN{n8aZfZel`?;GJQ)Fvb|<*`n{H2W*nxE@B= z2f&?dgl(QaJkr3zhINP$EV^_}=Sv>avFD#eWY2;4@vdxB%%@ElFCv-ZUJApfaer3H zY7!2vJ1`du%ksptCi|5Bi|HnS*$!PS3AQ0FZtUOF%N}fUOo4K}0!}@SeeY-7C0xkn zRn0p2Y`K<+LNYf`b}>BC{vCE^!>nD66X0>W6t^T++2Mj`L+pxql=8v)*TAaQroPhv z$$EN5Odt=jM2yG7$@ZuZ{#JRdnD}60cjRLnS3LdI&F5@qj?8SOE8dZ?avD`Z^&8oC z*=Cb3J2IX8#pE%@+!a)&|9Z=UcikXsK*|qq=mayrf)tdCs+EVQPZa&!xND-D3Rq1; zc3|q>e60_ay`nhI`iZkky+L_=IVF}k&AIL5%H^`&qO)<1U5(_t8z*S&&X__-96}~? z@T+y#D5!QI2rnDX1;KkfxLB2(K zj=C@Zc^))8SK()5p?avkChPhiqrI^ZM?%y5wN+Fxv2OJ9@VyyEBh6Qodl!q33->Tw zsl)B9)=l7FHJ;q2`D{lTT>isVj>bFsuY3A8a$ME@RW?lnt(%&E`xOw50GB>LXO{B) zSk*}TO@Zb#J7Bs~@E4oAlr$tmIYCIaZ1n6O@=f0xM}UieOSaaA&T|ZpES6I8l~N!( z@n4;O^od(yg2~fZBR-{a+^E+$!_b;Q|?W4$%rI-GYin)!d-IXv_*?Sls8AUh z0H^Qbi-k35*Amz-m)*FgG(RF6uxalR+xU?#GXb%z@#YMJ0XNCwb3mz8mhn~{=+mW`H@!pT{UZzrzn zs+-lFqi<|`HPX^j(9lp2H_yD9$!rs&UE@*^)R_^Qr)=~9xMzsw2eX&XbNJe_SZVTe zZ-}JXf8VxLO0Z5Gul{A8i)CxX9|SV>%>byKn6UgwXi7&*g;-Q#0H| zl0ambMzFmg^O^<&;qNuem=tOC^*#TDdwB=^L^rsVnu@IXFZy(Y0+u0tth7NNWe4ov zs+~-RfheR)2;ljK)_i0USN8F8vg5KxcW%^1ya z1k*85ou9D(Z0!9*fI@yE{&slv<%ZF@3&1*>Q94|39?^>8jrgO!q4c=iRp(D9_*N2z zK5Ub}OvX8JwQ@z5s`ydzUV2sR5Ptr}J!I2FHh13MJiNa91!+B0UZ~*APotCzzq08L zya_&EY8DrCeW5RX=G8Tmax~Vo;FR}sSS*kRQoh7O>Z<+bt0tJ>-Qu0nk~^=Ix|Hg)y0Gey)5xy9zQ?`$TC%zm4Neo2 z3m1~MZ)2pmirtQs2wY>dS(0wwLmw0e6g_8%!taJEqH`IvIv5yq?Go8+cl4irG17pg zWFzNMH9zd!;&3O69NSWsLsH5A+WBS+6K8`Xfqw`1*IJt(U1Kx0Ft7Vj^xz zA~N2wOw|1v6VoAkH4*KU75F9Tf`GNFAk%K}q+}Sas1dZ$my&WK(ex!m&~fTFfSjGe z$!@pPql^?*8oH}#Bs-X460v>p%hhr)OkXrS+k zFJ^6CyuWpkU2AZ38H0a)&9bziDn*$z<*&BRHO$n_)Q(}WrcW(REH|NR7NDM6zh8u^ zu9ayN>X@jLRMs`EX%SKXLEsC? z6edvI9CyEJ%D?*3iq9C>iaF_Sz#i>f}wO&?kYR{^i z&E@G+G#9+~Z=Y9svvJqiMMQ0YE#nDElmZs1!=Is(vb9|kt#i(zzP^Cq>4u*6) z^}Z-rUg*P`5Oom9lb>&F)r;0mTgHs$B=b!`K@c@T`G~=H##>Q%Ss8{>O4Z1u-KF@` zWK|R$j@1In8+cv-m1gwx^WgCN-D~OWD#p%C12Rv5s4CNGs+A&2-40gJj^fJCO-#_=EKF8n}hPxBu zGBa!Aa=T4nr!cXnORjR$Zmv@_0wB#Cl3?6gH9*~r=AL8;l%OQH4olBwm7>MHXU~no5(Dt9-bZhiH?<< z6}dyFEK50;3|?E;k8~(AL^rZZIn8Wtn#0-!2{58Rb2)s)+v&GU&mOS6_J?hbI;~aO zYE@LrN#|oO|JU*hs|uJo^4#8`G9Q?0K z7zwxCdNu-_AQuV~xSyj)Sc1bwU$ElEgq^Ub0^--k4YUQHZLw{U1gHN9xIO~L@e+(9 z`i#gWl!|g^_!<0~;!OOI8lsvEh5s4a@H1({p2DUQ!CplY%Gi$GsGL?&JYo<-mkj7zliwO(mE{Jij!+48F3Q7G8NsDhAK^gOdWxI4p$TBE2Y4I)G4JtV z)~VxhibG?>fW5_R=~pa|L-KwvNu1AnQXbMo?cL;9(L+s#HlYLj%+~2m5Dv;jrbc6N z(PI$Jk@jW5c$XtPCi{=i>BVp~{&QiJT_#LkL3p?u++%oD0xo~rw*Y+2oC{=$wN~x;Cbl*3UHTnv z4YUWcR6|y~X&k?wONoY=g-e&wDvAMkO#8%S{OqF~YQ0D^sf8@ooJ6)I(`S+m9G3YpuC8R>Sf3(jY z&Bk1AIzZ^v;BF(5Q`>tqi?U8_Q>+YG$6BFwjw;AhHCLq(wxZE*7ACRZkrCRN14HG) zyq=S>vk;QGK;Y03OOwjf3R9W4I2S;uS+9VXS!pK`pnXoV#EX_@nQJV=);2eKvl3)n z(_EU~CB~`ZY>2Cfel?dkvsW%Bh;lH;J@~mH1*na8G-Yo}Dl|4PYc@b~pqfv*rD1dx zk|gK9Cn;c(3*r7wJQ5XG8lu2wabb^ODMjs2YolXp|50!^#{`4b8lH315Hhhb=1!$3 zU%bQuZ_=uPBJw6(rT&F304@4O0H7-FexBWO4`X}4R}5A z0FffGLW?VIL(LG2OUq?#oRE@wIcMT7*{@|FX1T73GL2CwxLP@6Pnkvr4N8LU$`SR_ zN_bpO26%KzxN!=5t4@9!Xw9}=K1(z`?_Y9ERTNLm4cmUMjgPmDiM$U}!hQ_K51<(i zm^qbx?mD4?^zDU_@?42aT>X@lRlQ9MKq=E=-i~_k8lnlz{33##7>&iRCW4%0ZmHBSuA`G=%aU0G@YUfLJPVFr3E`tJ&jLunmxXiJ28POsOwpBzVl6F4|2wZq|u z)q}V{OgnbHE8JNUSNu_r_i(HC(jZOKbiWoLkHaEX6T9RZ^DE_t%0w@p2ah+-0I5iG zt(xac^1?~=wmgxs2`tY1?|j7HsoO*GgdJM4;RLMU{}39|6n@MY73L%xX)v{d;xvJY z#3Kv}o!NmzEa1nvwXt@HQx1|CNxtLwys$Rf3~>xohWi8nM&e)=4WUwPG$FYS;Zemv z9T~qRMWBc!?~^b{fwVt+{%{TopnOIZP>lTDDV&Lvl&mVyhJ9hMt(v4C<(Dkut4@;0 zr`pN&YmBz{PW@fub5J}5d|jiW$r<@BG-+at+7~s+FtSkAzXtS9X5dZCAUkO(*#Iwm zw`(qi&>EziL*}wPKIYb}&NCzm!Ag%pyR#EBh#Nhk^7K#-BoJlBQS}QQXc^Bk^^kNx zPRhu?^;i;HT33vGe3HZ{1-*dXr`#7Hm_hn)=!b_|n7W0OiMWNg2OIeH^O52ko8%z) zNULKcMZSV>EhRRU>vD0l3CUAFP^l!37(u^GesMdH6NsGuKv@YdUaTnQAug5pwz3l3 zM1sF~XW}eOL1GWYbIzdwcR>!`$ajH_R)#f4Qb{mvuh1M!MmO@UWnHpaGjkhrwH1xB zwB{C8HWuYq=H?c%31TcPqe-y$XIyKCV{K1uO@l6t7Inl?mE{)YT7)UhODt-&W|HM8 zjnrqc>6%9@6LH544YXE9(<2oxk<=V<;6mPxCN4@=o!m`r9&JQQ9WaZ|?(TKlR=W7RW zOEK}3tqlgUI!<0XSsS`)WXm)qrR9~C7^d@+>-vX}Q<{oBn4_ua4szQuifwwp)2cXH7kwySanJa^|V?OMRMYjIC9bnTx3j ztkg=Apd6H>vL%@7pgJWuhl{ZDNjbU<4*ASP&JO5aIyUDFb6^7Lj@8fHfW&x=%EK&ZZ>pvyqkTYNm3zYuoP z=`ZRcV;WRLS7EC~TE<3f9*mT@EBUTtrHW{6u1D5}>hjj?5`D;RS2O67drbxR0ly>I z!kj|0FRU`41-78MURTgsTG-Y^_gsde+UqOerkO+86Tzt|@XP94olPU_t*vOO3mbgW zT(`*73=9+;6gb1O#LStrh#x30v6WI%8b@3*PFmz`Eo#GATbsj9Tal_Z5` zQCSzL=Cb*6=?T@)h?i`vK{WON49_^zSWl&mBVwQ=BpfSe~8{r>vb+10Td z9;&w7KwSmR@S+czHm2{D8sGRN8SYu$*@fw;qO>gLR4&B1HdJPJ{hxuQF9GPG3i78T zjQ$&IlX#Z8t~QH_vPqmaqe4{)b+)#mx-vOg)Zd@C#M#`11(w#Y1(X<$%F&eNe@RmS zwDJ70qS1Y+v0vVfvkT#4d0|M0cap8ff+7|Y2n9)rD2cL^)D&1mF~P@UV+OhuAToi1 zU(w0&hnV<^g<{yMBB&m>qCrFB^jG-h@ zQjL+J3OokMTWd&YIFKwTGUt|5P{LXQLCme@jKT+DMq)|HhAR1_0_Rk<-r$EQ^ORCU zk(Keo$tkF)0(&Qf=Bp*Mg(8yw7%%>F3M5E>9Cu5g@`sRjl@8@4NlcZr*i5VuNCmv} zcK`tu2@i~OQ2`GP6%t|Znenl*oqQ!pQqR<5D`XKo;Gs|gu3iZZB*|Xr<_1he8FRWCf@tq^RHDNL4|g z&tzrgDViqP>Dyy`Lwx;wkT=NPG20F%+3#b#Y^`9jl^r}Cb<3aIt;>~>TS=c+ zRPUQ=PwmwgZqLm}YEK>SS00c+i<8Or`&id=lK1s@i?`j(tG-y}xb)GijsA8j8huk}5xp$ckInijF)eGncAn5-@nmD%&7bPiz)}Nf^5Sv}fkl zK-@L766A2_RoS*fw9I*18`|<;+Yg6O(Q^%=+)3YEd+hf0AU|muuGyQT<*!t2p?6y= zH&k=3cdtO+bgy)CuJ^AX--b6da=s_L!5_Z&Spx3}t4X-4_g(lyZVmX)J&0xy?MSfg z_BUe@2gL*=nekvB{^NxNPICV+Y~b|Agd{3{aptJq@cBL@eNg78-5>jYQ31FowEy5? z@_wJ4xLKK9s1Fy^4fs&I{9HjlbBMr8L_!hs{BZFHKyc`YK{JU9z%mJ7AUKsqAUs23 z!5-vyDRabr`s9c~k?_YL4T0%UCW7eDCW7e@Nc&+H|8nxnB4Y*tI{91RuBv{kf^=%W zK+V9L$NyX;wt_&^-A58bpo~TxM%1N77zW|d&G_k@qz?W->_9m)Kj4{zH6Yp-c0c$U zJ4eh4(#fy=pL2Z+`U%M%;z+%+_AiR@fkl2jx~>0C*}|K_I(0j+=Gd&ViIvw&FNr&z zC@!J-@#eaIJdCfY0lvI>-e4!&<}sk3MNc$2+e=@lC;Myj{NDoaVmW+sUvx9s=HH+X z9G4t9-({avGkTT=#*N={@31q+jXL~p=enfI&*4{cfy>?%-2w8S5T81M%XW<7ftb<| zWV^5k5IX?`tFgZx`1|#9m|!&mnT)YS!F2S=10M+c(Q}3|0bjmgL?Mb9B$z{fHFQef zt~Gm>nWW$_el?6D5S~qRp%R8AbSd|IYixMuQU}o8NRuJe95hTcLC^GB*b`SHt{I#m zF~2R74R8-!CSC}N_9!|2u>{eb_*)7nW5sx4=w0G+WAHW7Ah63se#ZiG3M9q40_vRl zLNi|mw!L|-ih+E$U*mUnv{h^h z_R|es%xDi8bS)xQEfORYnJl6JVOT_q1ajoye~3bc1Ti7*64>fjKjMFWX)#u;DUR}| z5a&VRY6v}x*u*w$YeY{t)a3-!^AG_CM}F%s)oG0f%pmZF z1}z2|25q?rE#vO}KFw$a%HOO|LXyQJ|9B8=w0OfU|9QKCW+UFhg;lHcqgb|Rz;X#? z1v7}#2M_phb@g@K_D+X1Kx9p0F4OVm>vc5heH8iJR(|fazdf;@%Zp=srd(cl@sYLJ z0oP7N&k+CuV#wXStU(5(hKnz;fo7Ko?5AZ*iyg)*yl!MZ(cgs|2$nxGP-2uc;lv!q zKimaPcIYPjQKXpMsi{UM4_NEMHso*#xkix=G#o=aAe`RY4}|X0-khT`rxb-;Iz+p2 zgDrW#%~>+ag5}6}$%`>*Rr-k}+1JX00n0b@#twgD7G*DmnS51HfTTL3D(oU^%Aef8edSTSXCM|a zIz~ZA1#GCChf3v~MumgbpcXN?G=oZsL$&INN{vH>K?rv7xC%EnxIL*x@lx!tUy@xR zDLd?$%0Q(6(^k1pLX@RL1B%SayU?Mouv&P!3uB*fMUw4?FUdH5_bk(Fu|^B3oNM6* ziKGHyq2^97vt+d(*euCD8tp#N574gHX@rTF`q;Tu`>pbIbWom4S>0&4+Sp8CkSPRv ztas}Dzc@6UJ{hRuQ!7)CA zAUoFSfE%SGj?qBC_ zRTfA?l~mIx3WZj7x1L-Scv(i;Y$x9bry|R#tJ)_*X@_c7vWr2YotND0T!%c3Iy`WzuyMrOSU++B36Z~2`z3_s?Jyc4*;7$WWQJSlEfqpEK=s_8eW?fxINpZ}xs=Vn#@Z&Bs?mVHXNMwO5s%4&E_3D>H6wpP`%AE|oz zBUSI$spZ|OTGU%rJ-_WHCA?j&|8_Nf{mp&#><(XFJ=-|CU%aYcyeVX6f|+uE;|+ah z&W&I9jc=NKq1N54j@jL68}HuT_nEtoU--=CLuzb`BhXZyuUyH~ZA_o-5L-&!^Nr0*!)KQ<%| z^Zorz|3I8vCf?RB-qA0CtA+X!AKM=QDg{}HYHH7Sr@hPIYqE2m;Br$Ni2xzD+? zum~T(XF!{>_#EQoujkKy5w}nwTup8hs)Q+Iy~d~cDcPubNb?J7)a=w8q!!H~%^{kk zIV@6|3|-LB8c`=ov{tl;PTD9&if+14j25G5hZrLcrHjPj;z)YCI8CgjcZqYwdioPX zgdv7LXt>63nC>vXDH%C8+i~Ekq>a)uT$8EFG=2e1KPGr;`-4+3ll*ah$e zzZma+kc z1NZ@o0ZIWX0bpi-kY*tesTQCSpcMdoWC`YT=?0+JAW${DIDOkC?}f&DVIxcDb{R8_ zImUeBXyaI88A6qDI>2n>Tw{~5&A8OK(s+|`Ex>x?CWL#94;UXd?lkT(?gMzq6oi7)YCq4@mbLcS;We zy&Yhe^aR3wfCB)Bp>2oNHogXMOgf>$DTEJ!X7CBnpJ3V-42)}~Qw#!e=_{ZabYC8f zYfXXz5I-z`oigc70)hqNZdQgm4!~cN6Z-fS@O&+RIxf;zrfB24CU1cMresr^DH~w8 z$!{u#w0u)315+iGJr&BUFwK(Ordm^@!aq}MD3}%p`fvQww1SNvgg0P_a$#BnV^V{# zR%w^%Hh2yoIKIlbCI-f_4?o?#<(f81HKwh-<95M+II^+F@i%RQdLNQzn07EQHJWyt zIw9UK|Ao(+o&`7v&%X@MzhQdY_<-r8ai>WSW8Mw$8pJz$<9+4ZbhZwq0dY6eLyK(61{iKhG!SGF=-Mplu&Gu$V47tqgs{RguJ^uw zajBAS$?UaP#(kCwGeH{&V3`a$-mAB13@(t3%__M2!REeTDO4b!o0b`-6_y&b$xUFB zmj?2IO`k4tmU`otmSzY$EX&RN5LN@!nD>RqR#~WQ!Pt~B2-r6Bbj!`sYnFA)E+L;8 zq$>Jg*#K?XfbH1?JXjnEja8P-2yz!m_KseK0<67A>Ifmi=a<eU5tRWEw=K;@sR2gakI1E>d<6UL7%rz{_Tno1F% zEtW5!{66!6@h0hjb1&}+ip;kSB1>(-$_yzNeYIg!M)W83io{t$H z&BPiloj~wPr>x1qqj<1k0M<0cUZbsM5SUL?ux1<2TZc|0#L(${_PC*<3pVDPg!fBjS8GXXf#DzTft6&ZLuy!e@D@c zxt3fePu3O2V_jqX*m|3FBeZubv^OA+M~&xE=juV{nqeGf!2N9y zUk>rrOkRWj5bMv15c#|r%elp-&_^FugM_df}Mt(HX;}91CE)gaI_6xA~<7#2; zM7bG4CEzE7QcRx%cmdMa2pcgEqlXIDAbke#;vQB)CFZ;aaedD$e2V3n$A8N1_WXij zjTduvW6ob<2~PmNL!$+}s^>nyX~JJwy5=e@;WwD)1meT^)L#*QKgW2&rvlC(6@aG- z9jqlnE~`=agkcTq@6;YQ;}7zXoyuT%DdO>f5AfRof7WvkU>$#q;T~2(hRE8Vq0lUy zeBI6VZ#OZ_8(9k7$!K~G>2XLO5bgy$i#q$ zK-$#Z3gsW}9>H>dYHC?}7xbF0XFZ}mEYpX*D-;d_eM-Tse7YXnu%10j*K_Rs!Pl&0 zE<lc=Gj$vpC^oU!FPp#Fkvm_a;cJeiA32(%n zo?{r&58|`y@Y!|PmnRT2p0p`_7iMGr*~le^X9*i1eLwbpXe#EJinXjojwK@Z5;cV7 zRQWHnXOR!H6h33y_IDq{GLh%Pm&iBdD)#FDmR6|Lj?b>gx^5C~WaEO|mKn{rY8*hH zz`JXaONq$C{n(PJ$l+PtMur*RpubF(*5X~8!b$A!daT`t+$+T1Wgu6ND3XAj8OJbi z7@zI_2>C{TP`X%8*I|#&VQG zyW}L|ue*0(Pj@g*cI`+0>_gfxO*;nsNeD6b(|O zE*bf0MBXwfUCVR|=v}BOM(h`RtMDP(gzd<4ALj9~yP&NiN}7mc_Zp7u2&{$W--aWS zfgCu0z{;oBcUuAb5!=xY{1!*^fTkHSAO$h<_G=|SKAR}4#2$TtcHHE`x$?_vry*IdSL!H zP}kl-`eCfshjO*Cdn}IKSlqkZMmX{imkc=aKVpZK?OM*lUCV3PeztxgVVboD;5JYk zW-GP^fzWLifrkKg0PF_n1b7zUAi&E2Zveava8gY>4e$}bX8`8_zGlZ(07L*IfDIsj zlKn0!K)f2J0%QQ>059_)91Q@x}dmi8rz!89>kais4U7*h(P&MpN2jcXic|N}6^Zm^-wvJxP}inB&)fii4SM2%g~m81+7TXD#qQ6f=yU8b1rk6N&kh zJb`B^5v3$4SsEz$q;x4GSk^2xAA4^d&kx~q_#g6X`Oo>Y{Ga(RG&!1~Vw#vPW{88u z9C4^PT+B2634C{`&-iEK7gCfI9a^fiOL|P&Bkc{=iEm5Dhg`*f^xG0WZ{aO}gz&5Q zRe`g(VvD$#=na{MOk%^+n07pG8II>Fop_?sjb|of*c%KUW)pq`lmK%Ae}51N|KLSn zJHRf0Cjj;X8~`{B@EX7|fD-_x)U*!)J^}aw;46S`LIeRo4*)F|oB+`PUVvmZOasUU z7!G6Lhp-p`^aM1C2vY$-AB0+e2pa)f0Tu(S0Js6t*FXrC7qp8AU~vVoumV_E0W7Ql z7FOtlJkKH!@F0l*R#pHjE4&S9;3a_%Mud+Ls2X0J{_K+XLgT$~4%68;3RPq-X(h|a zP2@JRnLI#tkSECVLQG zPv>XzbNME|jb92W81gImn?UZ@^P8B)v5>zPsLlM%{QWR$9KVfU!9T>W0csQEe*i2S z$FF1eU_3eg27VUY-2v26D1SXa8>nV}9KV6D2Wlhlho?({S`YfQlCQ#NeSAHi3)C9k z%Qu2uM4roZ~ou`YxA9&tI9f{%>b3 zp^k@jr;yvtzGs-gykK5tzByOM`UtBuwnBQ8d9~yaqlHGc8WS3Em7L91Z2VYd1*~B^ z4Z|5t4rBh4n5T&O>3nt%JJE9p{ryfxLwW_KWMWD@OJThuhr}FAKg`yw%2T*TiS9at zG;38Sqq+CRsfgKs$iB~3c)SyzlG%3)fTyw&SWbR3;$y6}f{3kc!q(o8t^FE(cHDu0 zJZ!wq@Qbhw4y^HBq?3`}MFOYfe=QgQ_w=ySlt*!8VCsoQTF>tGT!neqnYFV$%WxiL z>)lL_oh>SXxzouIDKLAQ4HkpdU^6%j;V_F%GE8Q(sPQqFIU}S<$py3KbJDM* z1JXh11?dpXp07x+O0P+;OTUqhN^ePTOTU$l!(2*9@xP^2mugQ5FnJHazKZ~O+7vu( z3Z6DS3UC~M06c999xw%unVtpsQcXJ#{t7G+I30iqz@hx*2~Gw`1n>c50^|aWP{Tri zaR3znlL2M`)Bw~2Gy`-1EC*N(a5KO<0Pr2S%>dvtaNr|w;3IJ0BXHm&aNr|w;3IJ0 z4{+ckfc5_SaN=9!IYo-;^YjosLXXnp^j&&}eoW7Q(l6gq+;VO;z|Gt`ZUeWOyPtcI+s^Ico`BWx0q!vO8g~rl zoKxI~+$Y=@+*e#TFYwIUab~(DWterO9T*Rz*h0IEF!@*CZ+;sj+hJ`z@7PdPyn|)9l0)yem@nl(-!662$AVob5vy{b{(uNqHqHnW$>E~#R*}?7>;rKgG^yZC#(Pn>t z%Le>$vM~g}FDKxa!^(<)_e;ob6*>Xf-^V%lt-wK=NE=AfO7NuDlJ#U0xfkY`hsjQ| zhwKB7dM7yq_<3@K^!2F}Z%Xl46fZ^bOcdWk^(8Lw8EU(jRMvLS2fVe5?TbI$70vK@ zHUf*gm?SRfdI@tX^qs7n?sSH`wy@HFx^Dw~f7ioUvWO|Ih?$mD0i(MGB(+AOvT z6-!`!M~%-L!P;XE2d=LbASC-Dc{sS|2w8;>xoA1;TzND*X@@6>3CX!=NzrOPs^%Jc zkz72Mq2yC)%)KBNJLxIl$w-s1k*&_~D@f)0M-6`YsK;*}CH&ek62Ehd#xERy2jI7j zGJeVE#qSdn@k_&G{H`zszbH&asb>4A9n|~1)xqKS!B;_V3dv01?m*}kj1`ShAzp=4 zfDC{fHB1f36NsmV#4|$f$Ef%60Y-Xoxi5b90GC?m!02GpOU}X~FnoMSp8d8r| zodj*oQij=nFwj3m+Ss#!s52(r#r$mg7rdKDz*C1FDKx`dQP+$lnFvritnrBeJ--Wj zem8eF3B&Jx_1HIweUr+6ZR4I{-Wm5YiQ!)5{z#I<_%58Qv7JIS5qJ_^PI z;b+`A?rShKB5!2(c^i1?F?>9q%4hI7d_F&#AKQOlq<24rzn6c1fPa|Z$?plI2kVFO z`F;HJ{2~4bf0RGYzssNDKjzN{?(<*r=lLT7C+Gx|;DFVDEF=m(Au~`fUjaV#=TASrd~1FL+7ZYfs4u|ZKzRXv^&jVc{R%uU zjAJQ6MWB7cWMPJXP$Sd_>%9bD0`~*@1s)R9kp!eW5sycG`4gsFG37zTLoxj=O#d43 zt(d+aaRsK7Abk??HHallpMvzqh<|`M3ezVd{UPFCBKBh~3mNWt1XJEa+=f{B7Fw|Y z=MmqI*o*1UW0}J+1!q`#Ev9#2dI6@qjkp1^7V+Jf2Yb+$Y4h_@hq z6S2}Sr3ADvbP%S$g827{IV>%O;qEz@AA3iSAx0a;mts2hk*!7{{Q;!ok$w{KI4tcW zq?NwsAjbBvbtcf0v9!~O7hyV%8e6@pzum#?bTV4sVeD)2J~oh9KekI@<&kWq?HLqnR|9j-Z9)JX~ks zI!n&N{aiYZLBG;^%Q}zcuu_6$kVCWrMs_Ei0e5SEXgzJF9dtQeO>d^_Al$%8p(BF2 zth^ukBhvRH{Q+W>3i=e{wIMRR9aHuojd}t7VOWvmM-jhBdM$%;_YR~{wyBIb1Jloh zXy_-1(Mpi_d-aPXhUn3Ah+T+}BEAlBIbzfcG8;8W(NIN~v8Uj1g-UfKj#QpH#td%@ zksLRFDeH5eBRXyi^L)_fQGTn0Q+|yE7BzPw= zcvb#O%VmG_G8NZ8gyb`S9drlyi5hRXB*$bmf9QRN{}9513gE%yKKcIfwuY8{`4$}g z9$Rqq0+|Y}|5f#FB7{DWOy^~J`p=FV^H$S;;Hn9>~;(fz&Fr07k> z_aZZj_EZ8){oYDv<$oWgyI}-m{GBkFy?6fJ%4aovALU0A5oTw0O$M0pJ=E}hNY2sk zRdSAguaa~0dzPG|-?QW#{oW<#=tbuLf41aTFFODKt4i%Z|NpDXWgM8UTK21gW$L+q zp9H<&0pJC{O%l1|+-Z`*odJ(H4}ZmNB>KgE^ovKKUpyN9V)kn@W^t+RRo!d4*LAi_uElii>e!8US+IQ24$^Qb4_-^$EuZ zCtj`(&f@<)bJK>Phw$If=D;{_L?80MrPXZqs}EUw|GQ_u#*o$dzppJm@YXYb;c5by ztM11B`t|Lt7|R29e9-`&~Sw~u`f3y4S*5gQ`n0~Kqq6YPpgtf+|C5fK%QQA9)3 z*hR#S9UEdd_SmAvSP;8nSM0_f3x0R*F7P1slIZ_@XV2a{``ew_**kaY-kAaJ`$_We zht#CaK1nWozc;7lr52wgFTMYNyW490K)X*^Ue9~y7^rl;4Ph!C|(9dj4;lF7IwKW?R__t$_Hg1rn4gWXUgn2?fiQ!(rkgsZCv)I3X!(T#N`@Jr< zE$VT(IiAgXg_F~G)>G2BsBr?PV0Pc!AI;*ok=REZAV!G8#L*zpDPpWRUtA)t5Z8&D z#U0{a@t}BAJS|=jQ^eci19sq6V5%96)X1%AOXY&eS9xq#p3(L0XAcquy|@ zKHO_UThO*N5U#qxRR|4#qXX$sI)d8LvEVP7PNTEIN1S+?#?w`FJ>5!o(S07;aj4xYIp-IVUZ)e|X| z?$U`gQD>pcuCvkQmCETHr5cpeIq6(=rQu!$xL1WrIxk&aae&T89Hwig^V0?By6A#w zeO({j09}M`7##}tM#CAUo1%-=%?H;KI9KS_QD@y|aP5F|ukN7ksP1&y75j$FS6Sqe z=}LDYO)k0=-R;bOSDC*L54 zwmbr5Jz5+skCme{Yk@os?+uV=%W-nNyb4_F;oK_jm3PU1`@ogRBoAeet(**3m&9T6 zbvatTD?bva$j|8`y&$>hWj)ADZw;rN-a)rnUqmXWcadu7-K7M5IlZTNP+vpWM_*gt zkea~X0KKm`Oy7$6laGs2^!^Y^CvmerNFS>2uMgKpiWl@F_2cz1`WgDU`bE-yeF8P4 zT~T|ua@MYYX6RP1D=y8Vz=~1T29G488|`6)19%tz=?ew01Xit6Qt?UrQ_sJ|yQ=Nb zLZqr)kUQdK@X4C!Mr#%}rvfP29tdb%!=YUeL5mt83jNMQdJ^xVtqwuE1wpk^K+75a z7}9!p7p)5fZ=_C$|AIK$FbK_&qD`=%+UcTY4pHBKi#uTO6Or!0yJ!U@{Dd?T@vcZ` zBE`3mf_S$o(i%w7l83`ssrF7}Il6Jz9pNwZ8-rA}3Vw{w9K^e5*ChOgcU4=U8;rh0 zL{wvrau5cgUo}?v7A^sCw5cGQ&^-WYJU$bQR81ZHQUR?p$S!oFMU$YuaTrq7PU$DY8-YWMT;`-7UIQ` zs@8E4co*$qcvb5#9APga)6uQAiB$V5HD9QI_G}m{4&_e}5zsP+ABYq+f!nR6DO;8P zD4T--DF|+gbHaJdSp?$`8VI?ri8{t(DnmYEchwdV<|D|Dv6vHM(=2m%)#?T{ z1adCm>2!OUbPxh!)(lO5n}=x3+|Wr6{>|EUm4wMTA=+ce+sE;O@#U;hGP7G zJ0PxF{-CWOQKeT65zMV(H^ebDdCWn$PZci)BCgsHHbq%sJVne|1k?KE9ef_`g+w)% zsghCmw!)k)qTUjmOQ2dgim0UoEdvSKKnfTi&C&_y(L+haB*1GDj!n0|yNl1LHh3NJ znM&yHgwHVfu-O9E*k8u70Zz~K_VN3F*`X0=y^YTfYi(>=5Q`SEnVHVPVr@*@nYlsfuLu0 zKzW>_`lZB7!uer&@#q9-^cNI=HvzSSm0Y}5!&m>H@cxZIodmQ_-F1e|!Dx~xwrq|? z49M`yi?sl;W`Ewcg3F!@&m!Z`-Gcmg(#1ag8~OjqFBI`VrXA|sHaH{xCsQ%w3z^ke z#Q$VEI^w)6W|zH#V{^2I{!gYPn~lQSM|uZ z%tf>hbm7>(q*EaLG%LY>uS4n?F(+mgj$en|OT*#H1;NwP;JP&Qi|xN6$+LA}*q*qv z!Ce8qBJVqu9A8!nR51Gr;j8=x%2k5H6|{%#?>!gZ5d0P``Z80({2K^deT`p1p&s>w zdccFN3&_m}#FGor=EQ$Z-@!&}Sm@1gw8ke(3+zMQ`K~sapX1GciQK#Q7hSd1n3HB1 zS^bl=d*1cyKW`io-!TR3@So&p91Cf}4dXs`Y~XXt%ppC-!dDRAw9yy!&yB$OX6dbe zi4x9;FF~u}5nsHFnZ3Wg_7{qv-T%lhJkDQEzDxYd@?GLrm+un4x_p=T73RBll`+?9CyHq1ivFQ#RbCRGVe>V0cj(o>U!%qi ziL)*VuBxxjki zUr*<0&uMabxgY6qq&Ua&CC&~_y=NvDwC5MpdBtizLd|)Ja@6)(z?mv+zi#m5$>-0CN|+?SayJ2xH_NNt@Z`1A z24_jU%b9g&uCXB9FqC}=xZ~h{Jf2LRZLzn?Wqft24N{+sZ%oB<<^@VA73TrHz^_il zy!;{#Ddy8u1G;f8)eDql>Jsi%`(}NAmtK>;X+H)Ycc`}3PSw|&c3|Myt~VdxYdfdz z*&{%S(B~~rzy2Qk_JG%({3|d6?nuP;BT~;qy-r6y&h zi6Qn4IP#ToCZrI9*k=&+XJKAic!Wmw9>>5Z}(^%i*uP>x)G;ncZG zF1QPL+jRf0EA!a=|M#CwtG?&eu^jh~vCQhb7Wy9lQNAa9l<%mI@;&jRd{263-`2RN zoXO1h+x@{CAie+j?%Me7(H|Id)%Tc>@;&xFzT4UCyKBEuqci-mr*m>?ZG$?@^^f*@ z=GCAwTJg-XwiP%3J^Z}eb8Mx52DT0dE74htC_-}&(|Fo0k<2|sM=JlUe!ZU{=4hz|x0>&DuzxYJQ%&`_ED?ZP&(DI9BTaS>MBdtg8KRgjAia z`T5>thcXlKFN>Yl7Wf?RV!Exi0oX{kAWVmrJ=}qkp6%{qi6_tUl6jv8t_gRV?M?`- z`2yN?^vf=pt^;1K&U78YcK6h-4V>g2L5BP^q z*6wF}#teK-iSd55AM_4?gzO-*jFVmSSx!OY4fz!QHvfQsDsY0NQo$hP6l_&ouont} zTfM6y&Vots0KAf5D^wG_h5AAhp@q;^2o$;rAwrliP#7wVfOc!NFin^(#0l}jDq+2f zXyI=ab_x50MB%uQEL;+<3wJgAk?@@DwNGSXNvw$-anM3j-)K&M)%U7YeJ@fq9M$hX z>AQdFTfR~KIyWKU~0F-Gn7b z)jj&uS?B6nO6r(@08ELEC{9^|^ z0oUu&Mk26XEBuUZjET1153aZ)^g^okasRRF9qED;-$F2M+J1Mq3KYTmLs0v2xNa6v zM>KF1F|j`)>WWHfy*PC}5Nvzm7{U9_#8G!wUShVVTO96x!xjfU)~#7~cDoKwJm*&N z0vE6D@CJAG;gJYOG92-|wR&U;EhDV!7!HJD76#jg`8Xh};JG+Bn6Kl!9e15~fV*la zm(um=AyQn`ir^Yz1bY<(*9{}M8koASk*XgA)0JR}C+d+}Wu!5gmywogYEi7WMO>ka zJU}=0DaE6In#4cN{&`>ap~?EC#1JhF1HGQ22*6Wxp%oFAd3x#Du zf^Y!ph{M7W;iT~frlkY;aKOEai{Ng>X>K-3kS0SM&*jy%=x}{O9$U#gj%{&kwD;QJ zSO)uVoVJ?R`)L;RVc0IKaI)Q2Ge+_=kK>QPG5oiGjo?3Lqve97*;siI9EJD9k@^s! zq2MdD68!l%bwpen4}ZkY^bvd(9-PcSdoI)YrntQ-UJ$4B_@u?%taU@Q}HSOdw*0|iv zv9&CJ+1~#t=w65`>$&4Qq=LHA>HuSIvsjCBCH1jK{UuZZqp=&p<5e24B4=+2MNkH=?x5U+yn?dWzu zw;R&Kh_pucd2|;*w}f;zhI0$u%kVC)GYI8>!Dd{|khwRZdmy@Zqq~N-^5AYP2{vP% zW^P=^kS~tzAJE;HxnC~DZ|sTqVZ=|NdjPuK(cKW;)zFP{<}0JS9do}dj`R*9Z85aw z_)Hx{{Lt-z?#bv@-<7Eaf$NNYYzudd-)g$J0nEKx5TpZRdaAfYaX{)iS>sjKeoZ9-M>I$Rk%Aiv++Ggq+ zoZ9M=xPGL%LL}g^>3@A((2Z*!YLYdn`}3k?-&C?PITph6t);7={)j|g36lK;^`-WwQT^+vuHUQv7u}+Lk@{XXd#N^BF1^E__SeQK z8-&^HgU`2rOSGAsu>~XGYQTcJPkI@%yph&#nf%`W`?Hoh@tQ`ddY83*c?s@+$1#0^ zHXyb$vFv~Ydn(7_h*$Lq?qm)vBdkjp4htnCjP>wjA|Q`6O=rFmq2F=|YL{d!l;m`| z;9AcDu53%DXGn)&8(UD_MB|5Z@eM^<~E>Obxlh~PhN z@h7dd^?4*7|5}Nw`8TbXr%4=tdyA^X&3lR&p=Fi0nrdlbs1j#Af_IQO!Te3IJRqu! zypXE@+8bu%Jk{oas3Q-!#x3b&Ch;p7B`tBukh{7zvsf!b)$#Iv7O;&Go;;&Go; z;@Gk$_%~0){rw4QF;Q1+-e@Lq94}X`D%5q4Nm7QyNuZg;V=^Qzs;eJ=uSOiHh@&L5 zjwW%oo4+rXkgxx9@_wnnMr4xS>->6BOI;BjduimUnHHlh4N>b(?1>T`QguWM(}1Y! zysLIKFOaHh;+MpfKr0$`jcgJ7pz0_W!M`Ws1+)B-);?1I#l0!jGPjTZdAM+CwkB#G z-G60k3SE~uJ)`!l~w9p_S4=pL%QOI_n;3HPpl*xpb3*;vTUPjbG# zEy=Wby{f60L)b{+R;^8+c4XuX)-F_A`mbtB?!!EisO6@#Fw#etw9wSHk5zJWYb98o=ls^g3x z%iIux16LICl!^;~;KP!$;%vEmTmh&xN@zHNGaKaJJe)n}$Q6SYw~C7px9nUl&W_8^ z737?`l4$wF?lDVT1^>MZb(?rQaM^tt)N_Dv**%`+Y~+PGxAyJ32lGxyOCzmknZb$9Mn0KPeghgX)@AFNUwM9 z)uS7K7wIFU&lwd2q%s8GPOwC3i_{UR3sR46J=%8@svz}3S{JDg(q>5gx_1cZECe9! zf;1RuAEX09ARr+E=`f_Dkwzh%f|UL55!v5JkgD_nZni#pF3^G8kOFxiwZ4IL&j)Fl zA5y;nq-a5ZNRh&zANYSj+bQdH6!S8q`>YpEVKNwNV zIgDaSgEpG4r`g^}t+`TMCoT-yPce`?*Kw!0N4&(_@I`nJ-i!C;1NlCDBp=Ps=bsA( zA+J!Igpdd_p3EjI$TpHlE|7boAm$VuMR&0pEl0h7X*1f1hS6a(hQ`r#bT>UtQ|J>( zPX7{&HI2)1Jr}Nd?Haz2#+zNkeQAD{>vM3;@-C}++3YaT1nGjxb%MrS(T@P>mQzD~ zG~PdRXu2sFTE_LXEZ14@$7a5^xSsjiXr1{wo1fV=d|kF-S+28uefFc7@8^*5z6@H< z=B2rRavsq4_QD3mRwc|$$ajB5*e6%3jc4!SiKv?~_$D*-fYE4Q0F2(|h-E(L1! zCu~54&(7QO+E>^_syw&$p4@X)Zd*y?M^&DG$5rF|Rc=>W%$G?BDv9AG&h5r4=uMf&>q^w?dOg{OYI7GTaB$ps>;hY(|C%?%k@`z zc}>?8+?IVc*5QS&)ebiHu!uV_B?x+aG!-KJc3vi;j)W%VnHzv)P?y) zd$E9MD>@n08rF#}qO(|3EG`y*gKx}+<62cJ+VnB;HHe(}gr%z@RE(m`U&>g&www_WgPF?epS+ZHb<;e`IFm?4o z7cAjz-osa#6>8d>ieZYI`H==m;m~RUpO!xF`Fvxnw*_O0@hZz9L{toaOd~Dsuq)xF za7&dFxh7c?X6H;K8_7<}%L#lumqhG|11UtDhzoHg?!*IHEJH~o8Ae8s(PS)%BGF_D znE`E>`D77ULgGmRv}V?j^<*=&X?BslWIwcQj*^ok8QM2j$aQj)+$MLSrPD}kN=wj^ z)Qy&+WoTJio_r$&R931eeJfR#T1b9u zpGn15u~YIYt(3M(fYM3nrUWaYN|-W030Hy^#QHf4vh%aCL^Za8f?XSiUvVn{JuH{3SdGdwapF+4RqH>4T`qhz!&<~2GP3mKh^ zE=H4aqH(fux^b3&ah`FZaj9{+akcSR;|Aj<%chnsEL&N&wG6NfwEV$x5TsiY$w%^& zf}|)ZPD&6rQicpBL$XEL0OB4fw|GLcLs)5$C{k1QmM$x^b6EGMhUuVfSXjqD_Q z$e-j8IYLg5GvqwEOsz(NK9@L2lw`>uWtXfad&xm^lnO~j zBqzyPa*l_XE8xzt)}Cv{YED|wWBN=v1U(q8GPbX9sNy_CMn56U2A zi1L#%Tp6W|Qzj~tmFdbXWuCH7S*k2oRx7_Mo0Q*_?aEHWVZ$-QDZ^RAdBbJHRl_yI zEyG`ihla<7zYWg}FO0mA8ui9+jQNcPjYW;cjU|nLQN|eKG-IrBt})KI#F$`QWn5=m zZ`^3v#Im_%OUpKv?JYZ4_O~1eIm@0KNgPQL;!I4WGw5T}^+bn;?uL^mqCPJwOlBWAqd~OE1!^^ai~{@6*Th8GT7oB!xIi zR#G0xU1}w@l>!ud#ZU290+lXGkP@QwQTi(bm0`+AWvmjV#3<90SY@sfrz}wtlvT<) zWuvlH*=;y#IB7^WTr%7=+%-I4)W{h{qii&P810RY#v(>%qpQ)~ILSEGIMX=CxWKsB zxXifHxYqJ}OFv70%O5QVgC>vE^jOv6;h?)2n)^15Rkii?8k(Vh8QS+Qx~FQM4d@wa z*DLkv%{rB)Pv92!Rx=ql)YZUjGvNnyH+?xp)_B0Wk^(qwvpUZL0NZF-MBqEBfm zxk@WY7NmfbQ?ixZX*F=Ql-fw`X`=FfjnZ0ar*u#{E8UfzN^hl~@}u&z@{2M?nV?Kk zrYbX)Im!ZMv9e5AsjO8tC|i`@4Mz+o3}*}%4L1yT4EK?~G!moEs2KAZ3m6LB=7?)@*UDmtc z$tVa%;&PHf9ECdPERM`imGth>u(1K}#?b^(LGaoIqIddbq@z5`x!Oi6sLC=`SQQ+AeTd|kNc{Z%C zvj|QWTQ-lCJ+p#5gw{|5c?@(Y`5Wjk@(k!`X)sWGsWT_g5>i*7C8h2_-Hb*~FkCTa z1DZk}q2DLy_bK{)j(#K1Zx{624gCh8UrY3xo%xk|;FG~fdm;@%+6!raDAL|Y`!H&# zi?kl29FOh(oH%<#U~eDJG*Kx*^sQqJJrL{Z-E{|}Z&D9njLA#wNdZNc(fgMLgP;X9wcDo&C zfEIjyE*rGs3vxN2_3pxdSyLzK#Mw#JBya8;sgBfubCi6f##~XUsnm=srdTSuxDrYe z#g{9iG*g;$1cft+AA`6j#l-*|?pnZrp1;&egK)XxWi#W*K1_ z!8J!+oQrf3(u+thXqvlTIE zynmWKds_q+IAgOIL7x&i4QNY5d?fX`k>J>khMqz^PnctIbNt!mHKCTD%lZqPq< zfgD){+|4v;7T09)Dc)$!-R9Xp;nLh`I3K_bJKn&R=B>F4&}UX%DXcREeky#GsWA98 zk~#a1^6`cKeI?F+gR22&D{x0ZFW-Y3z}1GHzv^m;BLHgJxV$!PJ}w?Qv?R9!nuvc9 z+3E^kLu&A3CemcHZ@rH6x%OR-SWY;CcDdqO4NQt9(xvz&|7Nu!u16>eSE0APwp+A+8rIw9;+y-mL%$AL{IdH% z)91gw`Kcsr#W_~5v)Q=nn&Bn6|7fRElszvW)>fsn#Z`*f$h6-V6)!(r-De7%fuA&9 zAHLdNM*P$nq-{Bt%Ix1jr!OvsS$D23scGfM@0p~AFW_FnYTMHP6My}ujHjC0Izf2; z+Ai6jHlAsJrB|9%Y%v$Hd9(rAZc(4}ed^q46UWwZcGh;|C~5X&OvdxVJhNEZ;kY>4 zC!X~o0zXqcU;TD9&d#{nW1(~zW%;^S#5M%ntk2W-b4oQ+JkwU{v`&BHr_f2DN_`B! z6Q}MX(dsj3X6!%SW_k~)zui~N8+@^{VYXH>e(Jh^?o*}!%dKp7eE=tDyO4k0G+>$> z_OEO5zxVdH=>(HMTX8q9nI6sffLiWXE~A~0wqh*%*IVcx`uVY;+iE-9e6G;dm8xS< z2S0Ucd|d3(S~#Dp4fZMG$JYO1abp_S?K5ff$HkIrd#U?lS;)%7pf56>BBpiVS0PRI zC;v--mL|_hFR&bjcbWHb7XlT*zX*NYh3ZOJ99u`s4%=-+?cE}(`pB+0;e3x`NSzsd zqo3?>T7w_fhi1N1?yPe2m_Y13G+T&&ju@}uHgemz-Q0dIi95-iPX2=vAeHyw9LYa{{wePVx?es3^niR2=t21q&_i+}&_qZnK|TzB zeRF18e+1|e`6$q%@-d*tR79wu z9`O&tbC)i*heC2WAhIw;*w4WvwY_!9G#Y7k8{OcoQ_BiubEJT4_8SiHcOBfMAD?Gc zr9!M*GDIl~Pep{#zkU2a41S0|QN781-S+VMqAZl&)w{k&a#t}SS~8X4H`6jd@kf5Dsu%I7eZU`Yp*h?W((O0HZfe81X;@O9}9_O zzmq*s6}KdhF!Z+oX$TqALviSYFKihSiFhVL;ndbcW_6JtT~K7$Kw@@@(iCb*5^|GL z4LFfuRr#R@v|i!2lKPX1h?qgYg|1(1W)4K=u>u!KK=vou07MSyI2I0g zEF^6OM5mYzKy3%zsk}mU2Hh#QLQMrB3|q&G^it^YwH@Lm!9(|x?k7z_)Eo!^0v&@_ z42n)gZUZ_aaS5V1&$Eo&0Vb{h!NJ@rpSW9Y8omMEK~XDc4*Cpf$`)cJl&iq6TU!}e zg7f%%DwUTd8zj01>3?6c$$|dxQSTN5C6pmGN!x7<93b-H@H`6>p!mS)iq3=Ui*rxe zb~jJyx{zFS+<7YNTT-1n!Rmb>A*!1T%#0`rR%$}8*6kqe}7mPnuoO2XiIrcTFc z`BxAJuJ^?$CAXOoBwJJj-#sdm{S9g3BeB70fxhVuOIty&XjoA`LfX?q$*%gl#|IV( zb&CU{7`*`~Nk3%C{ZSI7H>L|0zY$(MPN7?Vv^cPgZa{nRvMg^vctEzS zc0qmcqm|)2zCL#}97#*TBY)}R;zKjY*x9jpM)1xrskz#aKFM|+cJvoxtwgOI z-R{SC#|i$_M={3<0XcKJe~ZAn^4rSVU|y=u;?H<5O4z972;(Ie#m13WzBQ$s`Y!_` zcTS`mF?ES2@GFvTsiWZcarDEp{u=QeJFVT;qe!Ou8wxwvPTCuOPW~%U9@M;FkfDgl zLWdy(P~ymU479V~yGe!=ZwW6{J4%~3!t~~}k17N9XO@pn1NLY6 zkMf}BaVFaiRs%9`h`om1pWvV9{tfs~OaF$aC#rvgnU}EO4$#rnnJ5%CTi>c$VOveA zVCc&9xd06>dI(oy;4>R^d~H~iqzMDrHY#4|5Rb$FIU8~OWthAOU;;sgff_DG0Uu8z zK}E)f79SoaL5?2%g@Y^+H9dHULc$0&T$BPjemG2C%7l$f1uZ>dNL9iJEnJcUJ6<#F zkC+KISv^{M^pK6j-e)$Lc;2u-k|s=K&S>eOLjn?eq--Sdk70kLO~A#gd`|Ema*{|PuOp1d3abz?fg+w0hnEPCZ z9p4yMA!$NHc8sbSI#eC@67g}UkTww{J4RddAA*+P`do(w#7BqONSI)dWuh(y4{=E} zk=7x_pN82;oA8tIqb>#vAxpTC)nUYEg`J3*;E=VUJ`%;RqkSA!!%n13xXHXx7lVd~ zCGN=TaN;|{Uc!fR{vG@z?#Sy%;vvHbMRvf*V9eO_)6}CAI~24Q*;NBY&eX9JRxdGQ(~OV2|M07?5Fq+A=y3}Z|sn# z1k-0H@OXqU9f=(>G8{Be@DQa06R8tk{Aiet6tDwNrhy6y98#00BI~t?2%{_vqokO^ zToENtR^G&)!nB}fD-?4ve=+d?G`s=_?h8B_ZJ3Vu4*ti&YdFna%c9`t@p?-gkSrs%{KFv0 zki#%V3c<*rP#q|GLjSmdN6e~m}3qhrg`eG;nPyX#wJXsi~XdyA#Eoxcl z7f1>G&r@LWQehlo!IPLD-DZmbHaZ>gj9ztNh#hD$Zd6eCkb;CAnG-_1cG!y84i{N7 z8Yp^*NaF0X6HI(t*otJZGFQP+0J{^h4%E+rt^U~oO}b7U1l!_>R&=Iina<8{IVv^! zgHo2?^)tub4e6um(_d|%GpGmmEb2LhRLfzwv@+V%Z`?;Ar9!3X1u z1`LobOgau!<$bj}m^gh3+eVHIG}+n#*X5tS2Ckj@92^daB1piz-g%6FrVz>Op{WSw z65%=+tloEWIMSc61yC8Qeo);}45>Fz1M2s%O_CfHL2Xo!%Hn zY|!{qqe;QT1yw}yGqd&w5Y?l_3O%}A_MK$FAVaY~g9Tc}n{Fj3Cn&)e29enx^m`d@5+`WZcsI za26t-8^>V0Ze|04G`HH0&9M{g5dCzNpCz%lO=QK!qlVB;*u};Gf}vC~8vdQV_dnxv>#X&W@3g}1ODucPyRF6N$21Mt`Gr~fVzJ?MLSkwf}Bea7?2Z&CeZ=a8%M zyJ$aQvwN-Ud)FSo*H_-*Q{nObzOONN90C+vExFRO{Ud0->}+!*O-61i+du=bn&6yq zGOUlCE71r!OUzEy@=3YKOxq1p&)G$a$?*AE|7A*N>*Q$5TPUYga9utzF7}Rk^)&G? zz_UW=TpNA*II3aBB45+lH@o_A_ttK&dKLE}5jEA-x0G*5HdEf%6SQWstm zUK4>Et{Xn!hUdq9!ga!W!uevjF!<`M?n25$aD)77qr#1=;B!Hv5ZKaDU+(V9k>+@y zsqvvUYb}{5vu@IQ7Z#g{9uk19a$cF368xT3AR+7-gGj& zdoKSQ)40Uu$%s*@@%T1E(x8nO$Q6`@6FjHLicj|d)M@A7^Gd1>+gaCE<(UqB0jK$E zMl&*%IeSR8(BY+_q7`cZwLU>fI!%$z&lrk64EAAX#N^5ogXq@cDs;o)B5kDaEY{Go z*=sg>3B~gaItYa6Q3I1h7EIS9zH{W=#H53k?8q~&J}o{r(Mr}5ARi0`w8sG%ul+CQ zLxWO)9`$djok%c?-0o|;2pQ(dtrUrxf}dqsCdxWnl0x|v-I2A?3eoaRW?$A8?>0U2 zjz?mk<7&Mf1#`=00uVx`6N!o;%mTvaE5a&32r|ij z+ZMyt(WJn(fBv2vNMl#s!t^}Z-%*0p4{Og2;7uEks)T9iM^RbQ$*PM@57?;}6P}1Q z)jf3TR)5V3;`?z2>ojUtXOcTEyFX2u>m8d5#_g@5_v8Eb-Cy${-!HLxf)L_FzwTk- z&d{cq8rUCb3`Qo-FzA<~o)!4q&z15WE!xg{kdewYI2ZT1T0PT7GDljI8C9yHv=Leu z0CP7>{PwN--+v714DPY$zcq@wHs=@j9wqxK-H!KU@dfkDSm;dWnQcFPv^h+@qEY^3 z6a9;FB=y$8ncjx3)K6(m!%t}&nbeoB`P?94gJ=xuk4lWh#Uf8PV=!#?zFF#Vw!y() zANd>i&3-ZdKTglabK$?(33A$N|6ZG=asnYZjZduOlh=orOyu5=92U#f-^V8zsdyJ} zK+D|A3^|g<^sbid>s(gr4;X6MSf@=^yLqOyLB{3CQHb~@8jPSgzftm(8YXrG~>~GCu8S2T(eA{og;#{bJv27tzG7Ta11t~ zS+i}*V0_eMh=x_eOT_39R5P`UCc978AmLz4a>w}YV`FG8V&!bbez0%kxp2e!&5I-s z)3T<1-m`LMcsPh^3@z7TXJ6vN3y6c|+=YzaGoFK*>v-Bjw$6EF##c8OJ8%Zl&)#pG z&v;bxe4r$?6BSxqd!`h>K6pTBul%~In5a+g$7o8`Odp#G7L3!cF#l!z3+q|eW^Cvv zOH4e7K8aybs4&y|zQM)GcD=xRc%v!{Pm7JGP+H{tF0Vtjn3`NpQeHwy7SQncJtLn$ zs{ifRwr6csS<^88=@Ny6`jp<^X8U!Gj$H8}0x@Jx&DsZS>~wf5QFLB8KMHxdcIGp| zC-KyjsT%B#_R*+E%GTAM>qWX(0e3*NI&T7dhu6?OevaY3=5LYUfG65L_5k9<+IZJ) zYoQzWz;U8jgx%;{yX)XzQDC-nUuvcL{CdNmwf6o=+uO{oT%d5@s3fQaT9t@v?@#SU ze>sWGtu3aCfok#)S5b~y)HBSwP7zI&bR}s5nj(+j+EFryqZtq~VbT9|$*8(=< z%t>g>HSzC;Q($)Dus4a(7e%(RDdq2kpvI`>`4s)}z-dOu=S5?ekN$_L&u_@3sMcx= z=9;^aC4}F&2Q;dz&b=3ePZpgfkb!qL@18dq-&BFxho+t4Cpm3?+k+HLeV?0!pS8}Z zFT1YPp2l~4QlqIw6NH-Dv?a7+fehl`{>ZV8mLbGc^SmzX<`ktt6fJa5d{gI1k0?zS z>Uw|1qpk|F{_K-C8JqkbmP`A+-Kfhg7&qJACFZO z%HE!nADwh117ndFXWmWG)(U{|>GDs0`<6@JtH`doXvWqeci?otLnD|&yMEf+iWcy) zFq&y++$Bnl8PS{=eJ}LRevKs5e)M8KS9Vq$6nd*v=-W$jSxWE9yAB^xapQ$YS-aaX zl%6kty%KDXYrYS9diDeSTqDunbZb*#-cH(AavM4(FGv2`7teW5zP7=4)G?n{iONP{ll}-*BqN&+;0MQGfm(CXE>tpIY5`6YL3>` zrshPIBK$2F7r@_}8xVV>tmMG|g#IYXXa`@vMb%+cMSp$Bo1BKFfl#5f&&<+p2@et^ zZyvn$R``)TT>ob#Y;~MeEP!=>RP}@WDoZ=#Ri$cxjeHl+ z_bE!*wp2Qed>vYpdvtK6N2n%ecV-p78sB2{zx*^CPU2oXM#^V(rbHUz!`@X=bETR`XeTQgbrw7l>$gMO|hnVv@Mwo){;ch3J zF)=^`nztTP^9{D@cFfR8FLXL&kYrI_=skKHBBf7`Ri&IK5?a6%`O7wUlqAxM^)1Js;1po4r$3 zIcF!fHv_FWvu$5^ds-U*gp&z3doEtas2psgQLzq&#XKJ+SuPiK&z=^zh`$swWv{UV zwPa6(GAQK8)LsV>{UuT7LT;$d)K$BuK}MnG^$cD1?dN)bE}q$)6&4szEzYOET3mDh z?rWhFUi&L;PvWbPi;8hYH< zARv#yceU?yT#eLqsjH$ndvnUOxe%DYZl8AG5M#-_73VM1##=XmKqMO8nw~3wLo+o3 zS5>=C&whh*nP?;AfGf`$>0pM6?p)Q;-nGvtv!Jb8%gH$><(-!GV{-=QK2~J=aGUEr z!s;$UziDt`5Z^|O7R>jC`a@Ox$hUS)f*RWzj>f;S%xpfrf~jCau}I*yE~CaHS#UEY z^z@~Mj*SZpNy;`)HwWOR)TMU7e)st4a)_Hl=@Nf~N^IPC-s|^8J34DRTe{snz2c-Y zfuz$jI}go~-%Rgq*f+}&_v!VmjKba{-tE`^RaKtj_N@+%`#Vxl1Wc>IK$BmdO*0B3 zkE*+6=`iUa(rP>vhVyL1Q}NQnLz;Rq88xViR@kPMS10wfwg}hR{h1#;`KD7jK`^nC( zmWzx@P_fVtx!=2*skO!mqQdL;b{TIj8~ zfkkb1%SZ1gxghI_H}3-=kZ@h|nA{AxW0r#l@9rQ=2 z;+OWiugZivA)BE(zoDzp_SJrDN!7+Z|D5I3m3^ykW>A89J2P}R1B=TaV2-9IB9VyNP>Np3F6k{e#EGH5%mYpq#BHtFkTF*~p!fEn4^I6Nk z{JodDH*O`|ylSp75q9#Lvh?Q{5x>3Vs@@p!L4^)~8vd_jF~({4;*8o^<8mo=zk4&s zr&Cl9a{7^4F$*JgQjg4BH}-PWkq*VgG+${~&KY+b@}s}*sBgg=bC6pK?HRZEXmqqN-K^giE5dIZO_t|BYLF|n zu0V_xj2Mbqg8~&d)&}*-l(KrS&m}{?(LO50Fw(Bt-#YE43jDOO7w_(w-OTT1jEagn z-QK)A8_$7k;jOBxw$UGuvl@DD&wH`u%;V7rjP+G-7ck#eE8@$j`!I|+eq`8^_U5(rJc{v{#ngX!Qz|R{13T&^t}*9Jv@Td<+I-p zIh9`gDK4>zK}Om!4DFP6<9|D#V%BQxYs^PZwf2dxiM$Xs{8m;y?~`+n5vWex>F=hT z%trzB!DC=4cDgpM#>3V@t8oOC;Hoa#z^4*5s1#$2TDs4g-rzx@zA5<&t0v#r zO={hT5TbTrj z8)(S9JEo4$D=pOx%o^=~w&__LO-*cww;Z5>VUNEmQ834-5<%@ z8?_tz`l4SU{D^U9o0OVO*{u}X=7yOsPi6+_8FZSM`D<%De1O+FbZsm=jdL*{FC!8M9L?qB)CkHWg+eGJ~eGmGy%u8QUx$FKiS9!GkZ{h>xJyq=@r)KKq^5RkKoF#q3^mQ z)ClI9o)C?J()R6i9pjja!vP7(Tp}=}9J{&po2 zdkq)8EVAI;YlFJ>6CdxZYx%QV2`iKFuO!=x<;NT=#Pz)DHg-$B+k`v}5*R@^XNx_f z+1AtFwAo0qNP_7s4DMG^Pbfe>2A5aATcnJDyUW7RP3txGOxC=f@~f$8cJ)c>j?BFQ zV;HnILKW+L=JozBXEpZu^7qoDF>e7P7d z9FOFkFU-k0-rUY3A}RssCV9u3NrXXKH?iTbh{nM2-+|fw>*2dN@zu~myQ-f?war^8 z=h)+*^+(lb#u(E*1*=uVg9Q@c(rV$R#qh;nqK(h>n5~C?mvL;7bF#XSFfdESECAN z)BUP3tHz1ybHW)is;8+q812E8d%EnG_N^WT)3Z-lF{l+W7YFnfNTT8D_~@rW17L@ZuXvvd`SHPeAJD8f0EcUk-S zLE3I&e$DvX&SK(y&PshcXVJl<@V)|{N1N;OFC6Wo;@1<}+hk;!QSbfcwUw&XqqY)v zUvfJk?OS)blI39{*|ncH7V6~(+bffrdYKvPIUI`mgZ#kr&czE1$cR5xF-rqvrvJ>= zhHgHQz1Y>Yt#Tgzh$H-5W$@64r`Y78t8G3NLeSB7VyDN<56ZF4N|n~YKACwQsVkWP zKzYIX=Q@sy&eM#wX9xA>-tP9oXUpQ#zQ^1P=x-g{6*YusP*3Y+R<-R{^)0^6+V5P} z3p3~5Pr%%L6{vCPqj$ZQRXS|C)4Ih2WuCk8k2dm zw*cDH+O#VUNioBD{hexK4a9XSu_mZ`T~b^gBsg8!idmKBGTpSFmJw9`J*U%R{y=Qn zjJ)#4iOuV0$F;feF6ftq2jydsWavrwu*&VP@?qh>l&rm=myt69!9a!-8&{e1i-(&m z+9FWf_T4TDkv8dr!B!Z|9kOAFOq*E`Kk#<4)7Im7*8=I=_CO)9(qz`10J&Xoe>8j> zRCEI4xyQHF&~!el-#fm3bY^m!f49NAD!06cVY?0QCNNpAysKt73v{u%sRwU-8cP(z zv!nn?!h*m?0)Fv62_J`bJqc%~e{JGg%qTBRxa^7xO)Xi^vs+wXsms)+O&nfT1xAQ6 z!ZkUsyz*8z2j3Qioyy)y#QWW-p!bJ54l)^Zsfy{hu92YHJNgEKDc8c!A6CrD#G`BW zJG5>}o$Ek-zYI+W2kq%=Kpm1VBg2~mRa^=h*RFop?|(GirSnLvbZOrDCbK8Vt+0@s zdB++pee$GfN5wlEq3wUEbw7FH0TXl)JRKdiZaGxk_t9sqRh7}R>0DUFF6Gy&Z@*1h zB`4HUs9~73eOIfjI@m_CwVb(Jw2pywB{#iSqtlpS@+a*qMS-mA=3YZAjFc!V!ON|M zX9D{fOOmeT9zPi_-TkM*w})NOdO;4v-cLJcZtZMKXFsh;vcbupd=p2c;-Qf#kK;;p zW!58V@BNJY%?p!PB0<03um)67^wryPRpevY3+(QGal0(ngL{)N&#icPs=uxaLiPbW zJZJA;E1P)G}7u z?&Ij+5N#ltg1zh;mwZjH0*#fztbIeg*l#p0nIL4xh&mQg@`W+znG9zyj`iM9>|yCn zs{~7VNIIPSrJ?TbgXI4Lem=!nZu)JoxXVT#iKT-?#K(E^*IDP|y@Ca}-R-i+%dRBB zJk0s}b%$lQ?K3PS1>>1^oz-v^Q05NNyoc())LiJTOOmwF>&pZAx|~|E(*97Cy^s^Y ze_suDNuPRGv83ufkrWBW#|$~nYHVrmJ^`b6t>*Ebe9+}a%eN42j(xTs{QM}VQMt}> z%lAA6w!-6Y;T zcLb)7&eS?mU?PRU&gOHB$f%y@DztO-U}6m)wq}6!rL|51W|pUbr5q$N7w5< z#{(oxdInZc><<*VE0^Wm+>@uyu^n#v`}8quHXxm)a6is&QD^~0va+x8)A~T?*0t2= z?$t+|&j(`H+TR8+X{Im$a_U7m&rf*I~;Yvl3SK-3nt(njC0XBka^|_VZFIZnB*&;YgOz^iP(hPj)=kd&LQCC(le$Z}>+TA_9=6YEtxZ5}P zP4dO}ue@1Yn|@3{)JDm+C-?%@ihmIej(jh|VL@->A-KVd_UEeZmqmye6<=K~CjTA- z7F12lBdC9`-H`2TU@3jwJgJhCNS6+(BOtiSjwB>BJZdb6$h4Ldvr z)zJ5iunL7{_{HAQ=LSw!Or)5O0MNcY4!<7++RgKDp-VvXD zV`@w$4$A&P!2TbDI$dB9>3?Xt;6?!|u%sz8EVw0~tjK%Fpu8T+lc3=^4lylE%Ago! zi4K&GM01G2AaRxOdxEDvnI)OkD8{Y0FeCh5V{{2G!@ zGvUv!{52@%CX_`tg*_KzS3V60a>D*2=}9$$k_)+4a1snfV=j&}!u#>OEE9u#7s|B( z+Q{SIASdvf{F6XRnl?krr`Q^$lt=^K5#sLwbs8y=hNe$~-yzDCm_me-MomD3<6@0oHimL=y9pV&?^)NY#T8Uc2lkn%zmy8^C(gc=c_lc0K2S|jl{2H zm#}NbgR_hMVD&`A12ZlT!Wx$bAu)+OVzr>|x+Qf55jn7qI2+=ORQK8??GIo1v{1Zq z>451=gD{vRJxO(bT#-FMk3?=>-DuY!REdBHI>WEfAFxNNdy;9okTr?`gw)<49pyAX6m*8;vf`%%i3d10%m2g#k+j@=o1#b4Ks z?3d;TSrtl>_rkOi=oHIf@2{=A2HRYsA9~(HL}Q<@d!I+LJ640Ui(;Vv#Q8vaBK=6- zg0Rczz&)aE>PbNOr3=2fPc+HB+n44%$y8Xt--%fu%@68s*a;ARK^bY=Kpkn@q^3C+ zePmlfKq(Lai_H~)jm>XI@r$_fd(eEM^Z+9kf6Qfghw%%z8ob~c5xj-9${bLcME9rgL8W8X#nVnycb@9*eg~K@LlGO{u_h~IS;tq?K&R_J<&&s_J}K5 z55`vk0mf1D4Zt<2E09}R2%$^#k?@7C1$no6lPHO~=X`pi_u~od z5e<_^x)-!v>kFZgdF40wHUB=E^pTH~k3-hG&p{x4~ zyb6^Wuz`5ny0DA(10* z1u1|MxUv;V1{NF1C)Y$DXF~KYp=3FefImZbluxJ;AWQj6HBh!cC}O@;m98EAOok52 z=Md2s1t9((U3-5FW2xBqP$!?qQcfOgDClj~+*zx4-pufuiADLD!9{tFl0GvhhPc5# z8>;_kVIMdaB7NFea1RerX`_}5B;r7sNXfi%rc5#S6ATxI3|Fj0*;p_i;*z{l9v7x) zWib~9k)Wb#xK*Q>h4(<2sl_uuTA%(OX+?yYVW}|S!hqg(`FwbT&-fu^5FMf@fet^% zB)TO>5^js)OFy=U>7}j-QerTi#A-2exhbj%T1ga(W?~ZHBPBU@<6Bsayca@gQ+fL=)v zo3kp6R+dzW+Of-wnNjh68K+g&T%jOR)=$47;9bS|e`5{yj|@=&UeK%+%RiuNmMT7g z_WUd{;-la}lL_bBKx@p-N)YYEa^M2}%9A%BxKYW^F;s1Bcuw=po^*p4qE}c@* z|08T$-&b3zbQrNZE)4MxC<@}=_|s&X(!VQEL8c*kC88zGAK{AF|HZpW=*flX7%>C> z5{MKeBYKs;armqc^X#jze1dSg@m&0}s)l4VBiTb?;H0 z4V4tTf4bJwEm!>_ELBjC&(E>nEEepnr6)H6(O-@KE+hUg&-FY2{{I4Fpet(ekYm}u zhX;#C_p25AFd%T7)|if4Z{nLSPZepz&bq*eO`aAFT@RO}fkx0{FhhWpFj)#6v?Mw) zeZ(OZwCaH08E%Vzx*=oY{6r}9~dVu$wwh)&LUzb4toWT{Wf5; zlCK;4EjdxZg;CJwg3rfm#%}oEI)mH!AD`8F32;#Z|D2{D6YFQhb1eevYfj&o{=Lq` zSJPIV-#_b4i>kTL5UQ=;s5$UTiwGg@qk3G^y7r4fO8bpKhq5_q+gQnF=E5B5`YAd1 ze>R8P!X)hfqlpX7PK3n&V&qLn_*LiYK%nBfaDGpJ2IcXnU5ObVwQu2XV9S-ycB4j% z$W7@@@((?pzCcbK;ida^z++P>TY+xg%P z`Obu6(8TVQr^q7?D>sj>Tk7cuV|v-=M!om_kM95pk94Yw79R5dW-sJH92`>rV2bo|zYrp$_`nMXj z_K3~_iffUuQOWfys~-j_71izSN~9v-jW^Gukr85XB#4+h0aq<5s7^s^B2|p29HLdU z*odFH4_!aKnu7curiKZCt8{vd|0H0Rx9g8-C=8fajX$P=y7W+n`e0b#(hn_`Owx~O zr2R(Ap{_on0}FE}6%12F4*0CDh5sYJUCB|1GhgZIb6RR5j>}HS7%JOfU!H)&E>B;; zcN#E#J}4-05OO{9<9~j#yriNB8$x*>5(hc*0W?+iG?fq^n~lFbb@81~oYHHTUf>li zm>(RYV`8F%4Eqc8!S#=hBIGrE7XBs?O_Kxxi}MNo>L(PGI;{3F{1rlX;xW@uWT^N> zk&3E7(y`^k5bOWYSneMQlu`aA0O~1@x_0b;usLh9FPz4)+U@L3HMawNpA#sL%k%Tw z@pB{Yv_cdvJ@8ahQdE;LGKsG7F659UAQ?uJh{T(v@sKndvv6l1gR=!m}JJNVxPDBukuhQ*Z(apIZhvupL)iM zTN3m%oG9G@@gcTpetRwsZFv%Fv<#mvw!S5PtS2vz37iE!7t;tMVVKY2R~fM;3Q~Fj zrxF%(qz3dyHE8LTd|6qHxE}>jO~sW*2d&R{i}cS&)l;nhO}UrUZ*YC^2p`#)IY+sE zoKO(%1G=7-D$vF?E%wXQx2FMg;i#d6+vG1%HjoxjrT!U~#)Dj<&c?o@G+#_&V*FbN zMh03Pw!;WZM-Oo)|HAf9_M&l4A6ak6nX4Mn%oF}6P630LeHEBK_`4~=kA2_YsaZ}t zs(;XBn+k5+(__C}Ir)Pz4SyiVSUH9PzH~^hfX_#*fDgHiK~BvfF1Kfao`KF8jusMb z!o;!5^d&}Cq_CA^aba-=R-ccN@&C3YHi#csCq>>L`P86y$~1BR13Vz&bN9Ba{x)NG zVhdx?XRD8Q$0!AQV=199vS3qntENE_)qtgllGywZEMzOC^>_)R%Yu&c#To51X3@G6 zL@OTdY%_$aAi6<1ba|=-Y8YhKZwBkv{KS!$g(JZXdXaSC)uf* zVy*Ef7nJlhv@xoyenkP2^dqBWMU?%LAyAK-?Mf_h#}k*Hf_ACXhRvFcW{H!z^Ol?m zT9oht(z#JLZJGRcUNdO=G?+&W8h0JkXZP1od%_`4Jzjy->oU~4KO4@4Ers1304L#v z=jGlp#+zR6ywfbdnp+HS;lFLD%M|U2PT#C2t{jf*{1lxPHE@9JNpvol=VhS?I??#* z4vi99WbS*b(NTkH_0V6)oHxtOsSVL&b-j&^TxYu?Y)PrN+T^b~qV&3{_tft0dFXaM z^qXkQwd62Up-jAQs2i4=V=0qgx_*K58P~a6DufqTQQCsMN0Cokcl`0N-6U@WH?z+` zX-=!S10CHs4NO3m=yYvzm9AXSD}46BE)I{Pd26?otTbN}xH?Va)jWUJQbG zsL!kVO4FS-*{kv7-~yxl^Mh{XnW<=NoArE1&zqpR3n9QEVQOw(LIBxb&KZUCJF=09 zBuLp&dUTY{@f&(>i8XJ>{*@j6_}p&KM^)8sjUHL3=pC@sipgI5O!BzYSl&pzvNXNQ zPUU>N_qK!R3CV8eK7{tW(E3pICnk!AL|m*(qstGr@KvG8f^=wxmDR0LljmHy)U80| z%Ecg2{J=|(fVYi&17Z1N*n)X4IV9f#zdk#^6ylz>6ktyDWxaWM ze%(#RybEMaYx%pOgfiDwOS%`Q&c)2V#LOK$5)+#ti;zej>V=@%h9%ihN}47Nj&))$;C|-%i1mz2+R3KE+hz`s-K=~ZK%!Rc~9-@NZ)>K+CyF& zbT#7`A5>8w=*d`{IgiNIBU}tgzi??;Cp^UAM}ExU3o=7!0^_(Z4qcu|TSc>3<@^rM z#stX9Tk>}26QAj|%9Y7B{6#rk5)#bZX!vcEycSK{X}syg!0|Be3uo&m*7oPsHYda< zPdBB8a{=}APm>wX9bgg-uF7J^n(c#y) zGZFqu?q?pEyL0}uPYa|ZSSB!@z$7?CU1pLidCdV>sw2C(ohr>b4ICjc8k=;2<~l^H z3|=!)UFILX+(`wi{=%dgirb$7*Qb;pH~3puLMbK04Z5;%!|a)}IThT5MBGkhDSQDu z68^u^Y#6=;PUX(h#Ts=Q+Ytc0--uxnzDtFg?e*Kr= zJ(%Zi7aCL2Iu&bKNZ{V!iF9j)+qXDhK0BYLvNB?7rGkc%63-OyBkc%s&KV?M?*UC5 zs$xb;Ds!aYT%43w{GoXs9XXK6_6>-0`khlwBP&w*e93mu-#U>6s&ZZ58IAy^_|%o* z;jtt^iJX~N0ls`$`M7mV5jovLnF`8D{?I!n6q3OwZ!?Z_J`nRpqNIto}^F(X%+L=gt=&Nm_;x zn&;alt!WGLvH>!k=>BGW1ZV&6{;2G%qJ*x~LWWlU&^J)E#{y6sLM9S&92d+fS91<;8gtO>H!hxA{T~bDgtrpT?>pYN?>&JNnLEI)X?}}q z@sYc{_41M+;v1M-zQUXVF{RF6!tO9Ht=!lC(HvuBp?Pbr&Es8zxPw}68$>O71?2arPPur8{i}_S_{ZyKSI)}f z#nFFF8jA9i*Vf)e*MGTUh_1Yw>U5 zPbpsoukz3Y8^#vI1J{qV{TnV%;oIyXJ zr!?Ii5CN^Cwg5s4gs=Fv4`I!;mI4l%^ zXA0tmX(rB<&5c%w<+z64TGHD$wn1X+^n5K|YCG|D6EdU7C8G)iloLK%54kx}KeBp8 z_IS&zl7v^Ri%hJuJS4}t4mP;D=!VWG=RF_)-G-*y-~seaR`~)4=L38~zTB}L z&zn=k3rmT`O3opzIlR8Rb-Y7zETE}XjWGF92$7#)Vqe}v#1Kz)DRiYQB^}AQUd;y* zw2f#MMlw(n3~RtpPh1b9Yl6aE60vqpF!l;DHUYaor>UEa4<3IR6+YQS9<-7BN!!#Y z2t8|h5Uu$uZo;C4hj_?5kc_)k2k>K_LOJ=XjAmdnZFV9ElhX=#A#sSa|JW0>qX)nh zW6y(a7vB0e-@)uRm?)h=^^V8@EA)WV9v-r~*l7qLP=!GRzEEghr? z>i@|BcHz8s8p;?35Jke|8 zgvSsV$?BIF7Wz!NU?_ag-vX{j=KMJ60M(Vg@c_9T%!!+Azol8->(`>{0gd}EOx|8G zuH1#v+$Y(xCU%B(hL#g5+&gxGUJ)oAP{7W{Sz2?jJ&?mu#slsUEs9>8ukEsiQ4I)! zD`O_t#!;HkiUbgW`E-g0le-|4ZovBRzq9*+Mws-Acs2i&spe9dDX31DY+BO%F~I)R zLOw$M0QG|J$IpD#?hu-R%*c_#=gQ&K!pC=h(e4>nS{0+NF#t=Fg5&2oov47|ptcBe z=bU&DA^tF1M(l^bHU`5ea}pQkmjXQ5z?j40kGTfJC+6TH1#4vPe7{kSOy72^=PQjV z^WeC>}ikI8bZKj<F8MEpA*U zX%GLSUJKcLSr<8fjvu9PeI<5NWs|GylS^VeuDu5D&-A}vRm8m0GYmw^*}?l=di+F@ z%d%9A55zce$F-~#e$w~G%?Gpm{7SE{i&446$$lGMrV)$F+1Wws*pFv2mfmJ;>Z&uX zR^~pRb1ha4oaEIvqwiO8$F~FZ&BTP~`cGSXoMnovg@@#2)y`NuMt`~@g1SrA6|Fda z@SQ2Y8G<7hu75dlw1=0n03fK-I10!N-fmcaP>X$87*H#;^LbNty7V6+5>-syf)Y-t z-t7$a#?AcWN48&I6=NVI4l#i+X>{Xw3g6I8f*wO5i^Sa26eX`KV7?mxa@MFw z8|`>jI=VeOlZ?b>qzC}Sg(=V0Bv(5G5mfBg{x1M(K$X8w>~Fl0dN1|STW?{EAI1`X zE!Ha&v?U|rJt~!+H}VIF^dTM-u~!H}l<=T821$^g%5x@5z{2so#cZ)QMCZ+`KHN|> zFN#?WiGiv_byP_oOQ@!*RxXg1kZ|qMV$zuUY3oHLu^It;m}(;Mwoh<)c7I0Gktp8f zDh$DE;s+3fuP2>hL!)oJae{BEdWLb9dyapZu*IjfA4tE8lh-=af%J{ZLM(e=HTuj} zzc1=r;yc@?wpw-fIk_n2Z{Q%2x&nOxP9A-_bmls1ABH?Ag#uR2C7;S{0==>Ttun1b^MBj9~=}Wy)%8O`N7WExch%ZGLr7aMt2J8{J#KXw15LZCM=SihsrA1zPc{FcFed zumnji4Ev~&z5`u3Bqt}Xni3Hb8JN+M2Ma|goN2LRZ+PzD0yC($$xX#N!gx9GZ`c0P+BUdaQ~Dk zlV7~<<_{<5<+L@_tZHuDS(2L<30GehpLT6SkbimL!rbYu75B8woKOC`{-@){P9}AE zq}5#Pbol&*xf4dk+g*7!uZeF-{r;~UA1SXpNc-xAm=e#4hanFd;hbcXUT^gH^#M<* zE~+o{%zxIcRj-X}y?ogL@SFXd-_M(DHrK&U6ESi1_tx@lJjZKi0kK*OGYzsyW5Ncx z$6o+Gwkc=^)nvOq0qOrUrzLwa#+kwuCe3kWB${eB#(u z4!e?Q!gHw?Qb)h~_}H1VXDpaQ3LhJPh0o{RG=J&N|8b7LYQfa6)lHg{n(Pnche9)= zMbq=S@;q;IL2es4^2gLO?c-+=^Mj9&*oHORY^u~NhR}iAqVy(H`@o z{eQHVqN$_DZVx~*Ndbuyl#(K3N=hVxX%V621^e~^3nmFI-WP6rgpd%Sjs61zJ5ycU zw+9-9vBHmzoGBcjlPMk&>DPsq#803A=QwS!C)q1T9noTAw7xPpvTjUpQr!$;fw8l0 zLDM;w4Sr*+B3_lOXsPP-%&1sUH*0iP#eed;^%dLewu~^0s59hMRj5=Y_b&0^sDAXl zD(&pN#js4j%(gfn76t=lL7T}I$P@H6L8b4-ZUe@d#s$W4qk?kZYd*g3#g;F6IC_}& z0hr%(h$UxpwxKI5tclmw)nqo=ELK`GBKHrO40hGl+T>g>Qc;&oB@telGI8Q7Uw^yu zx8ugPd~N4>OUI3CdFHFTo*2_I?wsx4yd>4vGizG!$Yjo>WKn)#)MEdt(xQ>)uk^S3 zgGJ=KUEgnNYH1xYVo&FeTN+f!d-|qb)=)coM67c68Ov{NR5d-!6;GTqt*L2zz?kc< zUNEq2{NzewskLZb>(Z?@yK5BInt$}?IGfsmWk8Ls-p$ET8n?zwCjMCSl!p7Uh7^(# zZXAr|JH=V54(%3UgIc4}XeCjwVQtZ9Rcb31qb+0umYE<;LmdCzjayY*OOw^6*F(Ej zqa{2JnKTAy2ZRh30`n zhYrb7Iz;9Hjv2$W9PuF@ud5<|Ay<>Xq_)pXmCYk>Tz$3p%;!-OOFhkvB7aOduvA@x z@f(ftb3i^+!_s8=EJv?nla04p%Bs3@Np7y%AD8&@xLWEpZ8ULCyR|G~nquNiCUt>B zE*&-;$ph4wYJxS%8a}tou7B={n?K7o0<_*+8!}}>-Z|XRaIAD-aX+av9N!VzPTUno z&lo%7v1v8<*ZN9Fx+`-gxsy2^&NFj23+r`TOAO(q*lSo0q|c{g3mg&MBM+N}2`KzD zMaocdB~e5T!6Hr;YYfC-u-9x+5f#@}M2d=nH5>4bT0?QBKQz@97e`IeWOPB4_d58+ z6*$h86R?Rkp|nGh<$t_+nPCKGych(F88XQyH=u)KhQa2Njv}iqbXue0b5eU#8_8}m zrSt2ft2Y%C`liL>+gi@JaAf`12~CZcj-9ZxqH1DJUdhUawk>}0EwTp3=-;tZ5 zI(Kt0SYDlI_{sUZA8f3zs>}@}J*gXQl@^B+`xRP(9>)@71b;syl95j9EZ<^onL$wT z20iDjk$6{)T9U9Iahy#@Zh>TAYJhWLDakc|c6gro(|Jna$TS)_co*biAo+eRxf(f;@R0v2MEJmeh{kWfOm}UakJh?UUzrald~$b#F&|M0}=r()`pz&tLJ( zh*Ih3Tuo);<9~AQ{zlx0xtkAHCG!NGL)YM*;GSyfbWYD%A}&*RnU`4l#BJ(6^JZ(G z&n(h>q1mdY+3GuxzAf2AvvmfFyqdl+35PX&)Ud{|-GCc8b2Xel&T9?fu*wj!0Td<+ zNel(&b*L5>(74hJJzR~IASy?g=4Yl~RK|t{81=ziJ%2Gv%>qpVI!q8ZE=>LG>eLOX z1>^>@{Qmd0<@tJJ^;b;mx_;D%R-$^#UTaUi!R?+|JP~toJ(*8#9y>DiJ;x+pu%c;H z(}69iBY)*Ml22T;#H-Tp@>?+P+)$cyI^!;0t2NfBG)|}1VF&Ogy+j+8Lyf_t)0AjJ zo?#6!gny+$WYg0?oWF!^V02ZHfr*Jcg z5$}#AN7#yY7op@Hju&ch&Umc5QJd66u#+AYO}R|VcQ}!qA_-fM=8}!vO7WQ^?U1>W zYByd<51%BbVdEr%mY>2+5jiT>YVYLk6!&OV(|`E6!UA0vzeZTDU8C#cw+mae+jTmf zR-^N2J-RYoj2|g9Xh-Uj{1jn|X1vy*#n}LvNGCmaQANxua{F!381PtP^RdPlMe z+XQhFZ5XH!wX`D;yh2n+2uYz!=o8d}pw?-4qLwsT9WQcr=rx**N#j%_Pp^M3#$L3l zdw&cV@5nq9I2?vVQ=&<3NnH)pR-9=9Fem2G2LCKf6A~sgU2q7Y+MT*2^>I4&acU2_ zlT0Av$({Tw1Ltwujuwc|41~Bhl=Kp>#PrhOIKpGXa==N%jkEeVNs@8gL{*#m9HLRl ztvg1djNninlX9H;PHvA{t)@R4Y4jLFI)7K9#++n1?G-U8s8kb4#S=kN5l)RRb!rRr z>XJHQ)&+GjR0K|mC1(+Ov~nylngbC_LpGibKqE&7&Jh~9Ow6$4Uzxgk;3uhD$S=t& zWR_q&@+a|`qqp)iu??bi`yHGQ>L3iu4+5bBE<>G|H5}+@W2~kkbRcucM-P>tVt=Bp z4k|YCn>CyjYjJK3uhlzXNr9;#S-`om_U6ki)n|vZ?NrvNPOz$GDr^u)eCQTfd?)pl zRDbHu)DE(PoI$3Nucp3IR}tGhy0tG}(NG(WZ5cggYk4fr{ULQ#Y9aX^=^;zV4XN(b z)fe2~G_s~L(Rk>Bi|-yes-~f7^ndN3w6}K5I~$G!Cntk7VokVJYz=P^H|D8wYP4Ft zug1XZr88j(aP~|WZIQd^B2!Vai1TUf`kumL9W=Ft(dvD8uvey)Tb_}~ealI0FpZIY z%&5XSb#>=XeI&Ju8*}dc6KBj#?Pw~k>7HKWt(hOrZMGKr_#;anNED56xqrMVkN8Zq zy8ixMi8&URIyHtJskEtp_Ggoqx@_y^*T$tmL*8lUEhyhq=6g z*TrW7mDSg6zV-P8xvc&Sr%6h!u?2D_)4Dc3{X5}(@qHX!J#`QQ>AA^iv|YG~3X9gE zjo>ie;&pf{M;1=JS8d#IpM~vHp%YsF<9U~{+-hTU)INH!$K-5b^ z(?9%5G28ZOfT zzdi6atp)>C8Edy}VK|T)C%l8}-6SXVcBYrP09%XSJ$m0cilygVAf1{)h|nqqVot5hUhr9&_eB7gEUmJo4c3Q}8AK+Y#Eq=n8q zu(dYvA7ki0#nA7>(CgsygCM0}z;bBAP!-BD=~+-G(fdw7WgOQgjn(p!q^6M)G&pk6 zX>~wdG&;~}L5))@Q6&m0qS5mF&jgKK5HtkT>Yu5wF;fvq3!H!**H#DI>9i z;?){KrGJgl$WeiQo|f|ow>a)I*J-uc1jvj>3?@U+z^POMHQCCEK&SFJnWx=zA`)>O zo5){S;g&a&`4MRd3G?WAA=+6hf8x&6-54(~+aK6lm*BLVqQM>Y09DTtkWCna&m0Nf&6Ix_WVop zh5Y?Xd7f+h;bpnG1CJZEKfE*bY3lC6;(C>R;N>yXQcq%Wi+^LD zxrMJnDfA{?CAR#~2wQcig`c8n_q6(?qEc*|jkK*dp<7E`*gUQpYKnC z#+2FD1aZI2>r?eba5gC$SLLQWA`7_@7YEHV8N1A}Nynf8COd=VZr}a;nKR}uK6A!f z=ghlrez{|0eqq;$omX7<)iFK!;eRS?dG3^w>dxG@@#9~+@`m4zZ)=W3Q_tCBc8CA| z>wk1}uESAoO+9DG(-}>eBem(@2#5^s78H@!kK}Ph2220-H-9r9 zLrrt%a$zUr;>c@BGF)JY8%A?egwclS`RlkX4#`V{UC^Y{LEb2pu*Xf@wDHGmq1&Vf ztBu=j!Tj-f0$%M|I28=U5&bcCE=oY&hjeJuBA>L;n& zambWII3f%XvA&{w)7X(4D8F zw3S&>Z&>^$lZAV8&H63NXkX_5;Ag0Eac0<=Y{LFD=>VNEAz4I&WPbvaHvmCROq0~8 zG#W5U5>Qiq)Wn-CCg62mFq(});~rzbQ8eOU%SC@8Qf$E3R#p#GC1le$$&3&jj*x@a zo^VYymPDF!{0yIcX5sQl#F_dmb>k(M{Q8xN=f_07$~Jk0=F_9!;MaT_c=Ab|hK`17 zQ=P(jSYu4k0DZ|bntxR7s-&$szmMDO-;&!`E0xeZaqC^~IybF7Cc4`o3ZvtKVN67A z_6EH%Z=d&RujuuLMmr64Q0z6Y8Ikl5k4NpR=xfY0ZrP?y9tSCfj*fu_%U332#1m%5 z#|-^7CzZ^)5MSV(SooFgHm~Q5M05_haQ5WMFJI92*n|@A*nj-Uv`FXKxw-BU*G_x+ z@c7ZA`WMW)sNO)P;}~f`Z~orp<9mw=i-He-=jD;3>ijn1(Ym!dV?kbc!8k`efh8dC z{9jENJE^Roiss`^%)1-qn%0oa=j=9nT-&PcbBJbx)M68igcu}RwcK59oS=CPt6iDG z_?bLbPGl_hIDfw!oZMKl?VQsg+?d*1FywZn! zdYBfP=;26a_D_EpC2!LkYExe)YlTI7h$S1-_wXJ%_?lpy42a^-SMd|mHp_|ju zUVjb^7J9kAcujZ!`wME7C`dZ2NsW-3YSnAs$e_(P|bYd_!KhKvlqq_7=Zy?B3qOXTYf;fnqj7&Y0`a{nJ z#ib#CNzp}1mTWI9%FoY_Y^I~5RFCj1rhkERbr*YvKy5mZid#g47q=+q~vdkTwFWny{*j*@29 z*;=ko9~!LX2f;||ysi#o(y8=V+47(?=lmwWePTu3<^~!A_sno%Z@Hz^!n@V#pmV@1 zEV{wjY-y_ ztvI3ATk1kdyuB-8j0@mj6WSi)LZRY>U)UoMK^b5OnO|geb%LNvfF>Ap8GUi;X4g3D z;_(qYAMy3ME_3a{S-#+k4o>c6vu<|CArIPJ4aY`?$2zg&=JrDl6|>WOT7Oo_t6N_i z=l3KVD$f}=;jDOj@s{ZM7qm7vKe~0}Pg`=VlMBjLHB4LZH!v%-gu<2%%O8wi>}%><<29^qSl^mm9$tyT^Xz6KxU+ysY{uWE}cGEjth?^Bz!w{)Y!~GtwY@)vzV7&Cue-L!(H}BHeVWLDU(tjGN@j)teM8gZBRuXkS zVi(IuSS*t2NWIu7)#zGCyEs8=(aq*&3Ny85>Q-<)!cuXGdOO!AY>+l<)@!%uf_fSW zwO1voKtrezg5yyaMQH-GsyJ$dP#u?OI0{Z0IaMan=nv!A*jVJ>$LRv;SEe z$z8{6BzI+OB%G*|1R%U1X*FtQ3H@tplFG@n@idYGDe{yRDU#_D0w)iRLT`fv!s<=kEBtF z8l6-0=nBMA-9mANPA);z&VnN>nzC}z65-|4;ul^`t;WICa&pbDo+VeLmXYSvgIpz7 zm3o+r9C(qY>HzkK*JG-x;g1JFmHy~1lL^{Yw5;lAugldv--$vYS2+ zq7vM^Q-3HRg3rjJsJ3io8glcBQQ^&anonWCaHg)!8|sB{S@wm-*H2xEZ2jaOx;O zCx3}U+|*_|Q+)1)@!Lzhw(*5M?c68Y)NN!2zwziUI$?a`DZO+=Wtp~Aqs$j*Y(Bx* z1YugTTF}kOsXTq*^tAKA*a95(S9@&>cfd@I@mvcN}HYa zp~K*Sj(n1x+_tohe*B^{epC2L>c+tQ@_)*SCHWP?qRcGUzxL{QES4iU|MtF^BdYaw zYfE)@9)KlOo(G8k+B^VH!;#)%m@Ui^CSw^lfeQjq1W~Ai1dN3#a3(B(C9nq0hVAh4 zp(D9l?7(bu17 zh(7W36Lk0yjYiE+KVg2t(txV@3925y%Kk_+vo$}N@qd!%FZidwS%>rJ3lfTytxegw zlx_C7`lNmG500yyC+-)Vbp7o8_y%4%*Jl>=Vt zz@0bfci@g#ys9dnRL0|#i zU{$ncU>s`SipAnwQ1O&fqw)uO+Dq|RyaJUI-$YTV)DTqz){t_@OIn0bvVYVAR-GwP zsBwq}vm_Vz>cdr42^6u)lZ-ikuevG@s)pk&JYT50^R6mQM zj6yYiilH)5O-enO@7ZL6opPqW@rUEVPNkvC2?3l>ciuPi$w@k7dF-M0o#R z!}En;57iE-e~saVHX=6l8*)OAKN}Ix*;(l>Ub)JXC`t{QB>v_1|xSP7eK$ z4N_(-uByd2#AqCHb6rUj zUT{h^ij&PCt`ql;PlLKlBG9YI6B6MzgVj{xEgfC%vg?i3oT4c+W>b%kC}hdi$u z-#YH$i?*&=ot=n{Z+~d;dfQ7!jHtzjY8$DfV_R!Z zdDMalIq${p?wvcuvv?eUc*;hGOGi39mekw6@{mn(7UUGToX1bde7@`)&gHBwvfHgX zt=?4n-SfM@HajBnf?&2;%KcN;P6#^GIK&3}!K4mxMbG(6$KW%hB) z9fX&c5?sdMawB<*Tflqy_59z2%Y~Q3Z=SrU1l2BefqFAtu;Zr77+jV}Y0VPNYuYim z+^t)!yGHkheiSaRoUnYX|Jbn6@JnODc#X+y>M?z4t}`#gwNv6Ueat~3tQO27Phd3Eo@;6TiC)Dwy=dQY+(yq{v8&# zmM#CriGVGCQ>!j@sO^tvDQ6nW0|wzGvTY+=j4$09#tGK%|vei2IGfdeBh8C`%J z09hB&T??g(E`S@4P+f)YDj1{a0@xug>uPkDV3wi_;D3a1vM!;!9#$&40A83c>-4cT zCu~x50($Q2ijLRe^A(+kQl3+Eye98dbP?QqnWC%Ey+zU0uzv755{7=KqH7?BpRMRR zXyZ33y1{7YACPq|O$W>CijL`Ed0N(W=x()quIK^;E$_>^o`%!vRdfuSRWIvCbT?ZY z61pjybWBg{1X;J!@K{$WI)=xZNjC?&+pQNVx&V3B zEwb*E{okVK)c<#6-6Q+|siIT=2V~tx^Vj+ZMaTTLzAWp0Ie%v(xb&Bfi_(Sm zsDG`73Oq6z>&!~ru0^*cc>VQwR!|Q0I$YPnMmaNLDg@y9*v(euayk;+6 zX$EYTwIEEy>u<)ZZ;`uYKkjJ1JwZg%@I{CYC)9_j=@tmco zk3)U6e2qo0Lh(BR_m-k7J-Puyxo$94Gk?&1nH-aqe>Xgf<S$do-=27h|w zJJK+(kYl&_gwTGm1TB&GH{hMKz8A^Y?vwLnnH;u?AFJEJ+e54N=A&Se{@=}54pB$13CB#wGH_LTliJTI& zd~F^w-|c(hG*KMFQz>`XQiwaqyLf<>eJ9y&xGOsnzqN+R(ho+gKg$|Ip-D)*3Y40kiGjC z!!_c#GC*UJiOYKVe%aQ0tz5%5%jJju=g4ZgRqOt{G0l{{?h{H?rgd7Q$V{v<`Ubf! zWm-!b+H7uSuS0#Vlv{znUw=k3{mN=3XO3MxTSJy9sk~NhziI2cOiAZs{mcv{r5DRB zz)Cr$*_1x9WS7ag(=F>gN?G_~%X@NdC_bs(=#_g8dXE)y``Rn#Y&W{mR9YgpESY0b z<(dmlYRyZO8hot9ST~qz+0gte{pCN|KLvA6y2ixpHG=-Z61^PVGJkoMEjhh%&%RRW z*N&C&|EmdwB3?`Csv>R=68cU&8v$@ffY=vD5QX@gfQ`Clf-d#%zZX8W0?a;aaU zt~}mX>ZfHugBVUHcO9V=$Gv<+#(dTc))6JxZNjgjZjs z)RpcNdU9H`Gv%f@8-K>XpTDS2|Nof#9=NEA?eV#H?=G;wihziOh)7C^uzU9p%fDs+ z@kd1DkCGXYA|j$9Au5s?k`b8^5h|e)8W9l@p_$LfKWIK9o*9`DnUN8xk@D2g%%{II zb1$%qRIlFqe!suZe9p|7GiT16nK^T2=I-TUe)@nJf52pnQh&*Av&_uj+}p?Bk%!!g z)#s2Mnd2VW%lQoRasy*Oyfz*+&aayGdq6MqGbq=Gp&e;p4l%x*>^w_A*Ma;Z6AQuq zi<_a9AZ=);<+M&Ax-8;%tW|?^Y3fh7IrQUad?i^a%La8ASli~d^zV@q{uRXn*eDP2-^?5pqVL8i6teI1>2s zDP+bTBzsaM@XaCn9Va6m;uy$3M0{O1awmD5n*sbWAPd(GLvu+RVIVDmaK;naGl3cn zX&BFkYZ!ns2l5z?Al{H`F9vFHH=ODG{>W)M8|dzXJv7&9I%#o0vzd^K2l5H-C|4K6Ve1@*ys+e>y%kkdd23a@=ef zNNzTnD_rWs&t*L6$M9AkB$gOPxOAk)34<0APOO*He!x1pHfEVM}Pt9JjL zHNr_5D4)a6^u6PPM_ot81nZSB*z#{l_Wh0LIo$4LUWQMC*z2q&=d2u9{pRHn9@ zw|rL=Ou{U(Nvt5pHhiei;2@o7B8+kT;Qb3f`0q20ia#OEaQbNbp_dLm4^2BSl7AL3 zN2LXVH>(6RMbi#)Q1N(fzKUAqvLu@*d|YZfs4XP~z19#l1#=jY13f1}<{%x7GnNkG z2N$eNUy`{vXGNyWPAb7f3kQq%MXAeIWTwj8q^_7Eb{I2r$-?XvD_5lDxEoevXRXLy zkh278Oq5Q*FmM@x?kbkpad6s*uK__(^Yb#Sp1El^kf2CR}p9fjBNmjaH z&;N*Kwo+?cZtcL#oD~}{n<$!~}*bS@krzzrX)9wa#B9 zyI(qq>yhh-JxW-Vy?V()7=Oycbc87(5)@FQ5YWYR0Y#y=tS8-9+gjx1sDJwIX!;|f zjb5vC&)C=Qctb(Y-}P4bKCx~6YoFPMhh2EP()HTPuZ|Y%}#$TpX zh@@HSZ<-yB<$n@2zx=W9zJEQs;=Pi8%7=f{2a_s5RE*54TG^UA!od5zTH%L5szd~s9q^ZuKyUOAZ7 zmAU-$uBxc7&XrZ>J@KVe+F{DuZ`PDs^S;0N&+$J>nEs_m6xzpnmu&(y}F$~~i`voXU2W~Ow8bb3`pRal`RJtrqC(9dsS_A=k) z1M}p&aK&=JtffmZ)qgK5dqwK1g*hwz2B#6vBAG<6N?%}+&J|h0!W81~4>HlxC~4$C zUP>1R^9`(7vu30Q7G?jAJyT64Aw12!2(@pI;muXlO(-q}M_>&rh*ZX#G!CM!IfVwaKuv`npVxeUyMHcrIbE>wt8ds} zzmdQComM%q+5cfSeZ|KeQ!h{p7QVQxsOM5&BmMR-H{oc5*@0-vY-+N11 zAhG~Ac7=0e;ss9W-2a7j9qzpzC2m1%RXX|Em#+GxQh(!|1TYt}aniA7M61E6l1-CN z<<_z1&^nG^u>za~%-xc-B?}kiEOOVa%1K|5y(DKX_EJ)RsX{83u}Zl#0K60{BU!l= zXaDcq=N~zmS9UFX=bNu0OTE`E^&R)^2j{>0@a4Ekv2UIH+BwE^)a6fK|1|oo9I5;0 zA1ywgy?4nEX=zZ2=)C~z!-uGCRj0&urUsVdA#+H`^VqS%1ElusnWmSjj7qC@Lat^ppqEYPWTN zCfX3S`b5ZTmMt zPrbBj0sZcH+jnl?*xp2)^q4XG?k~clE$-F>j^<4mk=Lc8@WOMTsJo0%DuBeq^Ni?N z@P8gLeiXxi{S`{>L{|JpJ%+**B;8QXd8Q2|(hbk&J4)&c=4%tDZ2SIxhuhxYiW9ax z)Lp%6VfBLlaq}#&Tl<#NuBfWl-ils1_qv6H?;>d|=Mtw&Bcx$fhALfQ=)dn02aB_z zMeNInJDhFe4kM-EQlp7GRR0-wi2GsSq<{XKt`NrBZri4#Ndlwl>x+BeTJzP(wQ)14 zcYJdmdw98x!<#1$KK{af-_!QHH!n}w{~-NwjJreZ%U|bd&p-J7+jA>iza38%*1w;7 z^|@2MLDc2*2VW2iPdp!azAs_S*R$R%?f&8UjL-9r^psr{`8_ST_@cL`N7k?Xw|~2H zU-q@VVR1gI**Rus@ltX2mi@Z|b}XLuVVvYrN>Zp(`E%}}=Pg{=U)p3*t7Rcmv#n2D z$_lyrwAkUB7V(1OzAyHV{W0dbCqGn9O@8&zkIhe5>mNUzkUjCTwDtYmMM)1+W5te= z_D;w0pM(FFHh0f7zaM^iy09%S@qfb3tg>bG0nw-X*B+{K&P#dV%I@tCC`4;qQa%cC zTRx$n&-(8^?|)+0^ZhTqPrUnGb#0Dvf6RxEO|qZ7+B!IX^JDYE4UWxw_B761eBu@T z-Tbu^^DDbyBul`)kXB#ulUy{c3IP%Z{kjDp7c@L z2Rp|)`fd>XA4j3d}Hg&8ehwOb5GUQRW4taKI5>;!;h`C z%&dBN^Zkdau54_bc;-j9S$`i@T%O)_gIcuWS?ecGEIHAWdFl0SCuI-Zm3;VcQpe2u zc6HqHs|@v>e>OpuD5vOE5g6L+wc$z=X4D-B>}+`*O|%t|*r^?$!{u;tkWzrp^8 z`^TwgPV1+x-}&Y7ywkgnemADHJz?jTu^+{&Zp}XQrrp~YKl-6CJ;m4}v}LEodZ z7c&+sr2S4~_foHIS@+!Es(pH%3tHPh$!6^f*W$m?Qm!q>1v`Iy=#!NfJ01(z-gol; zho-fE^sxBK`ZKKLk$)U}rnizws98!czB%)u=hk#ho!E8daCMmdCxXWX#{-U@_BcBy zX^sBwj;8PDEKWZ#ZFR?d!YIP+7} znD)Bjf42R!OnoCP>eQz9rSZ6UGy})fYVga$=Sm@EaaQOsm6c1SGInZ;R4HAkTI4^? zU!{;uQz&F<(|=MHDi%yr$Q5eYB85zuDpi}Ejw3TuzmFAuR!}$A-{0fi<+ZJ==q^Hwt#-H=Iv@L~`^z78cjowved~Lhcb$Kp zZFTyf>wn6BxIbQf>%>?o~6YF=dD&2e5rh@?Ug4#Wr~aTpRagoZhzzHiXPdmvWVg*YR<>3z1HzrhTJJO z>!14f%dIZnZQC;EVar3M@wJx6{(0e_ceP*qQlZ-UuLC7dx6jeUz7;;<%KbL`D+42$ zg;#RRcRwPqr8~~LzuA-c?zt;YX-B`9Q{XnMAorun*)DeT-y8d;*5Sp5#&Jg~tM-*=JmBXTb;<3BhgvCo z`brCfY?mJC*yxi+?w&;D5cRz0q{<$xlt0r#tt-=V{ZMt#{;RSv5-w zEb^oU!jysgfuy9J>;;11d%=dH{}EryN~N50ec<0Yr44NhGPp~qS*bFByGf`>Rwl*S z|MP9DfWCJ_pz(%4!-fEB?#;ei*>9ul<)Ex9_m-Q@6Y@mLgNXIc>!KydYuYJ7y zT42&Hr|aPdy40!lnW@U$nyQ7Prhk2=ed*?R=PYbLPg?uh^ap;hJy_+i=3rUKm0!P` zI?ryx%tWudW~*SGJ?_xU*{@x_VC`;P`>raqZ)V8^Jp#!cGz@qhILg2Lx- zJlc0E{?O*KXPOUB%(?$jXRm#2Q@qsomj^_tK3VrpX@l#e*WXC%T`(czTd(OmA1yk6 z|0ADGoS}(7_U?nBo`Swl^B(s5eA0JWkBo{7U$f^X`nI{AE_n2-!(;Y*aNp@UGkyrz zHR|G|>CMjjjqAd?j~va;>wn7r!SkC#;V*x9rN#BZubz6ocjk2I>u(l+)BEr%Z{Pm9 zG41@3Z5tl{>C8_vewhBi>keKuuRpOkzh_fQ?xRh98^3sPN7A7+US9wFY57sF7kpmO z`p-J@?bF6*k6A^3c=|PiU(S{rnKyIY=lVE2GJi{jW|n+oXJgUWbAOdF*S9t{hgU5t zZ|^!&w0ZDC^%HD}7e}}g4efv%}Ojhh%HkY~vTq%*&4-E&hj-R82V1=6w- z!`~c*G2dQ#{qM3*Cq1i>&f~T@{77|H)y%3Hh137kLm*hUuxeqk4(>#cO68BTEZOXm zO*XrDX{y5YsaLGl&AIZ+xq&>T%U$^U3? zO2`@&(yz7iO*WP0v{_)eZ`vr3yFJeLRXLkLmG){zu6VkK7N{YazFi{|SB3 z;EM#l?&C+=eHULXe674|_F5O;&pL7zdu+GfI{Mp%r7!EZK7Y}^)~4jhqDOswG&hfC zf4cmsI|oBAh+BgWMZEFqwIyFIJmjH#ZQCP@HkLf`TzKr94x7?-?JhH1uLbL$i$B%) zuchB-V<`)Yp35GzosnU{KeFdj3K#sldd^DQB#uh)brOro=k^(w`{U|zxoZK z&Gw(tZ>9Tgsekeg^uUbBPX2Ma{`F!7p(@s8Ixp#Vi__(;`_*)I%H+}iln4-9_xoY;Y zDK1aGbA8Iqb3TFYOUj!bdNw_C#q00o9MuX%HI%oPrhg#RVP=~3;XN~d{`Q3@T~~~G zBJB0m-)p@Wy?XSK_>{t<;}@#76@Jrs?dDadT@_Ql{l{zDPF;Rvq3*kfEp|Mk5v>t@ zDtc$t1jmC57QEYc_V|6w!Ebbbmv~)1x5%$|TmP=4tsUshuJ8{Yy0+~#s~M4YFXvA< zg&z3uoqz4Gg@&zhQyy>Mz5A8CJdazETPD2uYs94dpDS-3TKe9MZRdYnmFv=b$^YfG z&NJ?w*)u79RnObEZa?>3V{nJJ)9^hB9<`?Z8bVMRr9Ve*&_s{#&8`|MgM74A3xn=KmM z;Ro#IM+S;M|NE-(Z#h}jpIhr$XSwF)f{7>3iHm#R+nh8e&fx>w=+9orT~+pubcwBP z=HneH-`{xJb8f_SH!rKz%jEhylb7!G6MybFyjtjgv0@$?bIw2JR>z*+S5d~c3=e_=1=<`pwiXRhA`=oH^!6|mLM!hiBYKd=D-b!ify9qBHbSpiE7R3L< zy8F4$jntZII0Y;SeWX7B7meMo6EYWV_^4J)$9%W&(*0@bkSESRtN?aEiNE`%?dSK$ zJ=T9!@W|P+=dPUUthFtvcMjJjT$w4Up#tzr2~)wbXIkwvT$u0-y)VKb8@agl)TMyp8 zGv%e6uO0GY{C`rmF6z>3zU?vdP-n@t(Ylry3uY|7)p@!}{hst@sBh7kt1_3RYkPnG zxjD@JwnX;$7wbws%yf`_Y~4_(8T*fY7uUaf?5^UC?WJdY z!)%Uhc=P<)1EI<9j2ZWt)3&^YwXYn#5#IdutIs{Y{DI2Nk1dy;_I}{n7w;J}e<=S| z@zOJ^JzPe+hMhXOy~gIujeN&ncTa!)Cc&^cb=fzg+rR2sTb`@`^+JB|s~OyX&ai1j z&P)XZIy2ju*8s0!Y5;$oc^&XtrWNpynU4W)W4ZwUmiZ3wZss!JSD0&nUuQrE=4a*x z;5UWeAxhXSynqD4i^5BQ|0sXF4*1W)p8@X|Lf?hISU_7A+bzCF0*fAtYlybEZly<* zmBA_!39P1D?FIZ@t9Jq4XZ1J04_F-s{O?xZ0N!PF1@JzryND7au?3>VmSRi5t;C}N zw-?(3?jVi=e1>=i;L+lT0G}tGhXmq>#aVzqCVmX)+2ZE_-z=^J`kQ~^H-S)&OUttZ>tRJ&}7Vu5h&jY>K`X#{2 zthWNb&H81)E397uyvk+)qHI!Z79oL6n$1qYD{Wpuv`v-G0l?q4IR^9(Z4(e>JKOeQ zB(P1gO+vKoBeqRI*<*kEKH$x^9{_&PwgpO$+I9l|mF-u6pOv^FN-{wbfCQ32Nf4qX z!IEIWLnKm+)>4H6^ZVUjSw!zD?8KO$KIc!nec@THPvfG?LU2Ru`f2@+OFz688e z(h2mhMx8>`s82_IiUgzDNBfaC8@P2qqbXqdQDDzA=oyHiqv?N{ynS+3Cj@)TfOsib z9S!!j2Jk$vIw7+K>`lnL!c-w4*Z_>Y#akAQh_QIb;vK;ESiA@L0gGmc4_SN!@h2AT z5PxRT0i|DBd0Ksjo26!2p(I|F?dqZ4#15-!MI zkb>M7uFYPCa?=;3WTV1m3vx11X-@irC8!a(A|_lH?~c4?MnB|^6bUg#cch&YZ^Unq zpu2a;+ap5!MhL+vBtmvPP9qC6n#Tpm64~=OgRGDP(E@+x@n0r74(2Fi4S6bl)=YQ& zMhPjm!C#aom@RTLsV6~Wk@M0;*`Oqy)};!YA@g_HkMN=#xW5_^!?m&Ac24kvLm zi8qtDio|=DFI~QrIzZwU61S4Loy46aK2PFHB)&@GTVz}nNQqR)AE{9Q3PeFD7=`>V z&>3RK0+N6JS)79TLC6ip7seEgLoVn(nECNQnEiO2&@LZ0Y;G#O1nUg!bjjiw?W zG!6M8Kk_$mEW-P{CCs=b!he-%19K(8mM|iXg89d73&C3copdy|oe@$;u#BfDOUjON zraUNbilqW6Jrza8Q}d`4Duc?V@~8r86IDu8P`iJrI;x2}K($bY=XF-gFMV zj^0S`rW@#1xT0e*mDY*VrDB-3A;=KvyVB*9A{24XP9$L4|AF6XYL3^LW$5x=q8*j^cAXv8ezCF zMwovnOctgIGli>#>xG5FV&PU{rLacWAlxTBC_FAaDLf-QC+rbkhW+J^NFyS%hi8en#rv^s`dbvzOkE2>k7HF$p$e3oNh%T za4yv0VkCkBs^t<_eykdagphu;1Bvkejr&;7Y5MVMKJDc66YeIdK-e!5i`=-flO2S{ zh;pE}6{1Fxa~9pQkXU$Fs4b!`QY>;THd*YpXtrp#xMWFNx>~9%<1N!I^DWCQn=F6Z zEH7Bzwz4O+JggF}GOY5g%B>o#j>GPIT`U%Rh}Gg)afUcwTrO@BpAdJ6Z&}-0`&dU> zCtI(!F0rn&K5pG@ecQ&#hP8=A#UvLr zx^#5y=)kU7X&BQwrpJkKa&roFN_5I`Ds_LVbvo?S z;nX))Jl1opcI>>dIb%!4)^q(keTnOzb26Xi@@WNUIcE-X=@$ohdOer#Sk3j=`I7UU zagGERjcXX!GVaW{OXKdiaPz>p~P`clDdz#$}e5H()*I`%et@dKHjRo>?hty zc;97LJ6G0qw(Dvx?^@(q?|OgA_4;^cEvE}hD!KJHvPjpox#F7*?0skDELOJzJC%k!~3 zpFEmN6$&m@x^k(C;YQJ4%cs>`se@Ed^%8mnorO3X)mAl zbEya7Q!$@9@~JzY`toTopGNWNTs}?V(=0w+&!?ODw1Q8o`Lu~o5A*3sK0V8)7xS33&`_)rD^r&fK6^5}cwTrEl2ICTG2YeqatA?giWux4>q+joyZ=thZQiLHMuv zE$Nrx?uf+Ci=T%RYpJ*tZYSHs+u#gaDTbXx{F?YR;4ZT+Lt^W#aKo_XWd}oD{I?5O zx}K+b0ZoIl&1ir4iwfQ-m8bppw1API%Sc?xw=^4I9%;wGQ*e7RDAJ7P3uzz(g&EZu zX4I1eH=d3qZzXXR(GTA?5Ydvdc*O#4QQS=tG_HelJ=V;FXf}!5empt3v=rt;MRTjl z$kSYb=0U5?XqGT85;)~}no_B&h^B7Rk!G}WNI-Sdh*p1?QBQyj^Sb+huY+o)TFj_b zh=Fre3spnao6(Dq5Kdh<6jNnpC7B?ngvy~dnNjD0oIENSAjgcZ1$qjEa4N}+?gjFr zAov0p%}OLtA|=6*@-{6&aPFa;a6q>pwlgd1fb!I-i78fW2mA*xpi6r5O#|TPy^#@gw#Y zNW#GQncEu;t7IEOWPNb9{@q`)LR_<*#Q)%07Qng{=miC&)i9psg#>~Ifv+IbjA{?( z#BvDEg1M%2`WA2_!Ct`uGio<*XV8}fm4a$BdK-Td3gQLvbi1HXu-UAn33|ETToe4X zO5jOXn`=TBfozFDLKhFyBnwu}YJoR?T4h3=hZwqxo-c3|NX_VaB&1J3h@@`|oXtw0 z|FkcCUci`9q5pI_?M%1Pmrdz#a}?6~5D>kWK4VtW1#6{;PNOHAQCmSyEOm;GrR~h< zO(1_qO{=N>05{D_%3&2%(r$D-ZPs5ZA8LrGLRv%z(ps~UG*~OW5SCHBwEM93qd+U% zzKairlDii9o@+)be ztPNSfEiWFmLtIETK;E>p0oK7@N{TcIsiw1aX5&6k;#tb?{_Xukkr6%}t* zHXo#=p&rVG3O1uh!fHMVJHbh)<7rmn3#%D>00s5{lz6a=0`EeRyDLZGRws?bWW6Er z3*r}HpL$6QCjq#Nlp~S2LR^6?#5=`1k)`-m@vF#6TqAxRiN$rWGHu9ew8i!5UG#qk zu!4`!t!O;`53rvpbO(JN$>?tS2NZ0z*J>})TD@oW9@3GggL>Ann}Qav#2F|f2NrPFR()jYM9a-5k61p z2WfxK3Sh*0u#CrslfX2w>vNDGjN|p9-=cMxDkmG0k#g(X^~h2do$FaMaM%SV_c@)WLyvTFSM)?kTHWG}K8CW^#DIB5&vbSZ2dswM0f1`00=VdV=m z5e>P9p?aWqr_fE_;COR6Kn+(_;lM7`?s1Sb!4%KA3887B61NQ|c z30ia(x($s8a{_`5bC`kqGNXka-4@a&HR}YInceu;PR0Y;sAJACCbPh7W;P2>F&hQ2 ze=rP`Zw5KXhek)xC;(3*=mx1(%svx(xd847f;ONRG1WtT5acroK_Qgvg_10$(4-`d zaS?z$3o4)_k;#8Hkrgd~bC4h(TDN3^nRt^rmj$c!^=3z`Hc zO=PChwKP~EeU|inuZhGcK@?q#@A7mDl&u$3nAGy6vuS_WvFRF&3sMB@P3qYT?CC@r zte@TlrS^hwLCR1~I9d17-~s4mfL|AQ2{c1BVaIZ%PtoA5=vZjcM&Mym)=bXzum<3U zP1Ah>kx5w<+`P-FOHk$vQmg3G^d*zN7tjUdb|3(3AKf;j3sq0ghtoc}AJFOa4!X%i zW;9ho8!3PAMbt5nkxvhKB_S=PrBn{>MS<6*YN0fh&NHcLPbJb~e9wlvxq!B(!|9|U zZ74MbJ;rBeI?6;759$ou#VIP0^lyk;jPKV_gQkwtt|t5qu*-t~qrm_1_XN^5wG}k( z#5*qR(iDGB;A*TxhY_}a@PE`gs@Gdu1z_&+Lrs21vnoAqUK@&W&c`l;xldgN5$1}92< zUIPDzIw>h%`q$35|F?Gn{KT&u_Q(J3-N5u#z&|{8P$n$Z$vj%7AuROIJcs7~KpHN~+8_VFFQv~@` z6DmHn;WK^AAnmU{p?n_qPP|oI`x{R_G0)3?{)|LMoQ9s@)zrjm8AoWT2tU)VG^53$ zaEXlwwA6M42Wd5%+(WN1}9aByjE}H1zy-3yHVk7{-LtccY2E z@w~q4P4tcD_02NTm!qYS8(z#H?XT)vY^LuEBrf^gSsb!#?pKTi;I{f5->?&W!>e$s zvL;@^mUx9xWM$eB+sA$ld&1pB+H69@H?ks-8;Ocds4PG>U@U}O6FOcs^T^kqahQM4 zm;5(w6EBkZEi~{;gflcd z{(vi;a9tlZ;!en&=XD}nOGX^?;anNRM&hv%xt0#&${vwx*)Xo05xJHR@NtsQah@8!!IarT`DIVqm+@eybC zUcPlB&h5Q?PmDOb_wubDK|hA@4RCUH@Z<>kjl`Eff_@|MZ5Tnnk@yPk(T_s-8~Ukt z@vRmA%FgA#y<5cR@%xQ%M!kQ#<1XHnx!>6_kMLH?zqXr6vq2WWe1&G*OZ|1yNYtNe zMxtIneGkh-JUZNwZCITs_5V71s;R@N30z+61A^tL~6mm z*V2tmBh|k7_DIxg!jY&~f4GMV<9GY`2v%@qL@RI{(F!s~q$d6^TETz+Ed`Iv#1ZW+ zd_>#WIU@DR;Z*Xjg#gL|;be~zB#1TvoTr8X&8KnkJ@LKqSL1KS-$`H+#5h2{H~waV zU4m1BQ+!u^SAr`Sa}-m0f=7ZE#Nq^B2p$Ov2zG>nivtt13E{v2fk=)|AOU|k5(*NEK$|-WzJ&K`LNU-*gEqdVv03W_F>alUu|8#-gnQ#Z z+uy;qJVxxPN$<@1Wzr*PZCH=^Rt9vyGD$5?w}c9)UB!=8O+r0{riA?v4#MaZkU9+M z!&Q!wa4ew}!hRCp+auB<`mJ}8{?whEK1SpBaCs|>twjP8z~t&U@2Psi;CzJoxC26@SG z$KqNc-%8?CLMwlOv>595K+5%FSUOD4ft1&CP+u?LZY86`$^EVLKOMi{8@HkQ#ly#G z`1s&)iOu`taT#oXP+z{i0Xcks2F44*G0YctD(+0&*|_r{;R2C!4DuJ^E<@P`(n1!r zu{!QL#J8aALOhB)gI~}a;4>SSyrF(^dc~vv&N@K*P&0q=#N-*s%qkQ&Yx4i^0sXaK zD$RNty${9B)XqFRQyZhl5EBVGoB|dTgG+#p0rQ-NQp`DfrWn&mm`CCm!m9;34yN+v zn@Bs$Nh4uEN*X6MW*KRNs}&hDkCc-(u(ZF}Q(yAbhwtf(He@?{p@5uab$o)@bsAdNLRk>*7H*@}^ zT~J9>Dw!kv-@>Trdl3SNi@F|F2B9b_diqI{7Ds;-Og}OGPL$L17L1d83*-x;oG{FA z<7l|v^pn$Xn((cI5KUk}7LP-nV!~4ZG#;R?nalyXnAa43Q@^6=Cw@b>vO%2&^chK) z{WEsYsGZROuy@7*NZo*|fbcoZI1Ft&gD%dHPI2m#neUWyEkJP?@{*%v7#DZq3(QU%myq^yt6^Yp0Xs8nS7 z&d-0elFj{OL@|nssE;@kaWtekLFj*pxDFguK)D{720YiXlt}OCz0fmzAyahbjR?k5PAXj@oDdL7c}&y%YQbyY2^1F8x)2AvNK%zm%%o? zHQX-z6hJb>r%0|0QzG%Rvj6-y&i|~J2gsXvoL!@^C<1X2C&C-TJtGn$PKMQorAB|8 zgmiVdcep3e0FO8w?i`UAz9T#`;zZclh|cg$5nbVXBYGk_aR{pq4~77|AY(5dcALnn z2MN6c(ugFGGb9D-W8M>>1JsJR8gVoHFwpOWAC6=q#hjFg9yIjZ=AW}9v;G?A5r~U$ zkC+_c6TwEPBQz04h}98M5wSq=A$WgcL=u#xM5IT!8+#)%BXT10BJv{&0mDH9oE-0D zpmJfei98L&rGwJ2B#>hwMMHSqA>dl&5tR|uK(B+iF=8JtrSQMgUqc3gxNx_y)yC5> z2W>{Rkq&QzwA|QYJPkC!!_$mLC~FVT4RVuq-*peY`d@)Kos%|Cn-6d`^tiTAdzGZ6+ESoj1#skO+Rc9uFc-u+2J)pO z6mpz|m*In{yr>~*KriIw3`#Mi>n`Xn7%~kxz_VHBrE}G};#Q$-v(8oTZOAj^8}M%l zfAyF7|LB&eDM4}ibbaRk-vM#I@c+r4+GuS~;Ik){haQHtSOTyWQMw(F!p^U&1-t=L zxFzTg02~H54$ubB4$yxAa1Njw;1WO|KtI53@OiKf^p*e;MClzNbpdb(m<-?pzyhdw z&;Y<{*TWe>9}AEOkc6m^8c0)so(^dyKo0Lu^8sMr(r<>e6rdcS5}+EO4(N@L?gMBB zXaP6@a1!7&Kqo*K@bnNsxD6A)ZBhDOv-}_7NPpG5jECW}k^Xuv+>u%0G#DA!x+B?KIG=k$(x z7rncFG66>@!{7sS3@i_7plS3*eUv^{9|ieDNRuE<0sBrNHlCx;)9338flm#5nYsr3 zW+=}DzD%MEuaAGeRM)3>(e2fj>nru;19W{g@YfCT4b~sh^8o1CXr2c!&F=$f2D$D4 zEGHl8Og4iS&=JE4{Ye79m9GO?7zXmqST;cBAHY7)1;c5;I{_*I$Iu0M56lml2Nmnb9G1WXkc_DFm`_c1~Hy%DCft|UihCz4|8r%Kv^J>H5r3Jt2=H8*BcGdhIqqV zJ#9!fq#7~+2heK_S%%eyb$T_V1%`FFPlh6Wtf3g>ltEfXY#|3Af50YSuF?q%*buMd zfDITbKo5T(Q`_NfdC+DIRr)$ZjiDaesOR-gAvl+>=4{Bs_9VJKL({;V820N9U>LNa zeY_0~+7z)LdMIx=h}Vl@Kdw7MeX^EtzYNFp?uKKAR)AB057^=W{S1ujS%6{b&>H+V zVSxYNwds3o+;E=2aGU3C*>Hg$r^|p}=lu+ZTEl-WU5ODHMFX~Mw9#KR+7Fc*ouS;` z=mt30yU~;PQ@1%=A52S(-aJS#4EH@o71YHL3^)co;20tS2Y@;;81z1%JHWu&8Q>qx z&xZVLlYFqA#$b}q$1s?m2mJGf)}C>`t^r^up9cA~k;-9xk+o`c#$XT|V+>lnHua^j z23>!Q%V7P8Vf~1W*|==betm(C`ONIlP&2r82Y@vJSTA5V1O{ljS`G$z`1NGW<$W^N zW3zGnARqVw<3{4!IruF*X$Bj?FzCww?*VW$ZW^%ZLB9pIZY(iw9kk6#L#lBH_VdQw z1P1)hz#7ieml|t_^267-u@>^(LwQoadpLi;vB8AD0cb<}h9zE~_pVXnUgH7dVdHVo zKUME;Z2Qgq!OVZdI)yc1YzOE7d)~{f5!1Zxu<;xL+@}&_H{h4}JlL19&)5(4h2b{n zfMFoN7wa^XAFyfA`HtSwz=YBIasrlN(1$QbkaYlqK^z8S5#|nKNX8{>GT2hR-WY%8 zqiYCbi612ULzo(TVcrP)i6!*e6o&VI$oJI{7|a_RKu-Q}{xFSxG6ADrg29jhV+0Te z=Y}viH-yDP8VhNn?s!-d=#|3F|6o2{UmBJP=Miq7${(2DupE6lfjkb38x2`u`G$1^ z={fe#$+TZY;LTk6Ao<9v}ZIIMpV1C04*0zP4-7{bcAH5FC~`c}i*HeF+|)(6V5 zed{-y+AH3JO!gFFn_+ds&k+OX1YKKLqi(OUd+3}H)(F0~duSem)fiwux?|XHVDz1^ zk6`G*eFFYWu6;O{ad}=peM{Ir0=#cA6ofTn7&?FP^_s(4^zHz|eZiowhOvLaP#1Or z!@&FxorA(o>N~?u>q^2pF#vBD2DmvmkuOvt@;ypR@+C?u@(oHc`3mGH^8H6U<_gn? z9GHIQ1{y=Y_BdAfqp%OT3a<&TBMo_!pd;`&seA!S*zF-(azFnx7OptgY zgJh~C08J-fC!9;ZIrtFy+TedY(BnS(3Jtdpfk+@iw7`-4os*MbEMf%X1mloM;3{xM z76Lbc6tt8JROmjz2ElbSLGUlZztBs9yMnu@jHzX6(H5qSIfu5AuT;K4zE4>v{6)l2 zTSX#~CAHhC$!ZVvnstJ8BK5lUT%O!u8 zw9?xoZIUnP?V~;#b&7rieT6s7Ha0d9!LV6zH0>EWN zN#Q1@xDNDN2q_VO2*7^^z#hOEQA#&RJpsG{qyQ>_V4&+EjRc4Rm<=!wU_L+^z%qbr z;K?O`a2qCo+oF`~&GKe=K+hmh0lkAT5!g%Y_G}^%8w%kOI8*tH!Dk(<;qHBHDZ)^NNaW~CzY!#Qsn{MxV%nT z4zg^N1jnH0!vPgMQDOMg+Iw@V19{(ThB39%($%uR*nX>4$xQ49AmwQK( zZ}2*hZ|#n;-DA5CIgu~ux{$Bnf{jycH2&)+8!CSg%>b(cZ|Do&&=)+RFL**<@PfYC z0N??A!Q1(61OPAOTLQ2ZUVb7{u#e94wgy&ZW&Gy*fK4MWm*!;v?Z1)A(lBBEVCau5X*D~%e;)n3H!i4 z#}oT>6W$QsK<;3lF=(Q7ELiDeu+kmK%eoS5bt>5ELueY<>JcOdD|JWy5)a8F6d-@O zUor&+fyMeDjl@?XMOq0fk%JAZz=p$!4NoUF90huh|NlsDtZ@+0ID}}dB^v9A#^FR` z{Ed}jbcZ}=Ps4v*^xd~tyBv!}1o*I@km>3&2pH^9%( z!Yjfn_-m=ce#8iGf`<`W&$6C{MAkd4cOnbhdEj9zZCk*@h>3@>mQ0jPL^cvn@H4g& zFNrsjNTx}qq0thVM274o3W*Xq5N|UE+8g~}ZV$I4AuWv}E!mNl>=9*u!6APTzfDaY zM9awef&RnugOP{f=ZJx`L?RD)gFwOAf(B1Q0L~aRf6kz%iU#u>UJ6idPRDTnVRJqV zm^J`d?f{+V=guxh{``{3>r%&;MVYn1l{FH+0Xg`bg9gtz181E-3n$6B2#?2L|9L=g z4jIrNdG8+tPQOI{95ry38UlZsKUdN0P5P`XS{5&xD@&H8$}(hGvemM6vI1F=tXNhi ztB_U6YGn1YCfR=3LD?~&w*vi??2PQJ>^#I5WS3>vq1G)~J&RZoYs1=ugzKy`#6=*d z24ps2oOP4cu%3V?v!1LsD`iz|FsqjxWFw*VR@q!OhMmpMgVOnI8i{|GvDv_x%dTfP zvYXfvb}Jjn?qGMbwQK{smp#B9W{2- zHNf=5jIgF_qg{WL0=)VV&{5B3p-d7B&*^E$k+U14)c= z*k?$LaTtH-BlM2jci1+F6(q(u>_QOZeP|uT1rQf0R?8jnZUiyxM{*iCYY6{P%+*RI zIP6yPO0&2^u^-}tu$S>W7@jr7SviY$G4`%scQV;rg;;;-DO(3S8SG-pU^sV0 zPCcuPk)Kx1R?cJ7fO9@@!s(3-=4)jub7B1ND3{5qlTdJGEL*% z%33zkEN)Qll{?CADG#tnd02TI&V20(22Pvjl-+PT>{BpouCiaDkoU+6l(%KYDjND; ztFlx{*fcoLy2yV|tK3zS0mo-!wMwHh;xn|OiS1KvQYC^VgH5WE$n2k1ZdIko)~V8A z{A*R2suWd@Do>$M<*N#1MXJrJQdPNZuBs9!)p*sY>acyP8ddv%vzcvBwXg?d1*#L= z+EJavR;oI!>QpY1)2c2-vZ_bbtGdb})lJnM+#|edSjhn2wmj$-fnF+W!<=>wm`oEUbl8Y{RNf|MM^c>3{=W znJcUEzuPXpHxurS=@b&81Kres7IQCTj@j#!ap07^BcX4&DdcArh z_FC#q;4wVaCF-r}9UvLTU%i{-#A^Z8GWZI0i7BpdQrE)x!dXQdT4P zQ6IoQL_L4NGX2AqmpCuSjk)@;$_Rd-f~-CdH5$N`yVb`5C#w?sLvJn_dU_WI21|(vS6p$2`5Cib!Z(aL|V0eR4FBIY;gT?uD(0r|Ms*xQrU2Y!{) zIUow_98egrnN6E|7UKh!98l^X&+RPo9QL?8AFr~2a!yaY9s?@5z64bJA7s0*FX6#>cDvQyui7E$$<>useu{l z`IsJPR zvCe_5iVVC4%~wa@DT23~(*3<)FK7xp1FIt`;12kTrogjM7x2LIfL{o_>|cz}1A*7^ zstLS>@gO8m4-y601XKr}XT5{$gPe&6^Yo7na+Bu;d2*gD$U8_X&o{*}Kk$D5zkhs? zDkzu@4$=oj%1cdc2IH#J7!Qguqnp^|y*Rr=Uap8&ItR^`%?+9dwps@^b})dP3WDZy zYb_`(XqmhjpI(Bp@i`$VH=r8thC%CtHnM00+@9>1oTojfQ1};Y&Sbsu`AvNwI43wyb}Tp_<~K=kE4VOtb8vqtK2ym~1((at zvL&+X!Ij)uE4VbcTJ9KJ7u+bX3*Hyp9NdDfBKX9hg}}-U=m|avTAdE=lwDBV3hDr9 zUBNvnHPCy5ui`yX)f0R(_)Z7|D=QUty~82m5IcEch*O9wD+O(Xy>o&aLp(4Jt3E5l zOSUe=H$)K<7@`dc4~c&c>I;bvnaiCXxpNvf!dx6I2}xGv2f2l$hGc|fg{%%J4_Oyd z5Kc*@RdyfsqAI?m&1REio^59j4H!HOnzgGPU^iBw+F#As$~z-Bb_ z<;~oQnmfB{(v-EDWpJ)&(qyZhVT~7a7Gmm40}lqY$Zu+L6*b^jacQ6OoMwICEzL&F zCQXTEt7b282Wo4S<0p;B30(>u=F1T}=rVXD< zp-1flXB$(WFTa1I=>R+*P6d^kbLwT9ZjHA(MzKzFNzFF|=H3r^=UCYn_7T%Z*xB zxIq}zJHUUR^lLrf-T^W8x>_%}qt;isSF6wlYPH&MZL~HX;$OenIqiP! zL5PoOo3yPOJwBOmu{>RS3R*v-J*(-~p4VOgFVTOky{x^?oqhuv@flBhONVqK?S7q& z&OV?qM8WpyoONzGPo1|;Dxb{Xj1qM!m<6~gfDYBVV0oQRuZz^h=w{2}<#pO)ipx5C z&X3_(H;?mgT&$a~OVcgW&DLcHUDD<1*6TLPb99^VDFyonc86}0u0(DOt&>;cH`rA9 zAz6RA-LfjERU70fH-@ZMx69LY4gSSJedM=vQ)%2gZul2e^8OnBU07Sjz1bGHpZ`6T ze~&Fdt@qKhdbPZndt)usM<1(C)Ffes@9R{PxK7`w-=}ZZw~$|sPwRg>^W$V zhB8Bip~_GLwTK);y#aiYVZY&^;TUe$&2lIB)beN{uS+i3IUAGmXo{fmF#{4)xur9NQXXxtQ_!EdG*cNljYYmE&9Z-5xv zjO~ayAM)8Z40^T?0<|2G5q|8EiEkHzh1 zw)H0K%_xcd=e_C;9JRM)U}BK`CehQlMuc%tj^XMKlLhpc9q9Kl*@3^R@KrS4;nFfIR& zy)TZBs<`%_d*{yXX7BD2LI{5lLK2b~LJSzQo88SqDbk1$LPVq(5mQ8@NK;CYM^lQ3 zh=>spF(Orr6e%JiA|g^sDN@9kA|l3!DN@QqL`o^rh=`E<&iUTEAp}tSe($}%-e*2@ z=Ips=&YU@O=FHrClRH{BM;Aw;mf}cqq-)(BnU1Tpo{oScr1>2Y$Mt_&$WiS0v38wf zlH(WJ9gb;^$F-k07CTUzwzP)~C`;aa3;xR$s!>6xz0uG9Lp{5QnGR=4{Bz$;<0GJ};ctFRzd&gYt$Z z*Ya~WA#tXla4vB!5xVm^=X3Z1Pn_1EH3*>{)(#6zJE9#Cy7qq$?H@vFC$!Inp`FrB z35WKz_O)>8QkTM|E8Qhxbg%9uUy9Y+3!k2#Cx}?RtKL<#*VFZM5vO0FXNeAaKo5vc zG!Acw&TKi+Meqq1`_KQ~_|;Wn%q5=DZNIt}Pw2Mb8J+cn?o9OQ9Nj%9w|)Xgkq1xS z__-UNx%Iu^ncIJbPu#Xr&FFJC+Ct*l+g^$qJ1KGGI7)XQRyzMA&S%X~+8v&cYC|cO zjPj4c9HmIYZ>MAa$#3Z{mcD>+wLEL}hdfD}|80mV|^{Tkl^_uH7 zG0L^o^@h03RpqDAT{Cz#^zvt3~BA>bVjd zO7qI{#^z1Po0K;-Z+hOWyt#Sv^Q!Wm%3GSZB5!rxy1b2fTk^K&)#mNatIyk)cQEfr z-toM~yfc4(;dl5w{y2YUf3iQrpY6}}2mO8h1N=q)68~`jNdIX6IDff+vcJMV!#~?! z$^XCUtaa`Z{D1lG3#|1^N&)dMrF`+9l!6o)J`o{tgi_e`w(D(C;M(QdB_ghmT_1}+ zLi3#PI`Chi*}_S^;^)OXgqF9H$~~0#5>CG6^T>azzx_$;H;pc>Ra{!@mGw-u^%GTI z1upS^&VD;*y_sXY?b|uV`3)V@`7IsuaGu)gT^(P$Pujse|+Gee@fs8 z>BTx+Dzi?kPwUJ&w9Zjo+GeJ=&i2z)whKRDWgdQ87}bk);Wvl;q?L7M`!GE}NV?i3 za$kRcPV0<5L^JiJC6jLav^KwlpVZPlE!ii3wEqCxf}hv&bK3kF)CRScKRdsY?U=v7 zAI~L^EkAeUI&3etL;fy8c8T$5^_%Ah`!3HB_%CJdKdz0j z`rT4awEEvt&bf5|qy6Ri)VlxC-#owA_oHKLJ@>X~ZOay(5y4TxF~RY{iTva{I5U50 zFZR1{D}!^s+x6Cb7uowel)-teez&!=ZL_EkeN!1+c>Z^AvEA>>m9|~l+B#Tm+3DL# z%we8iGcGKnV+p;fKT$u7+C8{DZ!gD0j=!zT7XPLBhWAZJzqxE{$Ch^5_K_ALfb>Nq22rjitT?8I>>LELXG@}sU_~%aihggqT@kxAndT-d`4q^%Up>1 zbek9x_K@yubBgcbxbr$h>+u_`a7H-0WqoTC8!w7+eJ@-?+WKmoaQ%3{QfAC!0(PCS^Ul@5{dNZjD5I0N3qZ5xx#y0(l;_N zQq1FpG2pR?+S1+=`>=nVE|AA%+kJPd{WfgQ zHsu(__G{%w@EO}*qWfmV8Lq=}h#&FDzAuQbNzpwM+bkM05Tot2G%_JFsrCBN@?4DD zrhZ1IMy7Mj;kNh=-ua)-PlRy4@BTnY^AYnA!S_GC{+FM>%oWYDSpHnQ5>H!h#M73W z@wDX@JZ-tvk>r1PMY|2pQ2yo0ab2Zn^3xMNo9}P+KK%4V?~A7=zrfRzU*hS>ukiHb zDLg&-5Km9`;^|2Po}L`Q)03n8^h9>yrzbL#pPtAb{PaZj=BFp}Dt>xmpN%Mlrq$ys znK)%jkASibuo09@;AOyZ9-dx^Z*ArQo&j70o&|t844Z$B0OHiFrc~4_1?PG|oDro> zX4t$05GP7C)q%bS@BnIUwzX=9lU&dWf1g)-3ixzf#rOa9Du!|x@Z*3uKR`kUY3Z;V zxDFTq^Z@pQRyDw_FNrRNRt~^T&}|u7^g#|z8PjnVfxZ&8HUP(|3vxa~qZs&BK%7)2 zVG{#q_R4>8z;XVVgyeIuZ4)$Uf)3|!u0zu(;IKmzT4@f0G7}IwoP!Qc=u7kG&|gq* zctmPoTZYAe2N_ytU65rS#JJR8Ol#10q8Kx5OFoFvuYo0Np!tKaZ4G+&Ago#g%7gHk zGidig_`rkk8G>RT0DwS$zwpU6&x1IR((;4{F(TaVSy%&q{nGG#W(iL);2Xwh+v~^& zjJb@fRiG~fz7G)Jqc^St^h3hCz~2VE9}=De{5jyG;JFtqE(cx!&L;se?nVlr2KXu9 zoq#U_nzkI)>V4?&1?XP`e$3F(1N0w(vJ3DaAiP~+1{tRSN7#Nv(o{0)_6N^EK%7PG zm~43(jWC~opCK?qYcNs_k2Ige2-d(G37*}_JZGE0+07^?*vClVlM|cYCYWJ-LZfiP zxB`@C2u?MAMwCAow-8>)PggaUiXr%YeG{L}#|JTLdGb|)-_!Xlp6|<#33h1yg2!E5 zPu^8$@Tn9b#>F|DU3HE|kK{OV!HHAK^|i$LSL4@zgq!j|P?t|5OfX`AcY~a<1dqy3 znFrq!H`Sd)`NF_CJ{G5OFZ?Zw>5dzj$ANQT)jQCEzb7=rfm5=Y|H{%FS1@i-_*62n z4_XBsh=k2spe=t3exLCMTSKxPTyh0N{R6-QfbRh|p-0x4YdB548K)r8_|v>oq`&q; zGk?c_m$pe1U^)xRG(a5d0QTo|DgP$^<0`lw`oppok{^HezR*8Jaen zalMdFpwp6@__U{O>I8T!d@SgbfO9m+0lkboiy^n(2%bhh7fd^Ru7TsZlTU>?i58Ws zh+sNknPUzl@VB_ma9wed`L)iFlMKAkl5FdLFbT1mH2Y8 z-G*9?xViwa5v?q+H9rb`IQq_%0~DKS{Q}H{g%?m%;9gs>g5cB8aGRqMJS?ruxtl2r z$=c9?;xSPG7eK=t)ZIqWg($WJZn4qoFQ2-mmohF>p?R!Jhuw7GsjyXlSYsJ_4Gm#` zhvC*3LEFxjKY*tUb+-YQIU~?80?RK0UJh$m7GM~Hoj+n}WDW9dtve)d1Qe_r^_M-Q z2iKLU@V8Ri1DQX^vW8gJ%W9M*)qVmBZ>6ZFH-r_t`qBzO_~`d8+wVS|gmUpVNBrT=SjqG}gRPbf;G4I7ShyX{P8c z-gC13dp7e~PoFwhf&vI%o!68E*n?|1s{mbqG)D3+btmnptkp zTI0^+x-k_7#Y5*`n<$<*>X=7={jTXlK8=ohB` z^19>71HKNc7@xzn&&jK8(8;Gke&*`Z>V*epN=(7!)eCabihXFe;=+UVOCxb_$a{+P2HK^ z^nJhw04>VXeDz!*!?Tco(~R@9n~DH=eec_ZlNOtBo;SQYlXg9tp3D38rc}nyH2_v& zT@VJmTET9PASgIDlGpm?8P-+9T3h)%(pffz-`gcywX73c6i)BP*&G6AcnF12aNwkL z10zm*Moqs8`dr0z31163?@8uDe!MY&$Csi0hT^&QJVPy@aRj)3$%rM&Ot!iHx??); zig|YHuVYuX8I-k5kvdak0#j5TC<)D<@*M{#@t}B6s~WYIKu$F%J3v_o$_~iMMy*+> zmCbV0B1Dy=OqYu-9Cckx(OqauN3B(mGZplykT#!j#~MhRZ|TX9*6UAsrwabfjO*o) z;0C1}@=rs~X>cZgGVbcfSB*rzs^-~snR6XrCHO0WN7OaEQ-$Rtkbm0oFyBo$I#MRqybqTKCX6eH`Mj}SA9F#)lk+Ydc8*a4-p6%>KdSw%z4_XB|qamjXJq?SmUsgkh zLg01iS0U@H4MJNHv~?7g+|K?e_!Bg$(%KhRMP$qCBSNjm#6PQyCWKR7w@b$nWj*S>)UgM51B+6u_ z@Cr!yP97gnc^!^4CI|17lGN%R4~X1g$p1V)NL4VkCj3l|%9p;8hrfC0N&vGF{eU z2Xd6@vep_Mrc=Aje;W8K@B}%6kuR~QEwpzXm`&Es8TMSs{Q63GPLkt2)(zH60;LjH z`@?@`WV(<9|QX9P4n5u01u%Thq%9F$;lW; z?n^bUmIGFSXDV8m3JFsod7))VT%F0gJL>N?_)-qXM$Cm&=$UFqW0tT3{7LA=YWU1i z;QKKb>MTF!{%S|z|1)73H~L=6SJgg5!Ya&vkxJ+5h$q`1)0#mQ7$f%EW$@$(qVY0B zQ2~4yJa(WO$~gMI7PGR{aRV%{4Y70;>kJ=T%M|juB+S9_Xk`_~h&9iKm(GHOO6ahi zugYwUtOxopV*QQLykl2;teIu?9lO4*=-p;mU@_!OwQy$~`o%sOv|r=PPT*7WsMilGO{__?KI1A;NH{Wv(_v`_(Xfw zyod3f4r`-#h#|XhXAuNtChW5so)&L^MFY?`qZjkw^Ol~~=*#PXn^{AeP4h8Q9Pug{ zmma2*Wmt0$IBx@NfDR4dzYXv>D93U2$B^)2;5*=l3o&+ujFU}RT0h|Z>=plE>@Jw+ zIQT~+vW>QOEYL(pD=WDbx_<qZP8gx*E0c+L`N*6=u%Ag-36mBlQR z{AwS2i$#IVsnGBkR*g7ora+&6RLdLr&f19;mPV%>F`4lQM&}6bsSf}jhd$24$R0wJ zsKDrqvsMJqR{}3Zq^*T-SMpAn*2IAvZxMe=vCo`g?M~tC%i*gP9P?!Wl854I0FkN| z^QhL|>pqOt89PH>r;H{11i+XJN-5%4JjOR0l8=JE4zaEZV>-#+iCH^;SdQnXZJl#q z&*_Mb-1s;uLZQ~5!9Lx?VI3NjrLwE6C?gPA{9Tm&9OWa zD@cRA9|msKvg0_JqMC_B8-3(tx6iu{u z)IY_ly$?IaZJ3FF@$g}`>MrcwtAVdYE8EcG1`CHhGqESk1Re*xkfDmlJyE887qE+C z7sluyLv17ODXQU_!{Gx#tcFuy&%F$3)nj}#qEiV&@ps%o{~eaui5WBu5_Vb?#2M_s zX@|-9Y2e4Pf(*qRueJ8f77lN8+3}pMcZ&Pvm<&okZp)E>gWY>JB&^5$?PsmLh-3Y% zac55I1xL;L> zWhm2WZQ>ChYVEK1sxuRmcx#6PTO}eIEVjl1o|$PsmoVUg=mqdx^kTHSf+#;Uc#l0A zyS^abBWP>j&wH&W16W~$yo05y?86OAQTt$x25Ucm1D~&l&PQ+$UJp$W2OLNEj$77S z`z6Pxh$K%k-aH4Z7|+4KTX$9bOp@j@Nl@3QL9n*9Tl*BNIoB%ZT671!46~KtD91xo z_iv75*4)11;2q9C;a9QnvDxYtk`QCeVw|6SX=fdMsn%DDBg|P?qeAgs`ULnZm`8o) zAkCeBzlJ`a!N=ZZ9tpqI-nCXkrcjJ!SP2O$Az?M+s?@@*CnqeE_WXD@0v(1kr2TLa zc3ef6Wku*6!xF%$fN_8kz*4|+>)ixk5-5piJs&M5f>O=T_sDu_MBl20ko-)?TkN;| z6jx?qL}tTE&lvxJWth@V^`Wc3XQ;Qco&rICLYBH0PeKUlpE~ZxZi-vK2NKS}-|m6; zma37|N(06n_m32%X_-1DM{gZtZ^1k|D0??+_`uFQxVU%0v@rR zh9PdOw4#T##=-Xjh%g60e*9;a} zR0H{)AnmDs#Csmln-txh>5_5BbntXF8i+oNHCKI&#e~1eINkMkBlxK$2QZ$Ya|h%c z14RK}3#cS{wQ-w#mis8TLX(#X7RWn@@;$YjDe_B#w@7}2Q_r|wDrvlo40(ho?{VaD zG|AZ5}&OEfI_Mwh{G9ni{VsyH>hBW#h5l!PH}hL{ z{jWOSFY6SC^&jbf3wvbWsO<~=GS!}*Q@r>wKa=RL@ zdg<+zbpCsWTz<=-HSt>*Nt2ZDGkjJ1C%=i%)}wBQMq{CW#5!w#)c#3-a1Zn7g&Lnj z@u~I`!n0t>N5zepp&^F+MnHSC`KR1><1j|HyPB!qKzVA#7UjwfNUJD){czmFTK@Wo-19}YTTS4E7zQb-3c2gPT124dphq0elO~F22W?$b}(!^7(55TbI|f1mL~TzG&Z2! z4Y0!+*kO$|j=1_YbhsMhel_ZT0sb$n@q$(Z(c(bM1DPU(6YnK09|jL7N?4u@nU#=P zY55-X`8%xlcUTgCo+B;Kc^8@-25dy@jp)$>=+OhF{pHE8h~ z@N@)ENAwz=uUA>#2+rSw^Y`F1z-d6*5YUH!{u=17S^f##wgR58BmfRU>-T`Z0)0f^ z^$DOa1bq)f=M|s~03{jtIB>!;j(%vjAKHcAD)_BqH|V>6K~DfZ0haj-Eb|xO@MkCd zSs^AU#01w9@Qo)R=M~6#1-Jw*(XT_W_94)-K+gh>xa2@wQu`otANcdYp9lPI;CD0b z{*Zg&{t!6ggB$U|^$B$N1o)f4--OPuL+95SkNFqlG5-S3d*FEwJRgJSV{0zJVx6s4 zz_Zzc(6B#$H0%$ps-aai=!h^15k}ns{0{W)S@iB%@aKX*7d-HMWqE!q@L2HN51#ws zw~#L(Up@)^N#MhP4?|s8Nx@1EM0*FKy#uR&1FL|e1b7MRB0@?;NCT0_K;%(nkW&V{ z6nH7{cyOW@hSiIo1OGX$J`T>uL5B?u*igQOR^9@C{yFf^Ve|2@?}hxm7#H-yiC#FD0bd6GV(=G(AMGl%Yg`X~t_MB~_$=UW0Dl8@Uq#(l zLC2GJ1O0Wt&mHh{1M8H5b;=O}Jp>)%phFz+mw>+n{*B<@h`xV?zJG=OPDXzxg9mGe zfwjYbI0O6)<6^m>{b%(5p8Y#Tk$e;%Y(NjV0=__eATf{{ z$PDBJ@&e&Nzd&JNP+(|aL|{~4OkjLqVqi*OT3}{iPGDYOVPJ8fI7_Z>30;_N{wsHy2#9;cy&@>q zP%6NG=tjhQVvpz}>L`6r`-N5^`tkqai~jt7_<~QRD-~tu`x{6UX>IxxreEj#HHcE% zzU5KxrchdF_p&-L1v>tLbnHYrW{{4Vf={{5qNIy#N>b!dGDL52l~CepktduYUxY<} z4Cz!Tyka0FpD3c#P7I1NvWII zNhz87{=P`je43B{3dw=LL1-DkC2a^4fKn79D0@;Co+(0nUH!vVj6euA$JTNjaIxsF!9+*scMPNo? zb|5)W8CVcl6j(y-YzZu*R#@svl5jq)AvsnmvJ*>*ruBB(6xd2NcLa6@_OL9%_XhTp zgpMOh!VYC&0ZT_H^+&_OP>ybZ#%KE?ne|`Qa|GxY&q*oE={PFn{^QQz# z@~7p`3=C-frEhMZbN;IQwdmb{*!&IAwmIi-&fgs9OxEY#4hI&^M1l6KCF}KX< zHL%DfGF{sRo$K-&@(+-0Z4F!JOVOE@e>neGYwgj4lliAxf6Y9QjIXTs_V>5G(GH!~ z`6JeM*@LCQvf$W!UvNTjQgCW;dTJ!is0(tI?5Y=QEmxt57q{E zv(1C`!F?zX29MG6?gMrYd(ALm; z|5)HVNY}BUouNI!q+nHlFe$V*v_EtxbTo7#bSiW63+@Z;B#y!m&reTy5b;FVUg4qah2-5n;?53_@DKBsg-7}O zhsT7+v)8dL0!878;VJ&c@HGFK@XYWW@_bMJAZr$d=Y@PY8*@G+YE8SrWLyOqRqGJHDRM4sOlnOZC`3f#!C z1qp!?O9EdjNGeFfd}9fegONZk=jaTHdJ)e8WC7+6qDnPG8%3pT8vw4f|BqhM^ogn~&0QwyeZO!Dt5m{l;hV17YW!BYiG3sw;4 z>d=h*(*^4aHWq9_?d=7%1-lFC3ESr%TX3-8NWt-f#?a1SEXnF$P)zVl!PL-#zEs)($KtdDG>amuFdaWpO`i*PJH8dwt86xkZt5!vbA7ugdi zkL-=?j~t2|jhrC*smR$rdLLJyypOL>e4oTVseLm0{2w~ki@~)27(%;$2#2_d>}=AA+$K5*jWjzBjqo*} zKtIx`kjg<+4wYBiyP!d|4;qA>&=|_&DNm$4h4M7YGbzuZJdg51%8MyiQ(kVDt0=Ff zyn*s&%G)T{P-fY?DA!SLpnQPxVamrSpQL=+#+w3z@(s#v%CR<{VAGRq9?JP?l(Q)J zwyy<$C`Tywr#z5yvE62&-Jdb7blq(0aH)LQ)~8j54y|%jm$sSdt#ke`%B5DD`DHfW z*j9QmeFEi4md>zGp{;AQ9An$Pb*^reH=obYZz|>K))=sT*xqc5{8^OeT5Z5S^KDyB zw99GO`C4^G*mkhX{3=_YhE^r{NB&cmT{`q$Qe z!CcEe!64ODGSgJd*Ng%Hu3M1j{K;rd$y?Kd;)xi|9Ci@VZWG zGq1}R#r&ubw~ZZRZN1zV>JY6LoI!bZD_{M#82D{5t*x)N@ugs;?F07Q3@)I&$jUAL z5p6pvbJux4iSDIZ_F{)y(MZ4G63WYL+pna&CUAbA#{FGy`7rNuF4*_j`=sC|%3CS# zu=_W{n&Z*^9CY4k=@r~Vc`xOE{Z?Pw=HMYK^BRntWsL{x6Ff@!ggp=J{b2AE<+Fj7 zePKwa?6PbU^4a59+^XNvOm+&zTYcsJv3{XM%O66icHeE@P$uOZ%6XK-l>1R8dxvNr z6{0y6qW*>`E{ABmL*oN2``QrsONhoSMB^T!{X&TREktoKw9v{edsc3LXP!M*vTWTK z+v9c2>U)bVkDa$ubZ()4L=V|xA6jmW3C7}>WgoUvYk82bW(X^`PT7nypHWR*ow&ynb&E+a8m-npc zxvOU#QUj#}fQNe?qr})rz|*L)xMx$gLCKvRODQ2cDLai)7ETo#qz@ujo zKJ9!_7|vImuZWJ$_nmu1g0sQdAd;N>od-lWdxViS>yhjQ+XDjSnJaV>w|@GzT{jhG<@S);TzX( zeB;{deAl^0basB^{D^G-7w5;KoAYnZgCfOEDK|Ln5l&&6Akz;yHr{A-Lv&UR2=L@|@m5_AZ z=<$?LlpVw$?ooD$H1-l{!X?tAOQcK5n|g8TKKb5vbbRXM!W0oT^ zv&)h!52zb2PM6XzEAHadec;8ZZ6C5aQ%b%#U1}_U6EiPPSs7W`$Tno#XNgOs+^isS z6mlzlFOddh6=juBE+UL@wn5hLOQew$+c-xd(Ymg_I9*cbOUJc~)8q?Nm)tJ7Srr$i zq`gUdvu3nOvnf?xoGzM2lrF``&%KSY21P03#|Hlo%v6J-lQG@6N5mLU7{3-KaX5{D zaXWE;++o}ydK-5dcZ#cwpBZ4oW*IUGDdu z^u6bQr|(Zclzue*MEa?uvh=O#XRVZ>XSgzdd>Qc>i5aPs6EiY1ax(HV!WsQ26;fu} zpp2p28!|>@jG{ayV|@Bi`jwb5F=I-`w2YYIC{ zy~4P{eMRgQ2^Wmn1dQ1)h%$}F%xOGpEX9~PF3W*Y1z#-w<{}U8G!lgrT51EbNZlo5 z`l9oR?+c8dkbj6)7=L3geE#nxQZq%n#Ja?~^zrEv)2C3LmOeAh(V=tNDWd6Vj_&-I zf||aVB)IhF_2)^{OFI9B?aTVhLf6-S>Fb2lU(;U`hQ34JAr$<{Vcu$v5&W0(yY*wj zptkt$K19kUp|{HXTWgbHnVnqA5yG z&$8^6p7zalYip;r_GxXG^xjdswBOj;E(}}7v5me_IW7L6QyP(`cOPf*#Z}m;gj3?A z)TLI6%I`G6N>O_I2}o6OYpm3N+Agq6v|pqbLz)AI{)qkr&4DNNCq;}o)*L6?<`d=< z6f-H_>Pz)M(6u-8T9K^3qkk&0VqTAVUHkxZq7ZZ9THp74{RQ2Phz(-%`B|8>RNR7HBwtA_;mjD7!@)T^bsW=>$^l0*FI^eO=>mCwp7YWmp@iXi zDcv$Gsi~8h->x-0wVbb8ZLl;%f<^ysPaV0A2_lAiIze<2uC5z|Mp@Wp+w8PU#brvB zFsRg9U6-wJN1M9Ck^}8su>+DS+Pm5fOseoMNY3ik&zG6B$h*Lo*{+sFT%%iEw*yHtlE!tYNSe`ZAoFxP(6y9mHxkc+ zqzdNgy0Kdw?^Qbgw>qXI#4#ly zj_aiKCCQ7rmXfS-^ecEN4ZHPg?_vt~y#vYacrb-qE>DOfORPzMh)X__yd^o1RPLKY zZIjMyjg-D!OIgF@ERwbZeP^8)B#mR8Q;L#o$=(5MJukIx+4MXmc7RQ(^R8*{BFdU} z#oh(oMkOCijwP!Wcc@_7vOci<0M^huAf*U8_e&YzU6ZsRA&z-iL*{8$oKlihL2!6d zMaswy72W!=hNSaKAyDF2h5k zM?BxjpZi_TpM9DCjz1>{$TP}QHW6HsvZ>?2uC@Pz-g}XMueS2c^2>VWH~3+c^6z*Z z`RaG}IuFQe8Y2T#F^Qu0{5tdCj$w zcCdZe&eSf=?smoT)!Yk`+%MJVn?rV9qX5v9IsX=*C_VXEzi z$qC&Kq~`Egq~=+Em>eKEVYYK>Kg-U^0a{&R^r!WIr-g`lE#@_$x#znd6T16x_Y=b5 zUhIBG#JHbxFBk3HE8NeE_U;$lt3(IiHNF9&BX+3YVO=txG@lehusW5{ea}2?2X@lf zp?2)tlC@U&rE=@*HzpXaosJsHCtZ77dlHh|^Aln{O&yz@37#g#6B4Z7E>A+Sb9KjK z&c>L3p-ku8rPe*a<4Nags#ly~(6!ZF<|Y_1HBPGJsOfktAt9zFAqo7&L@IXF#0-t* zs7y<4%uvo;hk0A)%jw7YBHdP7xT@YwxE{;pddy?B1Kny|dpb9`c6Ov+z6|&L zF7wg9q%OP38pSa~J2te|g=Jynf35#o2=^m@?nh|k7rGbH$S-m~DWtpFy^QWHe(V0N zaJyH!R|?atGOL8gTx2f#FYLY6izB!z;d@=tAwy_(maXt;*4tcXexJ9Zdd)gO(##Mqc))^w#5kl6vb!Z++-(2l9bM z_)78=u?Bs?c(xyY*{ofL?up+UzlYL)vP?3SN$MGG9#?GZ*t2+)Q zxWc-|Jw+rI?nfySYZQrTS5A?5F~#GjC>}czk4?m5uX`26<93M0vHu@6HIXQP($HW0 z6=}O!$eNSCbE@ml==l3vn%7$M=jt(h*J2)jmq79VYj0LRA=pus3jQy3{;%+2z_UzO zS>P-JWi7s)`w2tGaE59u=(jMZd{ps&m&bt84w4H2cY(7nU_3+T4)7cVMF4*Ut^9%i ztKCQe)BtbAcWnNI|8@_k51C?r^d#7UDcV~`I{$CA(VHj<2EVy{fxkNLctY0lcTOPT zW~R#@a4lJF82Ez9SixT=p$KJskG~k~cmguN2RMK!@(A!#{4G<0kAa`)Vi8V2*vwxz zw7*k_69KI6GTCP(oaU?cc?2E{x4tf7UuDj-c-B*i?+@ea^wuc`)~OADI?fcZ&so5C z_^og0*k?fCd-B#93ZifGDPez~UncO(mPNR_+SZU;cUfQ8$2T0TGZ$v#Y5=eZk`LiD zhvobQSL>^x))(-MSV*u>Z~&+Ejgdplsr5lymHdra>LW`SkGAkl7;QLe)q-b-CC6@y zzuj60SZaOk$2w~O?cNK2&T>d=gycIc3o~w=(V(wvTFm_1U(y6$>Bl!%tnY&2+pXI8 z<_Y{&2Yk1`1{8duLL1ifE9g8;M8EBZFS;0aa@3Hsg&UUS7W*+pKh4noqG>7Dvc5PZ zk67OzMcuXbISxYDUq`gR6c@l3uq$oLu(T3L>kNqR&&X7KZ3AC_KC!;%M%J5#x~$s{ z>+3quwyLR?&h>4l<$X zAn5$HkmF4|(Z?wmcN6#qzaw zwYVDK7WEyr_wK}Kz5#qG@THi2U%*4Yz{uVUco*gl`irrD7>>G!pviECguj7#dK4Dk z09(BXoOv1{trR?^{Dp8DyE3#}iFR4%Ww^Q$`YhuX2`|GO`~qY525k5uM}YGubQrO) z!@ahLoaVWScJHt~WGQ?P(FwEQ4tQW6c=B$>)iu^U;u%4b7YY7)Dn}uF_t^SE6zOTr zvcGC#~uRX%J z)}Q&cPk0ox!SJ6e!Jlj4Ja*b!m=RlfPHB&DyA;*A#U}wD0%s}YSf}b#f&Pirucjvu znHhf`up2l7n0?djC`8Z*!LN>j;sa*{ZKaAk2pJz5@*54+W~RzjC_c%8qZ*4GXPg& zOxL1TKCZqB%4W2<4m|Uq8?Nf*pqBy8##fjMp~+`WZxXzPq5e;6y$0SFKKxqKEvU;p zW%f!zaoe$z<)~GVW}QPc1#6%6)#!Ub8Emb8r(!6r^>>L1f+KO_&oIViHef1U;Wdll zV#vqIN7flh*2z#Z1JMjKh1O7xFlkMn5X^5*687mx0v;%Ej*lYAB@TzsmwV5sf^yqTe+9Yf=P z7~l%fPl4Wzq1+F;2KqwaRScb1fF~QUC$0_vd>61iI1dB=3~(GnR{`+baP@1zT2Oqz z!@y&JZ$<0SO{Fl@Cjfqmt9zisZ-AcwX9e(N;5PxsRVOG$J>b)T`H%_CozTsBFDRX% z;b2e>f^!2}T!TJd4ayhb90&+YIx5kB;@<($U!xHc9sti(fY8u!4e*YT2^%_o4~hYN z2=Lc{_XCdpI(7q3fXu%DqVEc$<9Y%-uK-H4eh7FLAjVhi13eG$Ziem;0Wn6dPXOP9 zX2|Ie3Dv+ccIpna@+|1Npjh^a1?7I&1pM+zz+t!wO&sulKnHx% zQG%=R4Flt-$^c6N<3YDt`8g<$1BY(%Ex^yA=XgN)Pt0~megXV@(HFGhTn2hE=%{O4 z4>$|(4P1Q{INEi<+6Fw_5rTv`z?VSZh}OSCyOTkIuNr4C$~gVuzxmt;`>com-}4=; zbD*N9Jn(yb`>Y4+l!rq8cK5k|Lkydy0k3x9R13xlj>ngIs(|A(4JS_7aN@)b{(djT z84qwi&*dt|8bF-E!Cwufs|mnMfa|~yv7WYkSc$(TNkzhM#xvsY5FP|AlW& z-{jaT_*>%qcZ~wE)IODizXM4S7Qk6lqIoVLY}LG-*HDeDNB4dFHLxUqe18Mq6w(6t zlFv+rO*m7p39;Hbp|2Tx?`E9EW}n}OGuoPQKhm55h|}C?RCu2Qt*mp+Xha$B3mm7O z+2^?R#eSo&m_=|R@QF6gD+2D+oGuGu#k9^%I|Y0K_Di^jb>i;TVXX)_YtK5(P{(O{ z))|G?`G5-N{aGinS?30STBrCKn=H*Cd9JPVM8H{~Oax@z;w?G+H8X+-0N3z(YOShb zEFkZZHbVYcYmdrbMbmdMl-U*p|7dIMaK=`R4eNL=z@D&Gb8qmBwK%PF$FN2V(HD?s z#42mw$max!E#O?wn$VifP|)4B)_h8<=f5ujTm;G{4gQ8xW88p$)_E}l0hcnRdAm)Y z3_8OahRwTxTPH%| ziV*ghkHnt^{()$P;bGVZdjQgkdvp*j<^i4oWiR?T(C+UxXwFy1+WZVh^H(eF(;f}J zQ)sH=U56Oh%xA`b&0_q5b0Og~_DPqxKRt)jA)9gDpTKUv$=Vm;L_ZO4&k@>*ned9s zo%v{;p=q7`Xr1=h3}3a*$`saYf^S&oAzCLPlFlM}<|E|?;qwGz@$`mvW!CwRhk54O z5yLtc@-Y1QLC86S5v&o>6B}`kBuPFjE;zlB#WH*=Cn?n)TaW+iIaK*PVvBrlhT8jhEqfx=x-Btm`!-f z)PyHdP1xC5r)r)>1UL)NISc*I;*8O=c*b@1fIXX%?UOXEUvAB9^b_j#$+wRYsdxNx za=F+%{?0Lflf{nm+owzv^;5>*ewSzzNx~R-&9GDv7*c#oswlasq%c*C|KTu#}q-5Xg~bP-DyN)p{gw#XIvB2#p- zuSn5exI{ORCax4$i=gNsI@?za5l3w$i*&*BK18#BqYJ++z*W(LNzs9L!`%9?8-}E^ zFA`O!(zG#;=+(ll39l%)WGr9;U=m;&U>2Yi#S^~)8Z^!^G*0G!0Z$+gNhW_wB@ap?kH{e3$|PUO zB2UXE&&i=N=I=h`;=50Ryn^%NB6de zXw6Hb6)&Lm)e5y@ZMZf{8>^LTQ?%*YY;B&lLEEa;YJ0Q>?TDVG=jvg-zh0yd)l2n% z(fW9Ol3tyqQ_htOYZlJrQb24lV`5yDbE_uc2B+Ms8@J@JA1Re{k+4y<=z?Ih2E9kt=>J}!``#LcweS3 z;u}hJ$jZJ7U!{$0_0?JJx8r?q43(*NnQfQ-tg_=Ft4y3=mB}Y8JyJ5Lq~9q;_V050 z_X@jgLQ8So$8?{XmXlVLo|qm;Z_4O>MdXUHnPr)ad#vwqBJXbS$^d#OX`(t?Q$!4j4StCdFaa1IUfA#ma{l#P0o&-{W+(5d3vSw3ile?YkaR+ zy`Ji|zE@4J{k=~0_Vv!_-M9CM-jjOI>0RA>L+@R^k6fi+m3&p$vURSoq~|*9GSMyv z+GPdW(eiSw-+43ba*4k_8&N6-~_AH>-t;Lt{aEn@z>3` zZqaqCuiJiI!*wT%Tt%rx!J?9)u|?C178b24+FG=?==k-H>yxezShWX#rCPNIt-x<{ z(9yyA;KaeXg9i>CHF)yixr3_*uOD1%`Cc(U+of^{`2zdikZj97Lju;A4;jdR8BJw{ zRhAf*?2-j`x!f-6tnvoit~c2By5YE04xML}H+Htmp_aTGXIbssSY_Gm#<`!M0y-dt$ z;xGq&J?e?Pl%I!mW#@&v%PrGC3*H^^d9_5$rIFzT|9Z-Jdjz@XM-I2JzawpKQ zGsN8q<(KZxC{Me)p!~|6i1LiPD{-G`V-fx)QiYiLoh*`so}Y4evn`WsTPDS}OsZ{} z?$pjHcbaXVblWa}8Ma-nuTjUm4 zWTb78TWyPsvMq9(ZILqDB0qvfM%xy--L}XW+hgvqEi=}(%$@LYiYK+vO*=UCM2{{M5F~M9VJ!wndJ$SY(oIk)PWZnQU9+ZrdVLY>WH{EHc%$ z$S-V*RM-~zrEQUEwncsgi%hpIa*u718Ma04wJkE!w#a?3$Sm6;_uCekZCm64+hgX~ zmU$2!GuO7vL$+lqZOc4tS%#xO>x~^TMKk9Y&PJVo@2I4-Hq>s(Z}>fu|E@^W7821T zCh~(nS}Brff1XPgEfgi9)H8!tfhEpWda>tT8yn)83G79p-DhJ%JhVS?R)g<;8yn)8 z4UG97u(2Wd-=hrL@rP-|ip2;qn&SQxF+3PsBQ(&pSw?zwv_${)da7-@1rC-MEu~_Xox}{y#9(ir7yYg5UYS$yhG`=6WaT zUN4Dk*q>(MC^3=d-!i)A*dTac;t(DgCv^Qw?+9x7lufw~lu}S=AM3r9urKXv*W=m` zTX7Ep<>nUdk>FPNKbX#Rf0=MH`Mt8?VLoNTUu%lXKAf#b6a{N>qoVJ zZ{~WenSPS%=%+0mxJ~^O>#6?>e~b7zT@l9LjK2w&af-BwVO#QZSM9KE%Mky4qIOi{ zzkI1{MUz@RrA$q{Jsigt!0+cx}b@o z3uN*arTP6x-~yQeBz|X++(Os*-6_WYEB+fYilQFjb~ZY{z~2&U-Z5T0H>G=j(jNfw z7qvC-WZ(mV{|kEY*ROMIsbT2F@izLzMd1G|HS^l<(vtUX)Xx%pcN!hj0?^{|Bs#Z+ zc4=uO!}sPlT;soTchmjxbv`~-U6+PgWK(|N@D+TP|lLGPso$9*?7lz&v@VXz}RQ(ml?)a z#@EIQ?n5b%*+~x=a03{apQr`lY%@-K*|Xv(-cD5%rjQLj77jqkf})t6oqq zsaMo%>UZi7>W}JA>P_{w`m=gRy{q0+@2d~ghw3Bs7xh>5H}#+DjB0Y|4p+>p=5TX_ zS!({q{H^(d`I7mH`I`BEJM$0b8|ItlTjty5pUrp8_stK@znFhD|I_@`{JZ&2^Iztd z=GSI3E!$2{jK}m&^UmbtnNA~rg`~Ryd8NEkIAkx`OE~4#@@nCd`7&R`$ou4d!Y%KY_X|@#ARnNZ z{h)kMc;!R#A>osc$VWsw`KWwU#LCCXN7~CL{``YbP|?l3S6M3UaOJQ{(i<3#BFNCacDwgE=V z=32vDV*hC2ZHI#KQXJm_)95b5u8Z1>T13JanF0`>3Q39dB)?@Q7S&Frn@(5^U4c9< zgMqV@)S&`F;P*V#DP4i@k^!nMNrqrekv*IZT{lJ*ur3m#xKRPNc0OTlqITU~h=Qhl zzM6Hpl3UfV&XPs$QI%iRu~zml4j|1~`f1w_Psf}?PFhO}RVPr}RJ{^X7Gx1|R1Jy3 z<`F}~JIJ1Y|ff{+T% z>8|u^X%{&3v1wJ6qEz*~(yrN9YgdO5ie;jFL{d`?0*N;Q;RNKG5 zqgJEgGYIx)~My1-}j4s{lQ-AAAc@gQGFO zWojo^KRDyZWf+cCzQaPa*<2H;wtXM# zhdy9;T_2DeSDy0=p0pc6@PFBT`nCw11dco;--X^ztcymm ztb2EyMT+`u+;*}x`H6yq7}n2&ww@$DTm|htDLfAOkNc~9xV0BiZkNZA{z}$KXd3M^ zvVZL>9aG&=-QlycFtwmQ3u(P;jSzikg|tRybvk!CZNlJaY?7R^7&o*%1M=`lc(mxxvJgQYeF7e9n7PH2%ZDhT(q zPqk&|q&+p)=J3i(j*5Qh+#h{8!uQN*HC~gyI;20cJ#xMVP_CI0@v8smVw8WGD>!ny zF7z`HuE^G$s34ddInusvg>+o}@RKYqYn~O^OIn-LM{ru0EBGyUC2-|?C4FUmrG4dj zb^DuQOf>B*^(>7dl_HHI1K<+n5aoI?4{{DN53Okp;YFG8u z_0jcR@LBK$ynP%y+S>iwuh-$v?9cRb&WS`)CU&B(`ybvvI0T;Ei`X^SuQ?mg;+q9x z>QQi4V!YRZ|D4nvlGObb@7L!=iqO(CnOQ!pYvBlpiBup(zQ3Tu^)TSW_KL`Tp4X{(MrmfK}f$Zr`<*6!=fXw*6vNAx)4i zC9i47V&>PyRhU`R}Yi%ek)}kVKaIlU=q$>3z^loV^#$@{Zps*a# zspmr@^xUy($tC*ArTY8`u^h>_XJ{gnuCUU`rMV4)?ZByIF|8vibsZj{>`TT&KAqt& zz@Fu${Cz`!jtG5DO7-x<-q{|7eRBJ|7v_zmvk{Cv(_Pa&U|4nOtn7DJwDG0pj%4C_ z&Bu3fk=hsK^$HqgjFQ%6q)8QT9DXut7tGr6B)5P3lwL|#QRYBAbW~_lCQz<1ri(I1 zef_;$XJi(+QK3rx_;oe6p~a#m4cuk%DF7t7w@|)BH5YJYY6 zd&K@yn9Bp-)y=M#nFE!JHzpf>SMB>3I_+3OaUdvfW_d1yU1DB((~BYh7gNvuH>CXu z>lc5r^{Zwp^!Y16xYDGNYNXP*5rV1jJC9`FudxQicz2&4ik!AGPSj>Ey@5<`v z()btiUsIqi*b$jWDAyNjIg&Y=;3B@%Vp5uHyDiGH%d*eA-FLo3+ms0G+$sHttmy{~ zH(ZKsn@q1fRaG&v2$t4dPOAA?A>_dqXX8Kl6x=4&KfL%f0o;O|+0T$^MxfXrhA>Nr zPv(|nuy%3=@1R~``3iSnflFG;0~bdshM)4NU*O{N&v!{m$z^q+CyW$%^{RNM_ED_) zBw3Pd3AB)?kooGv$6|vQ<@aNdNRQTQ9(%WG-n^6Q9_2#QFKmg=bV@B|FY`-pzvH;` ze#76O9UzIgptETIOqhYS;|28jKy#Q#M0ZI=&qcVQSQKthboLn1fLkaaJs3~J7{=F< zFMD5p+~=_wN(@;C+371XERSG3AyP>@@$LmXyt*fy^scRv@;qg~6}Y5{PtY|LYl7OWsM zen;M%jl28|dX{UbQ(du@c6`vi(Y}Bh2z+7iVD(TJB7|5Ul-p52I6aI#P}dOGaI>gk zr~#%RLVa9)y62uD&mijOVc(S{7C*tktQ~4W2>q1G_S8X+^oxuTRvpM(uXdYv&C%;t^x_#H7X(04N zwtnGMIC;8q>|H;TBM`8N2Nk)GUIjTWj4h#4qGxCX; zfsQxcBiw}~3t7wxE##%b`rkjo;gTO0>HcmmAutvl#f>ake#(%+@S}Bv{}ZTMjGIQK zGvy5@A>>~u1)NCO@#*{Ccvhv@VC4VVizta7Uiv<+s=jQaY2Y4VIac5!z@1guZ$f<2 zGRV1Kyvr1F=`C99fIPe^Rc=3X@Pdl$ex!nB?IT)AQcle@F}}Q4WE;7Vj+VUGINc7B`f?h)szt zV_A>#h9lkkyy}rjdgoYvyBdxec=50=R?*RLSIoKeQQJe&gx16Q7m3}a#zT<8Aj0HL zo4vrh`1HMyu6g9neZ9k?O&B+f_~+(A>Jq)j>aWxziftz@ih|X+@S5i@vgPtZT{H3x zql_-6Pk_N{iKp6eCVZS{!CBDVIsTK7qhWi_;?qyB%Nv?F83+>AA;qDp$YsjUHj;M1 zkt@bK^q*CrW*w3{28Wh-AC2;U=Q2eRx41sl&An~HINxN{$Rxw-+?b6Bc7yLEO}KS? zk@wlk+XD6e`V>RPjaLtqf^V-4?2t+#mWx32^#Fr)rBtRN@Q1ma2b@=z|6}sS5!$~t zsq_xXHK?wAy?MofI`9W$Wr_HU_k$E;P~Eqjev$o^@5ActDv0w&h#%x>4V0<<6t59K ztYquLYuw|$FIh%t3QBs`+)xXwJesY&ySa=cmMug`aA=h5z*!8vRBohwpl&qUgTGnK z;{@2hEox}ac_d*i79d_p7an2P;Kf(Pj??K5yqPb#OACmk(!Bo02Xm9%P7SjpSkbUq zo%p1UK;5pR?(}Qf*uK&+cUO5y*vy5g+FTl5k$0G`g+Zmy$rtrXnpvMlwD>CWtR8_& zr`2LTA_u6`NLEy^P5b0ax_4dTs-1eN9tOK?4}Vt z!a5iSM<>BpCzC2A$AEzhRf*Ybv}9o`+aWFnpShB{UnYkdnsFIdDH{*MJT2I<&1QoZgY+7Z*-+SUs%ll{FiLH-B6v%A)@ltFdI7z- zVPj|#PeZo5j)ip1^6#{enb_U#fZ#@ zIO-<)CokFZIW-lcv}m0PV;sc`67@1?hjYYc$}$!w+Z@AWxO5QvQIhj zH8ceWMg-L0N(x3XIX5&dpJ8o}K|sVwn%;%N`PSej@(W74tC?yxy|itjN=GqLzFfP~ z9yQ%>jX$mHx_CNL>&l%Us`#0YqzmkN9>+7ZoSlX*<}>%}3QnlohGebS82O&cz^KWR zd#(Zsu?ahSQUdxaNi){9nQR0@dmm#~#e9D-?As=e7xGF?wTx0{N!u3AegJsBd|$}b zboh}j`#x@3rtE%pn6WYVN-;^zu%fh|MOuV)cQ$ub%Yh?_%vw~*TK02_`jWbQMwzy@ z)~5r8R=pW@Ftf7kRDEsG9%)09`?XM|wY==qRSWYW+-zOz@tvEYlI&DbdTc(yk#u1c zH<=>ayrNvnK~bTiCy{+x@eXig?I&>fvE!2mT;rxf%5hR*dwKeFMJXzS!^}ebC9PBYuE^A3(tya=b9Aj zv>MEnMfq?JwwYu;-fF7 z^HL>^=Vx?Nu(01A=!?SvG7_aU+6rY8;b~)3($gE>+AB_n6pk#I5EmZg6Gs}lZVE1sr zZ<#IQ@FfHG9?sI5`D^(CQ;!F`cJd988p7&Q(#R>!WRgT(upI}$w=_yFaU0@7!dEO( z){EJMjB?I2S0d#D0g2a)AQk?Y%KkL2p982fu<4 z)*9*h7Moi|LHreHb(mIEAc;_Bczx8mMamKJoB@?O!`YW8{lPHx$6r$(i_eo- z!GPf7(cpc_c0J=4&@_-^%JFxKByeaqt^pZt<6{Vp#&_rxS0^*H#f?qy(1 zloY`MX7L@A{^B>pyOQx3;v(E2k@!H$2h>X>5ItoMVIlr2<|!Wl@te>SJ`i*~3?%~U zN6cMHka*~9$Sa6;F+o)ElJEkk9|?DB#AAa=p^UCl3rYeco!G+?)4w}_OP$u2HD5Y zP?n&51mJgHSFZ@ogcCsdI8V7RHXf461@eu*qTENDhJA%qJPIX&7%ME&L*x5_a#r!c zp3Wb!wdIOxIdAg<6(t^$tr}e9?fMfZBWa1M2;28k!@uOCVZf1lDD_HCg@1Wd{l0iB z&#qT8q=andT&-a%@7F`Dy${3kx!PvJAh!@M;N-(_K5a=%9?2_&>+^>L4MUoQ9J&4e z-+F@ntw;2~>Je9^{7>fW-%K3UfPz(m_-32k9qaPB@nn5OEw;Wzd=aIhcrtMz>MKSm z8K{V9rATODg_Bal;|kFzkUCQSD+3@2r~g}&`Jaq%&c7vj|CSW~TT=XQN!h<875|p} z_^*t7uk7@BLcf)gMX_dcBGduu|5xT`b-88b(W|TZg@WM^o#K`LA`}dL2s1rM zss9)7hbYqoh1KG9|KQO(1>S#{P|@M@MXu`6Z zhyE*(sD?DG2!ol_lFVXvl1kKL5rgbPQWi$`8CO>1Y|w3V+DPHLteNTDLtm_ zH;O@dph7dK6pN}^si-H4fmU=@L-Ej`A~5B?HmkdO*x^1)>&LvByrCi>Tv1bA*r`!h zo-Yzxz^lGdn6xa>5ln%Y?Yw0bvK@2O#5_<3E= zCyJ+B<8aXzY){cJLUIZ4l9f@2G>H?xO^M%f_-R+@<{b7kYL)$ya zIsX3RSHvN%NA)sq(!j(*zfuE|CiRcZqFnSDXvdTSQhFbe0@G3bTSvh;&y_rK{!3pQ zP2gP!m0bd+|bQWI)^CnVf%%J6U z{DpqcC24eaIi*noD)kA9c?%Ni(mldzX`RiNJpZ z8WuIwn;fh@+3rm@KzqACv&qcg|4Cipy%Og9Ie3ZC*7uHL3Urczl4r4Z!&Hh=lU4+l4xMBE_6n3#lHb z`TD%^SsVLm7?8N=QxzdA{8FMI-ro}rIX zXUouV9l*ntj%?pow@3Gr-oeZZ4c+3DY_=RQLHmmidE=l+jdXA=EGvKXyL6D4DV6Cz zEh{w)@cxiu3+y#NZK_12E8aV9vAPjjb7Hj^KX?3rx-#DX*qCTx9COj@=|D#IW#g7u z!*Gtbb^N4+=|g^bfn$k|?14jCrOK4{$i-P+`a}=Zv+-bWQ~h$DNkFnE&>&sYCSI2>yZy_)k6R;=tok(s38wM=j$M}nkvvN@T;hPDUUp|f87p?|^&l|S)3HzZp| zw}~}8>Bor$sqxaX-@NGe!BGK26`mfJIqah4d~E%G5lmlkqw?Et8+}FZv5E{T{1_dv zS`EMhf|-BJS;IvOKAlbCi^+=DCL;XFQMlVny%qz8v+tqqwA(GnuUSg9&%~;LTZVg{ zS;$MtrsuCxWqi@t>=N7n3Djubt%t!W6ssqM?^RJI5x0cY=b2sn`5Uv^+ujRU1%3`} zbuW^Ay5#mO5;tAvepFrwPwrTz98y!BHA&yj9%qU6gpP6fCj<(z_Om#~QO5Q5rEN2> z61f1ARVU?7@AC0%M4Ctay=+l1dQVimZN7gD`n@X&Ad|rb;u}B(qQ57G2zj7_;STf; zq9)xYQ*v)TRHlfp@xb_CM>{Ss-{i{VM&0E%+(PW~Tw>x7y87^HNg!~+{qk&6(D1WU zRo%G$$yH1Jy8qq6ZPPe~F~9?+^Ek ze!_+K;A&c!0rG76%8PrfE%YwLmYD&J6=*7Z;O>a?dBVrA=q1Q-ilfV%X^OM@V>>`@ zEQNl$GAtYiQuO}XmPB&vz0d!gC2RbLqOpYV^aBA#&~Y{JS(DQh*ZTo{))puv-43|7 zS^B>)M?KY_P+c-4e{U-sJ0oY?V=V)dHAUyl@D&@ebv^#UEz{viFk^Hroi>m!YJGRU z;OPR~m{TB~yacz2#y)kO9ga_+2nc4u?}xchcPq($8KlX_T@e-dJPx}LG2VZ9UEWZp zVYG8cpC^?J$yB7ae*|ABhja0GZ3l?^(tdX9w-%%jfNws+5Je&jz20*-Ru!v(LL+Kh z4fCD=f?`MHLF6Ie0oOpHGBck!S^7XDaYm4EZq{hpd*Ch&Dm@d=X-?=au+Rvr?Kg}v0 z<+ql}YOy61K`KIC?_dvGqBukoSJRabr4r~V?T>RIEU1mUXsyhyIK(ZNpvQk%$sI3^ zIzsU@UaJdBGNUzgs%)AEBz5R3)#9D4^_FyEc|gOB;rcX{ZyYPN?Ud_^^=2xG=08;Q z8CWD4I+kVX8VXi=R}vpvR*b*5$tryBy432hR+H{zO~0%z*zauXT_d<+?}gDuzc=;` zM8($}nOC1%pXZ(n;^JY8FF?r!;eBq`D!RzjiOK`1ekJqZZ$#OIkRnS&1NG}DKX7FG2Ti7yN(`~lNovm7S`g86gFaox|q5f zQ^S1ultG(=Qw7+mqN?h&rZl*;orP^}Rqc4bb>6_S2vXjtGdB7nus?2<_qg8q)U~-E zxN}c;+p?eSKi*>NpM90NpXrZ)2nCxUSK~Xdy;Q#*aGe6M1*h_(s=4~iN8hBSq_42S zTvS#-_jQdL{4~2bx$^FU-!6B8atQ+Fw~J=RN2*9*52F#qFh&jQ?zl}K44}=HJ)!=z z!bMd$WM?&jt)VVOM2bo*2Oh^!a$4G9%r2;)?)&HV!OnjsIx4Zl+&B6kM2!Qt=0Q9Y zfu~HAM)v@vh^ld$@0x(BQ!0c3G2;gM=jFn6b{Em`xvJ7zj&>L0mwrcE!0#G?(&!2H zS5y0S;Qj}u=cR>6=vJ>!o2GR^$}SruUw~WdfM;vMPIF;DpN3y9=YDJ^1XZH8$4yQn zR{$cV$D6lD<0kIwEm6;%n~IbJ$xwDrPZ>J5>(9V19!2r6W~hOx_a)vdHZQ8i6PAx9 z96`I8Jcj<>z?B-GTwCp9&FSj8`~2hMsiO-_?VFMPK%cAPtLEaiO|H}p61%&x{i>yQ z^Ov&^lph8khXG5^>VWgCETQ<2*OjAN13F*mKOuPMZc zX3)S++1oj|P1GR0+iu#}0_Gwt*LIb_)wvoNqfyCU?r%iCG(v0%6iK8m{64~fa)Uo`Ytir`!*?lg(j?! zrfBhN>s~=aVSIs2-P@BI^cxU7KSnH!d=ES@1^47LIs`#_Vwd$nOWwK;3tLMT709!$0KlvOO_mC9iBM9Lhm} zKtq~c`3;zP*XjPr$i1I2!V7Q}sT=x-&5JGg28BUC4OZd4oeRl31k3k$s{L9e=$YF^ zT4YsH-k=NWTU~hfu<3Bb<|)AyBioC_X8Fk0?XjhDzSBWQsFSeqN#a6yvdplZobJt_ zJWSJ??BIhraQakoVPn>&67q(BDEH|N!2ka*5f%bp8tE@f9ymfmLw8<~K61JK@ASy_ z2~3R3VA{W9s7Bd#VT3;O`nAv<0Bv;+);#ciE;gAN_Kf7~MzBY!5rbPEN8!C&5rSZ& zFKxiAa-@fMU+jgQ)|((EAJE%y`*2hVM&xsgO#4L5cx$F=N!=Y4+yPkh|D@QL2TGa) z!e6QH5D^An9AN3g8QnudcM5}vgb|@})^%rcKc%aLz!Phbc@)AE$|={BAaswH!ek!C z{X$|bWOb$S3`HnIXqW5QlsyWC(f~wZ6W|HaBvc@hppbSjLi~swd02dSE|k3pE;Wl; z117axFQzoHIK(@mhre(q7ttOyG67#4Y1)D?Cx}8J7x&OdMlnz5iH{+afBIvo81WY* zIi_6BCvqjT2JG?#oo=bZIkiv^>RIZlkoSd+lfez>ho*Vt#0k7&IMXsR8GxAv#Mmxe zr;vr6=92&{&cOS~__r57C>7_12*+eZwG3S_;u6g@Jm)U(_aUj+T zJ1*7weG2_R;RS9y%vw&++!ufldUPWfj^vUYe&k0vL@sm@^QRO`Iavi)kQ$ zOatNC(Lcf)_h4-E>dd*3fccnE`O)_xtx@FN^9xjI8sCnpXBYTyoAT*;@E zT}7tHuflZ-agHNI9AOu7{gRu*%dx~nv z4z17a3sZV+lxh}X3`7Wqtc0Z;7fe<$JLu`N9x}PE!2_pr$-?H|xao=R+bxws(cm1)4w%HljcyF0C#(|*Kl&4K zh~;7wm_C|r%ek;^GaKw;&R5`XCOX~W3Uz24y^eNUob%a#6QG<9JcpWoiY5=1lso$j zsEWcM5OrV#g@c3c;=nWKP^991h(WR7jV%H>0J%#F!gYr?-Fxm>_yUblob!n$`k9nm zMHHzkST^A~amut?y|62MFkS>PjwTQ>TMWW3^c9Td!}vtv^L?t|oO^n3lc+GRw_YwM zc%%6B^~)WQ%L&_0cvXU%53z|91hqX3tSlH_2;b znWU-3NQqXbYnX@GX!40xhWN>2QXEJBb#xR=ROddRFvDpWJIew<*F4#TGdYl z(!Gyi7~*U!%f!w=A`$okukufoo12@!<|bj=CNB;;dMrT1Yplz&xyesdvvNAPq_msB zi}SlWwOqN#2FHeLs%%WEh<&bdtS`AXEh3Scm^;5xZqz0}^AmGiQ`(}+UG{P+k*>gh z`Yke5lN?D)NVBQHh%h(^J;$y^#?P+;Pl}Gvn8v;`5I-h0)>D_Zcv23OAC@c6yp?V| zJecJHtCKNKPW;+dv(daz)zB8NL!yh3+t^a~)E36$#o_(m~$$~ z>m`vf^nZ(}X<-Clm-+SAU?>ng+Ol37SHWI&=KCw7aH$RV1iYo2I9?oMKF^qCC6753 zC%V~)d_m7iCqiu)WlbKZ?_*Nh+)01<1>p2;c)w8ol1 zL+?c=C8dWUkNffr9(^@u<)%Y@JzktKz?v|;%(2*B6K%|V*|RN=qp zIFV;ao`$hJ-_c81@E--B6G?+{f>yr#Us6)VjwZ@L($x^)7eOafDcOShE2!!PMJKw^ zrtS}PVB63yui51M7PQ_PlGe4?QK+;TH)n*K6FbA80wXs0BCe$Tts6 z6bs>a^Vc!%_{~~Zy9aQ59B4CIhiAt>e~yK{&VT+%JHS76Zr-Jsd$*mk{`D_J*f+B_Js(Io z8`FSAtqcbn^CbC+6;ECQ30UEBsNM-%{p-oEj*Lid3nY7tASAcIlS4#$LdSw2a zE?#K}_7^02C$%=sl{P7KXD7J#*wZigRV|eC^axsWkRPw^H}yPagKfr((-yU?q*OiP z;A9Afp4~? z^x@SxlC;oc<6u;BCJy0V?J7i#LF%tvqo0Ke^ zdiWX%u(}=*_920B=+VaxwY1u>3$Z*k-IoKs+I*4gMn!&eH7suOZ@I_;F=>s6|4uDc zxhqw%OaI#=S3`nVF#d`V4h}BYex6SP7b2`ZHi@eHSBeSyUTuM_B@4Ex&a%Ibz3+ut zn-{Y7;ZvaD(XGLrWF@~pE@^#X`64rW`hM-pc1_MF=2yc5F>DKM-Np}&8o>VJp$G`T zAU*LsJ<>q*SQy)hn`;2+`R=aIo4;`b^Q)BDLe;JD2k;7IYgxu0=E^7f@i)~ABDL{ZZOCIlBAuMo-=RR$B)xXN;QS2Tw0j(L?`8x(TTK$5h;M&R0bK zVY7ea`zl_i>IJjtVBoK>iJ;$IUIw)M(`t;&tGE8sLI>PNi>n19lp zRPW%ytIeE$7XGWvPBqZPtC`Xx^!Ee(;1b(ZC&{7>c#f0s-jvVQiWku+uy0y|T%3RO z5}o7j{=UEb^em=Ad4$jfL(2c%H_$m}0er8$RuKL~IQ573DLa19oiPYET#tESY~Tn^gA_LjR?~08&K!@KCtFgH$syQ33qIJ2vxM03#@`k~O^1p1Pttg^%v; zSMG1_?^#uUh$fm6GLNGC{=J{PD>ezoiYP&OfChiko$Cy_CX6`%zyI`HvjH%Q=#X0Z zj+wyye}zBg*YJnp|Cib?Eo#+Z{{|>VCZwc<%E<9@46vG(% zdttrKE)0YyvhD?NzIi=r`iPf8gggWvKR&exjIRpyl5-F2n@crsq!Ex3phEst?9iBi zdaC9H$>8gxMRyH#KJMHlfsEiD|!U)m`xD|-!KejEMge$biZC4Aps zg$)d)sp+Zlvx>64A3tUTkx|6#4ffo_P4ytb#h<~kpIg0`He`Y|@aJZaD!5nWoiPB%mLF{KGGbj1qffExGAE-{eMzyV5 zn4bZxfH?kq%J3DP3^kCj-Se1FZAyvF$j11NnMjxLt2AAB-Xum4L-1qIYEOW-dEOyv z+UzflgRu+Ta0SV{%-6HR8;j+5^}@}tv$B}9r;L9Go@1xCa-8+*z63XaZCZ+nE}9A9 zFKHwv<3nb+PDrTeo_He$&yb|*phT}R<^~7)2LM@=!8nZFXr@&5PG$`qTq0fU3KE0_ zC|FkprsyzgbJe#N-gt{;A+*~QS2D=kaB#jQlp`N@NjW3Kdg+n5Y;IgW{&xi7h*c+u z#`=$qOV7>q6z8iFE1Bv0yte?axrFoco!wek z`F8o`_61&1)lMEi#$_&{MgP`zYS+)j!xN83(yFIL%&vA+^Gl~)^ROFq*VfnCdw4kXqou)@Zy16(2~F{tNOClF{@f6>tqgNmFr*urtZEsN z3d8BMTE3cmQgSv!G|9h{CI08LUIWIPS64G#+){H63+*4gCaN z{X?{5Ut1lO(n@CL@oMG_4IQ0;SN@h!QN1b8-ZV{`d&H2w5g4~C&k!m2 z8K5!tcvw$tt8DL(Hs4wam#&Zt`=zdRV0Zu`XQ|2FMfbC?EU&iKPNJdAMnze<{~d_) zbsis0eSQ7^>_cjwok%p+UGVGWms!h8qNtVMFbIS4Z=kU-AVe-me+JxE8fr^W> zHemg7n}sdtIEg?{bW&}eJFoUYdcUpk&ATpDXp5WJL7HV+sP8lvw#2% zIzYpJV?ggA-0BawGn+h`gXVYSTiZ_Uq#d4M?Bb1vL#xiS?q620|usV_)nO4}xS+#X%NT1MRp0+xyFXSc@4a-k} z-BtT-i@W+hs7+m=t+n+ddoRo>hY}`^;|4!kRH7zNUJs*Y@f(OA@3gJ+Nzwg>4S_^CMaB-@#`4V&=tvHG{2 z-MnwUF{~vEX>8K>DC1htFHVPZOBrnrvh1 zu+(PWjzl|27xXrB_s0t>C}k_<&u5%$6vK?`g1rrH8kS_O+b9Nfx8Soxy*w>-+jrLI)Ra2YtBe(uh^2 zXjwAqlb|uQ%L63&Ez%=F^Mc;(xAns;3%P?jBMG@eR^iyp^>oyMDPv-aUot-2$sYaR zKJMqKIqLT9$smaty10G#lMh&DCESGMnV8*MDJVQZdtK|DK|)ZOrc?lnjh3i-JQaWD zI&h=jj-ZZHpGxRU$AbC=4w);hZ6^VmG{P!}YGF&Hjdp5hq5H08{U;uytm2vCDKW_&CsZwz>lj8#gJSj>^Vs2ZZws@D$Op?V!)Z&LeIB-+@=xKeLL z>MT=|5%sCO%p$^)UVw@eblVSyb>qTxX52Ct;xi1KufK(HC!jCFHt6-!l%rUpv>kY< zSivF|mA4p5s&!INzqOJ**=Fz?NK61ls-QNY*z9?up-P>zg?-q5&9D; z3Y-{ZdK@*(_%YJo;K1E!0h>iMT~S5B0xe(n-pWYN{Su=fD|C%eFr(r4BJ{NUWA_t3 zzJ)d^&XJL%U|}yvE`4}`{It$064fW;%Eiwb_}`*W6ieI|{TMtdnSjX9ePkimfQ4;iEK;L=v!D9l z1MxHcA+id8dlA=w0yn4rdR=eYxja}7&`DwVJG(So_C6(iglj}%d!C!dbwc-iK1LzI z))R9d~Z8+EaE7ASjt@u zYenJ*I^cJJC#p-;pRam>R&KW3z43maOa1x?&Ld*4gS=7Y+UN@OL8n_ZTcrkoQ8+7ZEJtk}2vrGmYJ`=D#a3jZ{e%VH&d!oFBv zfww)Yp@2GM`d6e&u4?5w5~3N6Gy>(Fnmxw?T7a*1UH$Ee;zlgB1FV{tT1V)ODB`KC z4BU6_LEpD2JD5Mn&m3*nVPMLi`mib?8mE%Bzu)0jtH}7xZ>M?j&u>_`dm)t!E~V96 z{URl8=YSRVdq||_RNnurBMF?m*^H$xvVm+=|4jBD}Bg_>$W^#@a-V_bchix;(B>RwB= z@26Xa6R%1G$4OJ=c~;kzK3ivh7vd9Pl;1`Cv<8op-!K11kMQs?5}X^ZfWH-wDIwD5 zZsp{{iFI5Q`b(lh2t~cRNAnEobX5!?MGcq^f4{%H&ciVqTxzPDqW!=frx9*W$<2=0 zn-I&ns)QOnltS4%R!sl6K^k}cqg$tNA`1M&+|Aa)OaF9oR^pUncbn&6>d*dJS**8&ZFxeq;S5U|s&ZK;WiF0Ja{Bl#Z3_a1aww#vyp(k zSjE-MY9`LcoD&oIjrmK)wvJg+(Qq-w(B~z}=x?Q#DC78{%0A!lvopJYGb>4a1>bzA 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 xHXK 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%0D67BK>B@A=~HRHW%EU$EaV4nacx82T&Hl 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

S#|Drlpl!SsW%kcTL~E*9M2G`qA7}_P0-(*V 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℘3)0E#-1la1j*d#XjYELy) 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%0AZ-th;4(Ef4=a!T^TK(7}9&|PL45AQUW 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�(BGDuP0pmxh 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 z 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

06Eo z#CJ0-?Wko3U)To_-m4A-juZY+jj+5JLO8=t*C1kqeK_G9;1IB|aDU*(h3q&g?q(YQ zrx9WUV`vkOHei%G3V~mR%o5PGz|(*|(6$GE_1xa=^+4G40%pONiYtf4k z)8Ylf|HwK!{wOjCzYF|F;fJ1U312JF7W3)a?jqs4*=9M-VJG~1SiZrY%(&wYA(d47 zLE>NCF_}H-h%vrIwd8UKb568V-{n%!$J%p7)# zgln0Wx#Ah-JF}R>Sgv+#ciav6OqOR_b~p^e&)bg^{z>~*mgHI_`6>E7 z9W;;iN%dRA8PKtx=s!7U5d9R(D5;KrI-p!{v%L+PZ-n1o;8Mp>qAMBOiaK5b z{Vu%MLih+;?C+@I@w&u)Tx&na(Q@f5G|b`NL1%yUZ7x;sL){h3SBpshEA~Twg#8@{ znB#PTUkmTC=3hBR6TZKF7Wfx|XOg_zv6(Ss?sXIp{(6UkQl5kN*e6k`>>x?G%)XKE zen=j5yvMjhCG2yA2^WbVds}5roP8@RI7(#&N19yL&aK4ltvse319%*5Jl3`CJ1}ac zXmK>6cQ;#WUx^4Ai3k}9dIacy5s)vzc;z8NIFjRz1&q~u5Qirbf$cov>N}A91oR__ zlSQndeGo@N$4+RQkJ4;Nz6Sa+&>uivg?t$C5JfyhF@p{>#~EM_aI^Xm=9G!2pfn4m zjGLWF;Ikf^lP&oQV&mJ~I$Wd=8sT${Y1}`5;dpb@^PFvO zgU)Yq{IvfE`1=u!Zz5*yrP9{+UoqxvU=Orx6_o?sh9oAW9}%Ok)Vyy3)H%z+0s z!SifwE^R$+d)4?7d>-ZkEl7|Rsc98uxpOrUuaEw{4T*bM?i5vy} z@3*gG`Syv-M^<^2=L^w)FQ9d9<$;cOk%i1`kO|Hn)S3d@raVM=YYW$jlGwRH8lh>j)Qi{D!e(B=FY}SHDJFJqP@Aa9#ywdyYE=)5v=j z$a`wJFAMsDvsTH|@rv1Al`Iz#1qJMbl zb>_1@%44>Fs7nZ++$WKG$rywId&+{5wQ%GorMDIqLn; z@CoAWdc+%|%bAaV(ccfw%`EA}+*gmV{TSa@q3zee4|Fu4@59k|#!0Yh8KO>h@ObS< z+>Y$vnRwJW8}Tp+BmO2@d<^sAU*U&pSo<3C{0*2vK3JQ}r5u?wbDzP?eFii4o0toY zi2O#ZWzT?q4WpccQQnRvDOaGS4o^9nBTD?SV>xCzc~$sColwLa#ZEZ*-*k8V zq!@+!>W|>QdIj#Q^G;NH-C`n5?|B5Yw#dbFUPi#H{YpBoAy{vn88&sJw-9V6*hSDv zz}`4S=c5ECEI4hQ&soqW_~{1#X!54w>-sD?(+918bAy^C*HM z3&sMZQeyGPqAzSuZ(#diqcVYj`mIbMsG_>Gt5Rx-4g#cgHtAWNbfV0JdW%Q-Nm)qe zC0D55^K+t(P?i&{Fw5lt+AZ>qns&}ow||D&*N^iCt`2nUsI6-U`zgY2*|Glt|IetE zZm0EsI&sy2ebk58=f8zreFk3_@TB zf9rFv4!AGo)xlA;m0`8W*9C%VGmW;ot_zfButrSkn2P`6vpqqp7Vn)T%@CSR>QMDY z{m=S&{ZqZoe}jLh|0e%%|1JIzsKdLr3abu(t)rs9?MB-$+t+LjwohzlY=5+!brd=7 zQirHFuog96y+s|V-kQ*+U((zC1N}MOwfeXD-}3M9|DvmX{I9G<8Sww@e`Rjli?$c3 z)jzZ6)LQkc!tLGd{k2H({mFMur0U!BZ6eK|>W_(-|6~6tkri+R93syD@3PSxv(X%X zv(X&0(Ok08T56;DWTUxdn_!)3-q@yCG(#1^bOM?`HkvCo%5pY}ZyU`C+Y$?wTjv!P ztRh%z0n-#`w$0r>)9%K$)jIE>^KOE@1P2HX6VU2H`B>Qae}d-`Bf?He#7@@(cAd^4 z>vI(L^ai#MHrlgrwJq$q1ax)Hv%x-pl4Q05qy=G5p=>8=E0v#D_7c^I z_E_^8D&Mc1ChDZJkR+C)-A1x$HBm>EI+B=2)M2GTSxecG+Epr*rOFJV_A52YGKFS} zvR5fl>M0j1q<4}sSD8jszOqYysa9HvDk7_{f$c?f^X;t>4-2>Do_RBuGinMHlRoj(TdCDp! zUlPUI_bI2Sy+Wl}nJ3GY6S7iHlQYEM@AdpYxYuJZW;^ZQ5wsIhPV-)W*_Oq$XtVJS zK9^}*mdZJ4BYbk4W#qXIx(>9}t78bCz&)cnkxCj`AUPhAO?-DiE`($jBK)VZ>cGeIc37q8|3!3*KExhkn4l=f7 zwXb2Fu;B#naUF+PzvB>p_ltI~gxz`61L>@4r@eqP#v|^)F4KNgoy&be>lF?GtLQ4u zzS6-y8D!rMYn!qAWc^dn$F1B)n~(iKrE6IO^U1flT+8wyUjx*kmJj@D_^<#z8A+OX zt&DbCUkeB;%3n0TPFM78v|jK^$88UzxhusOTItSGrunn-7v%zfWt2N@MYg+aV{CWx zdPl3>&5m1WwJTKbREyNR)G_MawCdffj#KYb@8^|Ioj_~e_r0sVKk%;cuJ!)N`r88#JZ8}hw8lwV z<0#(=d6AP9fr~)5AY`4R7SMV|I}a0>&h17gUwc8tJ63ix;OE8~cQ7>3(L8JA#nP7Dva@}En9l=I|7ICLsDjQ`pt#j)* zYs+nNr`#j=5ga5qB9F^cM4gov=zLbTD|XsL4^TYF{4sf!s5l)tbOe+A-2T@x z`RC{Gzae{nTdM}GArfzeNaXD+WNdMfGn=$Ks~GdWEutHN`F_Vv^R9=h2$=84*j;HT zZ3WHuu!MPEjPH37ZUx5$T!sFQf#qjF{}fn9X};*Z#^Ah19J4O9-m!-<@i#%H`*q7O z$TWa1fQ6?SyL`Y)f%*RO2G>l|Gv8T;G2*NJL$Kt3jJk~L$^u~MSIR&i0lgk{CGc*- z)07%yN4|$UMerT`u<|G6ydz&7&-;7t554W$BU*)j0PW}Z`rq^a)_>6dJO5$-QUAaD zj|cd!gz>rZU6NrMojC+_^)Bd&SJ2hFpsRPhw}Rgmy2j!&@VCL}>Rr%PyV!2YC4jEr zMQaa#o+0W;a~)}3Kw6iP#+9UPJ!#lNwRh3M-@lkA68j!=uY+AnUwaXAw}Jh{74`~= zD?iX}ycUW!{Fg)UT`R&vf%!U5TsnwI?GH)jv|Zx6p=UbQ5q_hi7?S&di-6Z)JgS9F zuC$fW6;i-H!%kVvKGRMkZeL{omQd{9wtt&{E+0m@%7nu;!Brt*uE$(o6xpsRu4>WW zRpY7?*STJFeO(N5Ep#mxx4S-ZofYG}S9=GG67NaxDN*j*?)!y!R7=uQ#TTiK8$^Hc z1?tae@d&M?lf+A6sQ4NkC1Rm?RXji*{jPYByt@NCI@{IPuqB-4c|DNcux7gp5 zHv4Y-yV7kxVgFbr+0Q#{GTG7Jah2?+HmEJ~Ds`*+rYuw6Qs0sj)Sc=(@?rHiPE|hc zbURbzx1H(E4B70=cD^WAx?gn9RUGbruelc~n)^HMWlDwqpI7d6f944(PkP;6xAL-A_xhE3Z_t~f%=LcYJ)z9^Rr?y1CB8pvit=+UO-obW z)zY)O*|7qoYL06K&69lIT&JnZ;#UK|NDgj*#8?+mLF(L#R z1pNsH5zrN@F^ph@1*0sPA_BT{HA(=|m_WMdD#MsUP=&KFrqj8WU{*J%Cuks8XaV!+ z+QnFI)n`~?0n4r;SZl!sg3X=sT{f}ZwBj4I;v2i6Ll}FlI%d1VIDj&iQ;fqF@7R9< zPFnp>z!?jQNauNii=DuHlXu>KtQS%M_#ARw5fburRt^Wt@eIo}epV$oJ2*EupXf!w zrNnOxHV0P+*9A8QTZprbIE#WigL{Jef(MCnBzQb{ia0EDHh6(Pw;T50Y{L`WX#|3c zj4gBYJ4C+{hBJvo#E4THnnh(kBTV!l zV;z&Xm@BY)mjlcK=k3zF=KHr ze6kat0p~o~crjT?b|ve5;81cjIV*WUa;|YYxF>l?@^Hc3c z#&kyVy5x%Gsb3_yCwX7;!Q{ClbA)8}nI7O;pe;`F@#Is+uH>`Hr;;xuw}%wykyRkAn&)6Sc5MCS_ z8(tP{3^#>JjHd9)@S5=Y@TTyV@b=(^@UAWz5nDs{v<7!3mxoS<_Xo?vhr&n0Cqnh% z)8YK&)xo7Cv&g8y+@To}J{N8apGXnm)1eh9s*#i8OD;`+35Lg~M2w1*jFkQ8+T%cu$OGU=2NMor47lp-3Vyp*xT&rd!W-ehb~ zDG7~b|1(WdaUo?wXlu&Elqo4yp@}KegL6}ALsL>_rPQZ15Pu=jOH!7nK!3`rl(nSO zYAa;}(Oh?bVan!|t>KE49ZZuoL<%tX*_(18<#5Wel#{`2DQ74ic2ZR zMRM7~$dJfz(m65`W&cM;6Fnv}E@fDxG*V6@xF9lrDKs`xnmhz_CFqfar-jQRGa}O> zGYQX*%netN{QStG$WqeZNP3zht0U`-O)0_1#^BlT=|~GnZsS%WjiE?nXCy?~tiZ^j zY*0&<>>&%o=2*a5q9gmrl7qoTG}c2SMf+R8sSAjI-;}zN#%mwb$>p4TQ`e-fH%_N+O5MWw zHZn7Hd!!{aDs?+&`_x^WV^dpG_Y-|6^=Rq|qbBvVk)O)Bw?6e;YMYTyHXMzL;DyM+ zNHnU3N}|4KFd8umlIKPgcTK^k{vw zfl60L7aH;ClIU{79$gV#MV?_!PIPT_Lv(ZSRCFt8%ZoMyXY%MocZ8QkcSolOr$zTh zryGZ&2cn0g$D${ro12B#^1X|70%u|0CZXiL*07t%th#c5GvWm=XIi?pN- zNXrcuM%Nl^f|JsQqzw<2N1|yXc@>N9Fal|#Q!CQOq>W1}O)F2EM0TD^tBh_o4y9#9 zcSH`RE=Ze3t7Ic(!n)9elwjJ7U}JPj+Dy_tn^wA#w7HRuwEoVdm9ac+KGTtZ#gKipVl5Lh!w_) zW8-6Gu?k~-Y_hQ>HZ@iqtBKWrCC`Y>F#;*O4LfDp)<`HeFSfw2#}@N^Pu>?D8*Gj( zi#4SLjX-Q=B#YxGbTPIjwmy=@V@mX<*p}G#l)bTCG-pd=t&v5s{jo!7r(#FbF2qj6 zPQ$8m6c6?kAM1>@rHk+;-gTs_6hC8wl|~-r9LnM8J~NhRW$&cZgUS1U(j&pja3RId zmhN7!zcDI#X47p0F)%}FmwxtKm7ePa5Q;DuOQa8aa@MrQ`C z5r=3Utl_asui~*wpWc0cc2Ixkrq}Y!O`nypigQbPeR>10m?RT4mZgxSu`GRI`jSw8 zqcwerk!Q3f>%6x~U!J~#@Dko-g)SP0Qj3#yV}1H6+H0*(Uu$d$Ell5#zL_lCkiIp& zh$OdC9M-4rNZ*~lH?oc9$inmkr1>!8P(4{&NAWW|{aE_R;03gQb%5KVte6M-XnIk~ zu=F#bQ3*`@w!Gxw5!#`opQn|vES+q~P{K_{Q-&);2M$?y88iTg`ctIUuzsT^Bbt#F z3Z@*(7(jc`Q^6w{xuH=RLsFKL&O<57DMM9f49^&uF*@xa7j9DJL_QnmD5|x;A}zMq_YN`jU)BBM@4i z(VQ`k*FoNuk>=I316h_aE;KP?UB*W8>N47kuA%+L?2HzFwllIiV_PVav6JR?aU>Kj zGzw{7R7k7jme|USJsJCgi!u&o9LYGIaVq0%bZy2)Bb;#|qdjeQa8jl{(?d9r88!l$ zu~0BLJ2P(BtqgD`Eh{C+YeZ%auMwGfDLZKIJ(TtpXR&t7pfw^dcs6q=)0z383nF|) zurb9KoRPkNoUa!$3z^O=20gwTUB)!oz;p%plR2|xPR*<~Hkov!(WJxU`5Gj%Cb&91 zBeo{BIJ1uW*qXL8Wd*IUIk8Q&&#&P*k~xQMNNvrW$JZ&DeAPf}0r3~Zwq=lMVmkdm zWLj_^t=H3x6KMy-yLiu*N!JV1UzT5!Tu$=EG@BNGWv(}A-l1hK3+@St)a{v@n9kf1 zUPkL3^S4K)g+wNHaha`5ryb1PpEe}(P;_nP(b$~K{h22~pC~>Svo-|hN1Bb|tj(dKtPNRP!}+wXRi^As zZZYODO}kv8(}SsnMghee(NWr6^YtcO3$)N&rnM|nETRc#4@mK)WknhzEwrD1 zJkDzqWuz0)6_E?sxfvTHSr#6WJv@74_UP;}+2gWHlb2?fN5*AO%C5|wmOUeTrg@E= zJv+2DdoEvTX3yuV$m~VgOS2p4+Sa_nHLq>WtJ>~Ytmd^Uu2Qp`vsd@JR>jq5_PXqi z*)7@IvUg_h$=;WJF#AZvm3=%`lYJ_G`)u}w?Dp)l#%WVe+#dJD1MzS?7LRkg@f>9P z!Q5^<&$^nXxj-Dcc8(8aOXB%#Np?$@CGi5Y7iNa!E9H10Un9qh&3^HfJJGnl=Db8Y zX;li>@Cp(i&nrm0j5+ZNzFLn@j!!k3;?NK-{bq^hvG-g5i#!% zSa&dRzk+LJE{>mwpH5vIKNoN7C*o84siBGeeEov`BK ziRvZ%2gVoQ>6nLm_iKQEg?rY20nqD!e<`fzYxwRZ>G_HMhoDW&{{wi^z8dsTsPwe0 z6!-2ciQdf5J#=j6C$b68Z9uKf9k}Ca ze*-N(1bP*)X-_TW7vV1XHgKi_zsP*PS4^dcz*#A*|6wTasUiNqDPv`SF6P0zH;#`#R9GA=v`SS>Q}!j_qd9mr(i-jAfiT^2?0Hamb7ZXB%iI z?Ae7{G3KZ`IAOH)8R#sO9)r#@;8x)Ez|WvGA9f0+9oM4PR>saM(BFdODo8#7`Vp(| z>HME^@NWd?R{L8dzk;!UJO|EKQ99Uc9i{b*l``-LfIk}ix50Oz*9+0#Gw4MW{Me=6 z5^g}>(}61>^C4p9M_ej%!LI}V5PH-G%|&RX0rX*Ldxo*y3wi+8wGRh;M_lTbYj1J4(iV<1iKpZkAP6^?=VE<_TPlR#}WZp*UXjoebZ@-S` z^2WepAA)l$WKM%`m@x_34bS&SD~B1|y{0xq1!Bhb7kIdqX|)-W<0bC_xSJK(Petsu64h+6sJ+fa8G`g@1deEyfc(P8==^W`_7FJc_8hE=bk z7gxiQR^Y{`TLVA0o0$RpDl`A^|Gbnk%!m@u&p`efXihWv=;J}~zrt~AACBlMg&rSt z?gL!|8=B02+yed-`2RKdZ9Mu|3=h1=|D&}jR)p{zS;ZX6!0ds+mTd=7icARamGS>; zl|Px5VBGICM*(eJL|X$3{rhcs^P@W@dia z|2Ar!1V4yg)PQ4PEVe-AB4$Atz54^&T@U?E61 zCn2{Vf}T}~$xW<*WSIXk=G|=2TVT(6D>4z=nB)7+)dchUWtMTgWo8w~{{#QuQ=Vi@ zFGf4JNR25 z&p^X}VV0!P`67=mBu}#pWku%Kpw=Jkw7$#T@YQ-~7{GPy!x1MMB01g4B+RK||Iqwp z`U!ZW5V>~?dU_h3JZxr8(EntvETDgkJhmLAWsVM>JJ4{GIcoe}J$1La>Ys#?8=XW&?A7)aHOjq^Yk#TRnRB3HTR)-!s=!=t0Ji z5$qX;LH>lfqrgm=56(Yf+}EORi@9=P+@A%W41NQDdw^!s9sINw{AR;k$OW#0&g&rg zCh%9mnF-Agp_QSqa~tH_k&S|TTz{t9z{ zTtk^wQOlLar7i_6zJ~r{F00eww~4krMsqJ@WlOegFhA8Gf5BK;j9KOa{vrA`1fD5{h9E}y2sB)S?0p09QMB?; z80BsF&dO`}c9aJC4s-7Zd?R{vwV5qZ_kGk#2c8c75y;$$(Jz4J$1oO;A(oy3U&q)T ze}bMJu=WXPC_w}^gMZ1)vCyy;bQ_-W`1BHgJ8%g`b0Ij#LH`ajbRFcAVB2|X2gv$u z@X~(J8vK?I$))CAl%L#k6k0a$_p6S8{yt*+tEROW>rX*@FhgI(SXWu4D)tx=_9~)u zHEeho`Q%m50eI$=8Mo#R4gLK-@TbV1f1{DZ+d=08+kne}Z#8{o_5%13;KAn37JC)N zyi$PtG347@f!BjG7Wj448jXmWZE}Dc@ch<5tO$eg6wR-ZTLxq79)$ku;0HIx5i74+ z0#9OgsCSri3YotgG7*%HWDf1?c%;6M+3{=G*@*sr-}F3eXa(mE$o~u@^#u5ff6)u% z79|CA3bcKK(kCz@PJxq)C(m*rnGfIIi~fE9ZH=HOnd_Q)m0@Nf(BA_81K?|5$u{8K z;Ov0@VTk7}Ud0?uSm|!XYWN4HZCkObE`)C<+K-V{HFkaixWBnKMo%jc&&YcUGKmct zL&aKS!&R-V72d=AvMt6A{5^9Af6LD}Ilc(`Ak&nczRuq>;qRQ$6)1C_F?T*p(+=mi z*z2-}#p+FD&tv!oC$7S5|8B)UKU@5f9X^44t;0w38NOPVBjCwt_R}PD$j;wv8p1Ma z5xfy&zH&43#SwEg2d4z`qalwqPN@Uu0yqWW3}!vFk79fXyZ0i{dtt+;f57L=>p|ex z&(#@rLSKl~Ky=N|ADp@&MjK{g5(2c~qICd{L=X zzN9>dcTGR9%v9z&`m65x2C-Re6+6Ukv6tiy2-#uaF4X&Y#?o#78ScJpq#kU<%xeICf3Mq~0(V^Ks-iJ5 zpUf*Q^B#t|Dw;cP+aPeRF|U<@&Fg0KE(q=ln5%@6(rxv_YGYkX4KR0q@S+dj-r{Ew zCFSCO7K#Y>c*gEYF-;5=)#A${Upy~f5~J{p-Q8jx9ruVg=ol;BqvKw2l8$leJLJXt zoc)|viSf>X&Vk|qf9EyMYecE@T4$bk&^g#SSUlt$<{Ty_IP;zP;$i0q=Lk{mywh1E z9&tYGEEkVDE1VVLF+8=nn?{vAdO#c&$4L7bab8@cFghk(QWxiCNJa^=_;bohXN5Zj*B6$JdhqTY)dvW&ffG%b}?fJR% zGk(I@zK&^`3;tNp_b_&>1`b&o)?mF}gMA3sx&az~06dGax*v2DI1}2&+g5N}_`X)X zjUv+ao?|^ne++Y!TOGTIK4$Mn_+MF4=JJ!)@;b)0VW0=Fyc&d_w{1Uww(*4D;!@>B zdph@&zkMP9Y`>A{pQ7%!7}KtM03wp{a%jut??8(W@l9xhv27P)RcD>*YtUQ|e!WSf z-ILJp6mygoZc90B^^0i7k08I7u^sxAD!cie;0&Qif1l*+=X8C;wZQdF@Acjx-W$As zptv9SKl^N{!zMcL4C$kIhV(IYtNNB)jHgGJ;_1;9czSd%o*w^mlkB^g}!o`Y}HfYK!tSp|%`;Ce(H{KND&j%+G|{uIFb$Z9{}p2;V7! zvqJhVf6%#I2+b~}<{=2!Zs7Mgb_af^W8#gD_?%`6dxTRso?U6gEBq7SUkvJ19wIs1qCe+e6#x}6zTQk&g@>m?weYo0Ye3IB0D z*13j0lP@~QEWuBV1?x!ES+8yC9N&bU))*ytJ<7Id+dF;ByzXr#Y}uu?;>_>RoM+jP zI49cX&pe)qb3zZ7@%XN}LVc@moo9YC7S}tiox7|LiF0pT6X%32iF2%*ZELLlcaO~k zf2{2F*@~CW_7nX`@R)AXMUOVDGs^qwzt!K)`n^AM{IHHhJ!(r=O5%iJYLaXeVp|Xe_MGExuz@l{d3N!pZMI{&#_+P^?BztU7z()R==-ww*1oD*LsoZ zr@wZ-Vtgh1kmyJE*k}Fx9$0J4^$Ge!f1XRj&**9+QSP7VpUv-#?U6r*eokzz>@~L+Ty95?eAPQISw8YF@-Ou_`kNCu z#J}3Vj^91Y(CMq*c`4CG!j^{LWeSPoOR^hsPG<+k0ImS+h}viG{$)W<$2k?(q+ z*^ch}QSx`vu%r=*vEuxle>5toi04w$So58~0DkK)LHB&$WA2mwr0Geu-SbS3{c&Rc zCFY!EPtvTU`lN=Wg-J`2mUrLB^1S2u*IggKEx2>7=&hUh{3hYfezE>uHYRdW(&nVC zoqHl{TzDQQ?MT|);~K->E!S}z?oB$-IbPhRRi1R%@@*n!`JM9#e;=`amN}MmlFM;_ z?@hjY#&6c?c$mMDt31Znu=0DVpEwV6P-#aoKP}_<1@7E_)P4`qrJ#SnwEZK{&oHgt zjQ?iFm{veb(Dr8`b2DUCL*@ado!Wv11&+@@qJxIz=mJ&H)++I z8N0x@oBUGdDB#;af5NwIt#A3FbSpF*f#zgrZUBw{GRu>&@J_Ve5Ar{N{Cl8(3Hq36 zIa+@gl24*^9ZC;C!|UMR2mY_X|98_5W-Z{?89Uxa>3^Wsk5Q`(^uK_92(=DE=1b6K z1N{={2=>IkNe^W3DAHomSkeLdZ8$n+U zIs{*}LFN+bu0UP%)Uz5r!U(z%Ep|kU3lU;Rgt!qoc0`Ud1{#)o^6?*~bjS;g-7siQ zGc_~qx*hV_=*xJNejhe8g1#3t>{MW<<2BH4gZ6=*3;Gq%Z$Tdal~C>gZH^%PZ{Gv@ z3HSuh8^{vSf4>D?1(|)2nF{)2(9gkFh#7SoJoXq`>_BM;B+ZC|m+bd}&H;S^bRB54 zsGvprtDuXZryBGo@XhBUpiLq^ZSaFce_gl2SDEnh*C4qa{{Ip9zk!`|z`qUJ3ZWS> zuPz0@81y;NGeO@7Itoinzx^C_?*JVK4V}tu=8Q(1e*@d!1b-szY=@nuH_UNSp>sdz zk74t7(N-(?=9n&q&NHZ6i@Jxvp9b4LgZvAiuL2!JTbm*OKJ<)){A=KU0RAVCzX9^8 z&?ymzZ$R=8bF90-Wuk)b0=xKqSKc0X!=4v2#Zd8rcu@=!Yw5UIyiG^Gct`9Nw}^do zd_n$Ff9?_^?XC8AMFD?LT8zd$+@+$3piwl7)nc94C|bleu~Y1!8au^7qK^>&h&V1z zQQ1CmR$QQSJDKRg5g-W57~wb_IWkWUmHG6kKo-hkIbN2@3OXjssj^zu$T}QzPFHKyS!zACzEEAF zE>~BmtJJmX26Z!8(xC28cdL8V10;1=J*J+d(lhFL^`bhPhD~XQ{KC+Np9*qE=YzbkfjyI4enyc}#Q8aL#njgqFmi zSjTMVTy?8+K5-VYE~1w@8%c9B(e;3OYITNlwR0V{uobQF(LjA^Q1?1Vs%OZGS!DM{ zXDLaxs0+#V<<4!+o#=lp_lWeIe|PS2?gKr`dC+-8t#`WAwa(+v!mybn8MZoe$urB< z-Of|2-Fen|K|SCctxl(!4BQ&SW@o$0&UzEAKw|>f1_GCd&P%A2VL7#8fh*t&t1HO6 z^Ib7l+?C_Xa}9On(@}u-VS}p>z3bjKfveax-W)IPEvN)Ahigtpf49Q6f6HNOpS*fk zSr7Yr0F{x=&LOS}*JRh!P7Aw1Uwr1ds$DhRt?%qbHNRbi>|J32+rhp`*gxGhN4@Bp zM_#+g;2Z}J&vM1oD%S$nV%IX~I9HRp(6!RFhUzU>S8<%W*1I;Tn_XMft*-5^U9MJV zi)%k=%XJ-c9d(^h54cXdf6h@~FFMPqMH)k@-A4Ue;TFyzZq@B`2i*~OhBM^u?;hkH z?3&{q=A54xNp8VC!aa(CdRFa>nl-r0UF05%*hzRa;km?!caAC199xzb+$HV_?uqUx z93Ac|>gh#iu6sIbaM!wLp$7Sec=hT)zld3*0=j>2U9G?{@EXA8;RbA9J51{&E809N<3VKJQvaN42xXeNkQRTBh!B3yEV_XOgGVGtD!De`f4%x1j7&h1q(M>d*Ad_RMuoa#r#T^vri1!snfIuJkNQ_>1Hg zd6s$_A=lv4;djg)8h2|Jd73?|J?lK{;8z~?Rj!zGzGp7UR4{lpdRkm{o^76;&H)MF zvGMG2#XS2w2VIjrM=pzCifsVqz2`WC=alCx&p*!vPdnyee}bm@=$h)adk%U%-hemk zYICpk#=LPpcSiVO@*B&VGjkQ^O27&;?$jmZy@T#4p4l|FPZEz}-dp5S zcniJ7-tpct@?fpEg7VV=SGBv=JDL2hP;PFdkr~2qk8E7-40)%zR(h+!8RD(+)_Lc6 z=Xs73e}Q+ge|MR;iMT7hYrN};vx!En%Dct8-Mh=%Q9q0K8JFM>Yz#FkPUtnyXiuKqIS_PhkwYjZp zPhejM+#lEXOF&PAo?XEEz`=KAY}MWN2iPk(#-X$ne>e{^Gl53}Z-pdwCo*F0Kky#v zw)UAsFNKCfUAq?ISF`2QAI6CJv(ZWrrIo-7Eq*yX zQx5qR&_mdM4fG$tT#I3TZ3jI7Z!7%eQC^#k7STkJ!dLK%+1J464MvJZdo;iv)mei5Q5V7_>;CzBej$qaZ z^byx!wxL^Uk-oFG8#;d%wd?m$e^2=? z5VV`0H9LXFDkHuYu;_M6w!K$9i`K#x&*DQzud^1j>RhnevD(5p-c{Bqlhd;vbhTSN zhP*!da=cq#JpT!>_k`ZId>&{+ExY2~>^$CO3zxHhz(3o|R?BCXwcp+iy7e((8_s9D z`8Tg?%sTnq$2L*tRF{1{&KLUNfAKlL+ZcO#wVAM`z&aOpv*CEpwxKJh+qt`**yq$w z^vybJ#nyO@zkzsp~@oMpUpF3qL2qqIuC8+)!fBnBYpZ&i(_c;eH{O8Y|{r)TG%Y1D4f9bECuh@^{ zJ^Rr+zOYp;9zd~Wjfn1|X*f;9x| zeVuut)AySQw)nc{V&c5r(!0yoGuI^MCf98x*l&G4L~xYg1i@*7a|CU^Q#!3c$b;vs zI!wo}FhBa5s|31g^{rbQe~EJ4M-c2erk@v^e>K*6=c~T*68T7v5M*@m_5K8dOz57M z`^-ZLTRgs=>q##jKCid@OrQ@Y80PD-p6Vk^Iek-Ksc38hlyqDkr!C``9J>%m_dH1iC_c;Hpxh^rc+W$tqS6Gv- zn1j2o%YB@AKZh~zb^fb%{I%SBw%56j`P1k6|F`<!jcB^7Y6w-REfM{7cL^%O1Z@5F&{BdhBC) z-tqkFuFs#0$&YF+EBWJu?P0M(RUa6>qg(5F~~r_Cm-}M$lQ)r#)H!c z44sbGfPKKPe}LZrjDFeoz>-zKzXfL>@W-$U-cYxpZU^|_*zW_r0F1i!S0Pgk8ve9F z(gsUhx5DzTp%*`b&N+}Q1icja9Po|MV_J9zuqpW_w6%ja`?4Q8zY7{YRnDOF5cGTo zd=+YKhRjINAAo-YBqjK7FvhR>NpVV^=3n!>{5|uoe^IXS!tN?_m5F56Ojn%j@eN77{EWSWd8lU=_hyf(@eY-#bbC<_XIre)Hs{==!~r zgbeHHf9tnT6qAqNKl#r>)N0p)#P6c89iXG#enTbqb08`TaZ+NKFMX%ra;P=%K zUMM<$)dRn9E1Wli-VZt^I)4QO?_02bFT{Mp(E6p2Zoi&l{%Q!n%_H%PBm7&ngkQqU zRoeb4mG&GF0#D2 zf8Ogv+MhG&jbAN(C1cNOY zW}Qb6jIyA}g0a@Q#Da*WZvw$Y3rZ~A3E;9Ry?}XD1k*dquMxXM>wn_de+9bxafqM6 zxfJZ+-)Ift9&9~2We>?*GTVRTC;pjlDc6j+NY^_3I?S7uPbrbU`SxRyaht=r4-?4*!Fo2#1o3--#Wf3?X``@{mxKdCEMI ztLNyY;#wM+0FBJ3zk93GV|ICsyq3cHkMb|VCO=jD!lOI&fg)Qdc9(EaK>yuOe}9L+ z!~b4T#8_eecXX1d6jA&~G+V3@KN9`KW;zCn9b%uz!IR84iKBE37su$hS^Nhb`QrC< z+#)`vV}v+Q#}~u}@u?UoKBJ>RT%zMPsYpeP;uo%n+oei-nbFcE-Qo`Em0oeD)TAbg zq+j~QT{1}~i80cUhPYcM%Vbe3e^X?NxJRbSR54bj$ux1VOqc0moXnJ&;y#%zv&DGX zPxce{%d6y7qC^gq1H}XKYI(INrTuh+c#wADOGKGmDwm3fdMo})C zWRrM=cjuyl->e}Xl`G{+F_HG^tHfh+wOlPG$u)9~_#*Am*NVwH~DX3s{E<^sd!5MO#Vz%$v5Sj;!E-^`IeX_e=dJ6o|eCm zzYx{(m-3h58Tl*uD=}UETK-x*E8muHiy87A`Hpx_zAN7qHFCe)FTN}f(6v;pJSY!} z=jHqIeKAvhAU_aaksrzre?^`ANPZ+<(C*ak6tlFi>8f~9|2O@oqkl?+1)B+(2 z`?R&E%$o1pjun+4mmn!SS`pcyr>ce^)d~Vur zj?jcYthd1frZ!XRf8jo?zg()k59=?NdZZ8QFPEz5!+QQ!2G4REK?HBQ65`Q5qvCS8 ziG9Y!<#Lbp85x($P3ki?B9^4mDfh)b$Nh4-$$gIe<#LbrIrf*!P3d#=Bb}1cl6#`h zk-c25vd^)-T<*y}NB45MseRaIxBP2LnsM+{ANKVnSJj7oe|^b)sSo@5lACs!eTnb5 z3>AFuNGkk2Q@`>(<%i0Tl=aF_lpS8T_YLo6@4tClyg&7B`9JJk3!F{W_ur3m&b@c$ z-g74=$&YE0BqohVk|ZHX@{=SLDPU3Jx4cp0^xaC{V275-E!MJFnsXbEjvrAO#j(wDnR+l*zZFgybx zX98+n*rn=R#Dn6e@sdSv7_DYt;%V_5%~_up&of`-fAYu`EF$u7OpaYDvl%lvY0F>V`Mp5QO3&}vUb*eSx+{SO=Sz& zTDFskf3mwwk^SW$IV=?ZNjX}Mmy_gFIYVa11#+=mCRfTeS?`gVa?AvBOHRlB{Ga)f!+mwgy|nL-FLs zS?SBdS?M#_8flHO(yYm$_)dWfns3%LYo;~Ve_AM3SWB$s)~c-h%A%h#zq0ZvcmCwg zmjdQTsQgTNL+{IqXRWot+9FnG<&(AD+GXvv4p@h+~-P~?vx3xRkUF}|WUwfcE)E;4vvd7sI>~wqjDf7joE7Z!413m=!AG8{1 zf7Ys%Mmqlt5O!}Twkc?Ib1z4j_PDzk6zHk*mjUa84&8e8J|J}BPh5+;&?;u{0^SEY zwC#;W-3x%wA7xta7COQFEx@}$hep1(!(+n{12nCVL;uxi!^1L20K5ockOK_13Su1K1-OfNw55SS&huAs z4xMR!4Ddz32+*N}&L2T+(79LNhzKIDXy&LOtQu(6rp}@N&0zU(0`V}^1O{u0e-p5J zR4afK9=XbI2PJ@WSXprBzO&~+hs`C&TR8HT=BEVZmw>fmDerL06?9@g~*R zRY0rhNxg*3(SxYIL+u0a7ccnkfAO{Tb?|ldb@O%i_3$P89*8^`dC0^O9X85WI@E$< zdA5MhmCfThRS(YQ=`r~}oz=tF)pI{F{xo|>^}ZR@w<|BG;XY6|6V^UEGueJRhu==+ zwUb9Hubph0^4dxCl?b?g1UztJjAw zrpy#f5332KFjLLGFPK-ne;`Qe;yW34`Z#@<@HX@|WRmJdUuIEVILOLI9-D1^LJFO$wm@H5yRbZH zMtRUON4PUjYk1uGry#QkQ;>O5oeF>dr{->X!g18omB=?w&$isuf7rb;{S!hdDVq0G zWHyV(zoS`;Dylc>cGIj#>WpqZ&FN@WWU*#e@i;r6u}#cqUK~4Y0b$j(wdW5#5E_gh-*$}k=LBeJo^8$jrr3&`~Sj9aIbe#om6%s#<_Jd&b`8xU%eO-J#eJQ@)zP?C9cutKrIo10tIQpkjoK*^AOey>u z(yYcKRcS<0!lXFAFUFC^sMn{@aRuVJ>`A$n)yJP64{bwzY41WBV-)oLS-oMqP;dB8r{M4M zGV>hgW#&20%goct%h91;{NK|zjR}nq{tao)D(7(+L;hP*t$M$tu(|iS?)|!k&CbtV zTH<4&FRt&Pgg%4Qv~>rf_b?LG8j;1^($2WUU)y z)rNDChN3Bj%yV7}ndd<%6f6yTjXq1GGki2Wk*P0ve|4y}rZ8o>_2Kih~)P`)~}l43>0=u>0Z9*}0y* z!|H1dw1(0#!Ww0bvnE*S)^s{%S@Wz#)>3PQwVICg)<$cqwZqzN?W5zMb;M@2WBcu5 zbdf7mmeW=>0|4IK$il9NnhyaCQ&x*G0` zbjCPo&Sbhb&6(-Ubrw2HoaN3cI@UTHoGs3FXP2|r*=5bb)d8oJwa+>19Ji->EKh{B z!d~o&A|C45wVh_35}wj@l=W2bRHm!yo?3L&b&@;{?TSuIPZK(tQ^;ZYUggf0uq#ii zf2@4*wDok%b=B25?CC{EU(Z0#P^4vqXOw50N{eR#QkG6Bo9>yF-@U@AA)a}jMV_T} ztnjS%toLm6Z1wD*W4C9YXMN5(ku&6J)QOz6Air|YucQm5Y&{1(N4(7Ic>SsldW(5W zdSkpLty$i3b~|rHZ@jk#9kspnyp6m~f4wd2@!l5BOmAy%JA0=$(c9fV1Hgdk;N3$UDs0U}t)t^p5t9r!pC5?eI?WPW8_4X6T&vF7Ph)F7vKL+sv?bd)LsB zNqJU|-muxb&AXGhLOY^Rd+6AYwwd9y^d6#+M>T(Trccn}RUG+TU$iyQ7ws$Me~a~% z&&`7`&K~cJ^Hue>rnfis)wEOSDCw(Xmvfr=8hC2afqY>(Gz7FyL+vwELQ9Ib1x#Yu z`UCjZuf29^Pn25shC`Q$!PBDF3o?2;&^O@lR>`%`$049=@1I&f3ck#_)~mS;VYJsj zXw+Cy2#Ke7V?cN#WnFN7Awp`se+BqK*IrP05a$DN4(%rG?_6su@w;#rnp(zdC*sta zLcBNbLLSchj!iS%>m3-M%x(H=;l5h2?k{0E?D%?fB)81L-RO5$2u4E`~-wvzFw z3e7Gt8F!I;Mi*i}Abd4yZ813o@j&xOdo?w>N$4Lryj5yF4dVq>`#*&if0KlElZ1AM z_5p8n;hsVm#2^mTWv`Sjz z9J+bhldRS!(Yk6<`{hKg(&$^A>r#LxS?!C{g7%2kRnr<%T652WZk0q$=Gv1cyl0A^ zOr9S>-Y!7iDhuwJ2(LA!e^BR*S5SC&bz+p>lRyozarcDwf$K4ESMfkQj%iQ0sA)ob z=7r{-)*wRn_SBw>rH&tEr#+BrpQjSuHf?Ae+1hRaxxiYIA}Ixw z>tZ6!t^>$>7kM8<-bYd1_hT0z@8gm8Rgl)I!JmUavuY@Z>Svf9ZJpB=yD^PCFH)p5 zDpXF7I4@G8%d5nBS6(I0qw><0tBpdb(bD?N^E(0UV{{>NcQ&cgx!w`2WXyS#uB`t0 z?4(jwKU8?Je`VRGYU_l?Ccggc%*KLQWuSKWg0)_#4Eh&h8Jual)VG^NY6GPRayITf zN|^(H52f)}P`96yHDb)mmBD#$e>2>|rSMu}Dkzra!?i5bn0n}WoTJ(4JQunWr<14I8V^shbD{BYI=PzlC4V$KmwF4Qle-nd(#-z_ zDbA@wp!)NX|AJf&Pw~0b1UQ|14*#A%j-AWz`2|h2@+T07o>YxDT;oAJA*T;)c(O5JSE%_nQCUmIy)S=>|LnMeKgbO?J zN}EU)sbYW_tkR{jHNV!PNS_KE{J(n4`DW94jYOku|<^qvXY_Ov+*SuSc@WNle%Y>r`JtZj=q z_D0Z_o#GjU(Kf-bla}!7Z!AG!?<-&e{IVvus?&g zkk*#X7Ir_-*0GwNny`w!TwTPg=!m6fgK*S4XA__xVB-{cC^O& z6I%Y(rJ%!#8rGj#{!g+je+37yY!ClJybzhS3qWir#6tvasv%>=IPqNM;auTjLgCb| z>XsNKo)M$P^Py0x?JJLa74iKk?|l$-$ViGqSr{ve?7HSq*A30l#2n3mm9%!U>LAxP z^V+V}LAtP`2H&CJaoEFCIx3RHZ-{gTPAP+w1UmJ8Kgyb3?We5|e;IbJEUpz6IA37y zFGhHm`tQ+fJey?jRD)+2oDp_^0pZ2wItwog!|J};7hwT*Mp(nP5#AZXS>a5+oLCE} z_a}jc@d?;rA3qS5FXOZ8p0tEgEvf4+h zF-9&bAD^X~qon>te{`j9m=;>?`-Cv4h1<^V}$B1QfeY`|={v1OaKaN&;3=-@(TGKJ) z*l}1z9fOaDi#&n%Z^Z_^q zv(T#7k$KloHc(1UYMfWxFVe&0Dtbb_@>BGTY;aLRgy`W~Zti5R4V0AX3NZ+IM zxZ5&mf2?$i@=c|XXBNKeXp7IHd6%l&dJF&$3*tqZ!zc;iW6JM~i-V&rp=KCAKVCX& zt8n)9=BlH)5-du$P#W#2L&f<=;BLfWA8B_?Y5r&L$mwUEBb!;(Jg6h`q8^SfAeB;d z{D&f;5Ep+vcyb#4`ZceV{WT>o>Yq&tNIm)Oe-!Rea$Zj#%FK)U+s*<~^L*3c^gPpP z<@x>+1*B5`9UYTLdFPq_ziQ-J-i-=KExKB8ZYe5fe#$Ekj{Y~#5^G;zYFVcC<2uy{ z@$|-qG>;Zh)cUgzbp4s;k@kq?m1okRDfmOory;gJV){0#e^VrSvD%{1Mssej}@^?Ui zzrOI@RE-Zny@rG|>$OGsG@$kihqv>eLD60ckz)d$^t1;;f%wI}fZ;pgeu#7JUs3OH zs`nDT0p}R`arpEzdyHatQN0SOe^)03@?T=iCvm3UUdlce$7h&M_bdFVIZlQ1{MdgAHY1~N7ahuQ%& z_a30j*k-+bHZFioYhW6WS594Nu@nCYIQ&7NtEc>YA{Qo=EDp<5T)n=7e<&Z}jwOTP%ydtKH*Tft# zSFEFc_;c}v*b>|ao@42WSXQ3J(NUgNrE|5eSd-2ggz^L}k0oUD4(VfjTC7 z(vy{zJklYO=v>9Co}(~$meLgZs+pA!;ruR8&l3;f`9#-Y^?ED55~ibetMdq)Z^3yl zoDacy0OzZ4-Wcayf7CfUg7bl(SHk(bIKLI=i*Vim=lyZ+s`C?-)%l6#pwCAd`t7hUWcs_Z_64m+(b~_m8NuqYD7-Q2-rkJ;Fv8SdvbEP@cE1U~Aj{{l_A0Eu z{u&?GdR(B#f8p@=Yev`FPcJ<5!Z&YLiN>>9EZb-2sU@X~u^f)Sm6qZjq!S};Jqr-U z0ky~Mx+Xst8NH3hWw$mBRkwW9oQW$&YY$0((!#`|}RF%e^nbb;h%#rAy9S7z}M5#mZn{g1jIxyM~I>xzDdttAMyO{rQy((}m=$JuiukcdOsi0*fwYU3U0pXw4!Z=hy zk3?cNRph0p%W;j7Pm6QRB1(~ziY1ErtB`6Iq51*+KY6B`RVVhF+K?TGD#gu2sYwzr zOX3|mcxfAo5hyajMdcKL~Jpy<_%*KmGeSSeyH z#msIY56qf_?s2q+8Rj5TuX5nax_nPT8*>&5`%_rhMZ&@x?JID8|36Z4d9}Z=)<@-$ zv;9>i8vbD=r{;c{R4O^!pEoQH-Tu5ZEebn|$`G-nwZgzc_&}5N%t*v)h zf6LRWMSH_abX#^yvRGL8t{p@pim;ZNQmjC*CHjR^f3-fnl2!fAhSNIos{y+FkD8JTD}O3+B}+x9 z2Gmq*09Xget^w2f2jd3mA=ScoublDR-=RcRTnYo}gc!^)b4I;vN}a*cMihDCn$A?IlKF5ZX6R7daX6pU2lb7^mxTf49`S$a)m=eptQ7DwDvzIYQTa?8%~c3o?4uc-E{L zqju_kQ=-4qV=VK&icl&0Q@cmzYCCtlV*jd{cRw8R#)5TVDZ7)k zWgS=#mcsh6fow=9oMch#V%CPBXwsrlEUVt4`E6>iULA*E7f|k$e%#`HN7yj-Scj^;JIGkTih$Jt>i{zLfLhgB7@CSV=F27rwd zyCk=_ngO;1Yy+48n3R~(zJrwv*dK5x;7GvnU6Q+`TIqn(0cQcu16quT)Pc8ihl6g0h{JM$Se0`FPe>dlNGOsg1vb012uv!~a@UncN zKOd;_lwjT0y=*$1`Om2 z%jN@>{cgnqV9qM#3#0OdSfyl_=L046HZkmy(>ODG4xSQTo-e#2UsygLC}_M8R{)&f zJMLwRf7mJ-aqnh_X^dTxSKu{8IZ;Qn5=o*gopn@H-`mCMkdhVDOCv2XbW3+P3=PtfLw86GLpQwh{jGPcJD=yQd*`oNXRW#Coc-+G@#6JlFMjox zGLp1Dhwr+V3Ax*f&AJtd23vF#WH{N3jzH6%N;w4zA_+Dq` zq!idnBQ~?9g+)Jc-93Z_=DU^)OnT7<+9cT~aQKRN6}amUmU3=R&as=iW?;X{h}gh) zh~<6ak{@*yf3@pcd?8#pOg8M{Bj@g|X`FOEs^?pc=duzrI^qg|#(=w|{tYO-?*}%G zO7+nG0VV5^xy1g+!I7=|d?kXFobP(32(iE`Yw!6tfr2)M4*vZ~X(XJE&V_BPH|$tj zV~y;J%S{{4C#ie~AYX%%(}mS@+{UPla$GA85}PY1ciW(oX=g2Q@dquo6$ci=m6iH* zZc2NtHr5q)2F^yu!@yHZ%^%n0H?WJ?bePsHWtXdNl<=PCy9&(&f?x~y=65H`9nC{A+~Fe8pcQn&G(zt&Xf2QNsjkwn8ScXy!GTb;`?KURhPZ=93O?zlK5H$wKA;=(cq#~Kt}xhXbC_k@y`bgTbv=U^!mNewf_L_sxKcttQT2w@sv&on zMha^28-8(G0PIK^POQCIYjP~(Xgq-c$^Do%RvO*!;K4qM0v{`@3pRUqc&La@g)F29 zOs{-7x-6jl=D1)Iutz{LyR+3GT_G~}nj99(C(S0CTe-xD@esL(E7CCA6hC;QT#!ei z)GE*C<6<>s#hk!9hnVY|{>6pe-7o!P(p7hC<@Z5R72l*-(ZTO@*s{&;R?cFLA|x|*`f@n&j?k$iVe(C5VL0jR*8)XjpVI=MLR`* zB_Jd=XuG*CCH8$F36~OZpMZpu=u73V)hi&N4SP;2R!2trs}{p15u(MHb(J~6clTDzT zxPs;N*H0d5RNAiyK9Np*tRtrVtP{(C^)qKf?tMrCh5hH>UnqR~UTs@_iX@Hi<$I5( z{Te9|i)C&2N&EFb6aLO;Z{!mp)inW;h0HPX3bz(@9Gt_0;WZ^?Ob3JgHO+QRi-T|G z6)r=|`&opIl@q77IhsFk#j&RTH=KVGq8 zwDA)T%*+Fi7~JmRe{6vtJBY*7!d zyL)@Sd;8yiYsJzCl0ek(h8J)s&yqdAw~zhxg5~vXKcapaalv`LV0wK!hNz!HT(qy- zCaoV}BkC6s7rE=UG3y7+JpjzO2R6QDo3(yG*#q@?jOP?MZY%P4?B5GJAp@>z)J|%k7wH!sodN!Z;#-eVRmwmvBKGQJwM1;_H6s& z8??=MGznICeJX<-#-?&tg3h)Hki&|dVH!`3Lf$Ud`;zc{63l_sDHNIu6nY~ znR9b$oOg4YIGw-Su6wr2nSXQkD4USkShq82(C)(>oYblTQSpIw*OT$fm0mpELv^dq!- z5U!lpCDzwK%NRmy7~$H^+P)CdL8I#FiVp})}{^0VkP?I;5 z5&tAjJ<-??4u7;`8NGPm+ob<&c3aH13i`r$JHxlQDzkZm{=*7;ahOnTfTSze1HbZv zbBloEpR^mvLf_xeD?-~yAW)d*;0euYG^}AFJ?a8*{9T(y>`?pPO%f}%B?=dT*(WU) z=uyr!l(4UnpKMhy=ei+y<4%BVHCokMa$=ry<@VE}?O6XU&_6%=Y0(Nf>cDFUTm5Ta z4P9wvKVPB$c)U#Oc^s2-1;=f_O8V<{6}oa~`>!3lW~Ed{{L$iH^^D;8B;SHMov_UY zaG=7tpKmbnO+jzB)aaA17B&8*>*a-}TY$WZ^&Ox87~oRiUEOGDv+8W2w2HKTg?2~x_V8efQ>a5H1ABp_jL8u*pBygG?_s;t&i&)+)z@o&CqcCe z+2mE?asLlAL3a7wMc1r~wyrvTmB-;d02|%+FYOBV1z(>7szXHuA~B*peYjd0O!34d zyd5b0yk9G?^+Ll))WqZ&BFTltt zBa$SZzxSm-TU>sOHR>I}NQ+OWVOI-8e+?eb3^IDmcp+mK8wqpN?CN2 zC*6(0Lg=V$$Y~)Z!L({3CGmBpSPxHct(9Sjy9je=)ahVK(%D*-n*aV#lIf#cO=jE0 zv}3ru*eD{SzAQ;n#3FB>HQyzS6gV&(!T@y&42qwUq=sq5C0N6?qzMyxw#=M^yyGkl z$Nzjk6}~|mZ7rA_IpDu(N$1@CBe<1zYJXGV4f18t8LmI&ZC3MT?MPf5I%chCKebBr zr>$bgP?-~)6I>9Szc|8jlfKh#tzMpXaA>SEShPRFXsulyg;MbE46r(GxLUY73cNJEUln!^pr(-x&L>%*rftb_8)965h^uru>tjm&yo;Hr=X3F5zq># z3p7E$Te;EE4`g&SbW}W9K9xT%K8)UT-k0Co-yhx6J}fUE!Ii;{t+3@?Iwzu*&?QFr zNj8qY6!Sj<8H{Cr+&?dg-UMZ;#$#Z2|I!Y%7u8%(=YpoPt<5RFR zjV3X$0xSUsM;?IbGVme(A>twJL6(lmty*J;j7fW@SeZ$CxOj8gbw8(9M1(cg@zYq0 zH?K}u-}P{aJjV)X8AQr7+qwE@^^H!L&!+G0G3Dt*Ml+C|r1S4vmpTH9Lp+Q!=C+9|L$w6?#Ny0%c1S45{Kp6e-l z5#jl6f3L`@I6=$YY%Bj%o{GD4cy&wTRPUxOodp!fJ*>0seUs>o45+BlV}uP8IM?3G zJ0z_R(id?a)mK6~=5-blwlv>T_<1kwWC^#d+GJH?6J9!^-t{i|9wimp{A;GEB#F z+k6)*%mMEDq(%0lnM?gEVV+&A7l z9XP@r_Z*KL4^$A$xADuga4v96>#F!69YIYtAo+qkk}wfp8(*7Hn_w1a_Sq~hlp>wh zoAKHbakSRjbrndDB^kX>kw7vdX!8SdiY17}ZvZ=BE)uYUZFiLR==Fj55@QC2+GT(0-1+zPj*i>PYzGk^e#yO)+I5Jp)T^n5y0XkTf&$Mxk zN!z&GrJZD)w4EHBq@2{8DTaQf_hWjv0`QsX#)R;!`LBJNH?;Xb$J-B3IQCl?C*&P$m%%p|D z18--G`J85SxG%Pig4I?-C?tt8MV!jAy*PaSO#tNk?E!`jE z0Gr#gTm1PwQCHyU^GxwbtC+R{vAb89J~-nNkyZ-p^OO5}R?k05pb5Qj!dX-8 zltm3il_z-t;g3t2D8>%Aq=P2DL@xwq-*0u_xabK>GIrhX?L3STgI`AgcE{Mp_gO}x z6=R021wP^t&JJ!4W)sR9yULgJh50Umt<%i|%}GWS!i>&@?DRKDS=B@St?2f87bf#2 z9@?VrW(XNK4JRK2o;G(Ae^V%bc+GDPH}JHy8d0^j+W2Sj0k{+$6#trf4gA*LB5bop zrZCo&KDDjeW8Sy zPF>cpekKrq8qm8g#m@QJiEE)G4re#>tZk~aB05zwDW5810r%r^a@maoN&nSqUv?Q& zVysxnpN6R%JI#hF{vQqg=94_$rO}eRH?O|EZKSu(B)TSCWARo%EF$`8z(!?Ml?@3{t{`+WfF21q0K$%qVMDmGv0rXWTGbc3Vhq+EG`4anbxC4{mSo=`Y1xBs`YA>i!jO4HidthBVa zTmT1_E#b6)gUgk2W3X4!A_>TL10qZE{$u1T4^CZ1x8egAqbo@`lS3JDO*z{>!ntb< z_cW}eS(jdUl?qJ;*Nwb*ndT2hQ$UMAA4WUIUcqZ4x$aBwr}8I4tHhGPv%@{a^Cr_JzkXN6Qze3s zGcf{8d`t{Xyw(;wqdUhs;hi!5S!iD9cj(w?00v>}61jgR8v7EH|2VoWS{Bx9%Q2P& zp*fZS1{B8*-|m?mp*PhW^|c5>X|1*M%HPPJ9?c6)65AK=C9-i?i0qoz>5bD;z2TxO z8h{y%72Q1I!<^kOD4iU$Ke}Be)*9eB%nlTTOFz{-v9bA=p4CIYn9vq!|M(64%{y2! zai~XKI{tR>edt!d{3WqLpTyh2M_jo$7379V^wzD_8zqTCsEerFb;cp~CF5P#)|2Ta z^IZh(W`M!cx-on+R;)Ad9?du%^oM(c^6Ux0b5DYNO^gJMRj%orGT*po_A?{oya67S zT@B>9M8^0U?+r(0*Y2r@H!A4Q>dr9&eB*WR^N9NN3+R>H$wH{yh&)m~r8{n=-B3L8 zKZO9p9cS*yDRAr4;40K{nR5WPJrSBYX6_{|T8+}vD;X|%TPl)fG~BLvptbDgGUK4t z*kjXROpr&}B`XgotM?p;e@wM7l%0v8ViC5w1P z#vNg)4+1lXeVUC)>Z2eT*E=5@yviK@A~%FxMN5V4EptJ|(;2@Hp2kX>cNMA4ABWfT z&g|Py_VR@ho^wxe=k0->p`zB&UX&MuU=6^D$aWN-Pj@3R8+`lIflmO~muh!W*=MB7 z7Itz>9J*CinT)xxBAWERe!bsEUm$$MX!owZh*?)8?c-)z<2>b|!6ofo=23yM8~0rx zt*Pw%ceelq2N$B4HDCBCi*cmv8A;n4?mmUH7j(nJr_OC+m7VOTh1X~Im=duae?S`= z*TeVZk8D6x$C%Zb@I3(_k<~G{x)E_h0)=pI4&OY3##L^V-cUmmD|b`8(N}vrwm>KL z-lD5rV9z$xZKE#JWY}LtwF}35y-Pu&3#D`o6+P@X*is7I4je5C z%h=^|vTEXP0pgdFmSD@Qa1Oy9pDCYVpGB?qC#}P;8?Om#Bd`kI)@LtFy_L=I5ap=% zVrefqbWPQglXO&nd@IMPl~`Id?dGXTH1ksl_Z;_};GF0jPwd6NT#Fysj>=T!@Q~qu zoq_W_3rfzdP3=plaFfRP#R;XngE0rn+1PL5%h*d~@&IxEFztuQ8{W9_484%MpQ3+g z%kqSSkIT%3#V=6AGd`;PZ8xkjP;jVRjCx#NhA(};o9xJ1R8ercdVMQ-DDjf3Z`t%5 z81Ye5aBeJJ)Eabd6nxOwTOBxZVGDy3{=g0y{sG2$2%UUVyCnjLvd_aWoxHXnaK)Q3 zc3JVXePGxoQ|(SiJY#=1PWd(NX(GDxD|F4QqOA{ZG0Ae`CM!Hrs-sn}D81iMF-X_s z2+4)wxeSI5fB9%g7e~Aq1xfzo{FO&8{M_5TPqaC&Z{Q8L#OtsV*1m08P_vi$gK>=ak?FuywSK~b_qPnZRttj-?0s&lZMmck z*_PY^D1q+mBO|zGYBfr}Ph`AT6Ma=rA$a4q)hDexi!<2D%tgEuPKtk&5C;@t6kJJb zFRa*Plo52-n*`U&_U#>`2;&vojOWc~Ngw4D&w4Iq>g?G>v@X)p=)J!Si>65FYEPdiB58-{o1xc*u5Tw2kd3M0MNd zE6$`V>O_v#FT+7IR$4I$u3taCb^#^tO_wWq)GKzb2nJ`2aqJ}|urp1Bw|reutNF89 zcr_nZSnJH^{Buxk@+IBX$MrsT(_#+H_CLVmkClwu=3WMQs})C>b;X}Im%W@G>ZvLT z3uGcHdFKu6Lx!WVV`V;Dxzdgtks`&j(Y~_xa^FM)Y`(3-M$Y3`C;;l_$19cm?K4Om zfku=$$04-hox+EDZHt?^*s%o)DO)AUJ)iud(T6Gin=G%p)fwD`CmYVXAG+eH-dI5U z(jtdf`g7^+f*;U?KEvkt{oVO~dG7zAgoYR`lPtslMcThXUlyLX#x zEXIECa;9!V3&2XjGBT`@i+P#L0VP1z&u~M+tVVj23e|V3R=@xKEU=n>sV|;?@+_)H z<7089sh#OLG|B7>8Y=-#{!P^{PSfFewuVG|6N5RohKM5z>^W1nbOW&f*%J~&y#npE z1P@o^2-r4(2kA|EjHHu{aKL_o~O<~2sygU-+y1q-=ShR+ZNy zfG>^t3$JGYUn#P91&kL9`@P`KWWE+l2u~$$&p!Py8qxcS4P+`VyUm_1p$Y9?{0k-` z)f_5cmwhr0xVl|zOc>S_r0IPCQ%rph(Pc>tPxx9s$I=jH^fgQ9O|*h+OHEK@?6!r4p7d-ifrZAr zdP71OkKScMV7J{*-mQ<#niUY+ZJA~zc-)<{E`CxYn*o2Bh_-ZT@yw)+EtCGBHpuoD z{}QrCt?{kFR5`wF4p2X>Z(Uw5pubpVG%IoN%XP`k4#s6VFt>d)fJWPSS6o;%&0G|&;O`}Ssix-TAqRz~s0a@%op`bgo@$%D@SW*A|WnM0TD;)=S<4^57U*m@Yeitc}pT zWLaD+$xNlQ5HwiS7@zv-B&|ZK;?g}T#wl)((|B2T_J#!hZx3mGCo~_wPxYax!|IpS zi}jpL;!L$5SGwEAwg=x2?<1yO}6`!i5 zO58IL7d6p>4%bp%uHA`;nhg8&4nxQrV5c%Hcs7*>QQ8gTD{(6?EGiE<56ZJSqT9c( zlnm+58T1$|8pJpm*|;d-2wn=DHN08sUR+p=b~133b=2vWTQPTJTPJe_j$d`7w@U-< zj5tJB(dW^x#TG>(x7eLw}_Q#d+&voOKZK)^J2;l2W>OZ{CjzqP}4xrTZph!2Ar}X!GjK=${s=4=2taFN5V3IhZK^M-9|Wc z@ER93KmCyBqBcOVGJ>-u3&B3BVqBLB|=IM ze@HaD4IK#%R0~`dg%2K-5U>;y+u0o07Q!s_ey6BN)SyAgv&&GnrBx*`kkAgOA%P@h zdt(4YvPcfGscQSzJcGnY-Mm0Tk6_3~RXgyMl_e_x30o;WydiznS^pYBh--EkwuLy$ zfz%B?Wc&jXimE(PgBaT`suI{p2>8{YLI|?GQHLo1gN&*`Kn*cODccUsf|MmqY94>c zQWc7^t$>6D9*e<;c>rxlC)*nn2|G*+b`}Gv8)``9f3VNCL${z|S@k<5K%#~ga+Ga{ zy=|Zh#YDo*uLd1Lo9&G~1pW`os%`-_q>y8&8#*NBF^9NR-TY6{StR{_uQ}kI{tXbr zSSsJ)Uit6;2NgUeq^5T3k9;!XAj1Z*_#&TKiv0hxQavIy{lH0Th?i6|B@))?@-(Uo ze$MnPSN=%YOIhQ|8>qsuw|$Ywr)4=p+VskMsV)Rg(m^m(Nj}J-~p6&|o5+qoS3s}6bjwKBf8 zMqa1@SoY(j%*RPIcyv%+R8St~5-qMA4Xzwslc+N*i-MHivmvkSHf$s~&@HG~hCc}7 z3`waH1~}tDq_bb5ZNFm)l~QwROl9Gp?lNJ90}{}hjI)F?A+I}(KfeO0V9><*s*VZPQ3W!_~fKD3j+ZQ_BzO`jn(FGjC7 zH9CehT}QG}=edr`g}B<^i7XS~Fs8DsODKB%2MZ^EKKA=Kcx3l}jYxl*mQ($sP#9b> zq+Yk7FS&PtEQ<7>Za5teLHk$gt&>mZq1G&CVgGQaR2N7munTh1nSWm?NXI0F7;_Pb z8&G@J@|~Ml|Jo*<0O#ib9rDuj2_e3$1U_oiw^@9DuEYL$O#WTW%L$c}u8fm;Xd~k$ zDG-iMR&>Xn%&~!eO6*BgXe-a`bfC#LB|Bk|A&h^o?@r7ZG$^e7ZMu;h&xh3e69`yr;S zmTbXs{$>3e_MnzqU^>XwQs1<+wnD|DZ$)f6QJ+%op0iv3QyPPZv|hXdvs~( zu`;iB0q*M1ma5AcQ@cgZOdvv&{K$Yu+DAs)y6)YA;pZMDwGQTpECJ2vhUyv{YiKzo zf$Zm}f{}nhOz+oP>m)2n@{7N1zvz<}xD5^--?jd@xCxz_0S3OMK`hV&x)&bT9fE?| zv;5k#RH0bYjeilbGl~yKc%`3I%q;#1_i9s>tISKjNrhG$8$o)-9C5ju6{34Zx}<&FCgasaa@m#n!4TZW{>s}}K z{v75#6I(y4|HwHG8(TcR|NV3LEaEI^y!rFU?h>+cB5NYD?gcMM6lOIZot-gosn7y^ z{oVwlbMiOeg?#Qfk}_W;jV~H~W9skhj^Q2l1fpev8~^_NWmTT=KAJy*gpE)88x0oG zS|s~OjW~;WmH#;?s*bJl@8`;9m$x_Tg_AQDqOv3TaWmU3OhuQ1gAIIlpmk<{3$LCR zoo`Jsud_CHj!*SR@wL+jSQUkiHHyxhZalI=hsW>4?$_GJdk|!VR)OngPgx4DDaTQu zzW_&@arwb(AZ!ac8e z1*aaCme+jO9n1?)?UYn%^yjRNJ>Cot=WemKIktjYN>L=S3<<7r*Qh&HP+@2l=!Qhs zR3>lNcKv8jI#8C}1+2sOIUX^@(5@-h)PPPizX4Pg78a^k*kpdhezAVOm>KJSF||&P zu|t#zXJGEA3YR{a(9ZW z4h+ZJr1@V3XqiXp!A$V+hK`&iPP-G%)S-KJ26#!_ z`&RsrYbhC8z~DBWDEu<>yw6DYUc@|#7tdOq2SXSFPR;zBVl)&!)$TZ2JJh;s2U))| z)#=#wj?1hLOv3WQq{k`1@H!Cq=in^ZYJgnQ{<*|TT$GMD?Rg%hU4F&?*=|9CN&N`B z*e83>al+afgbIT`3)TT3P%J}WJtr%Knt^Hd_;9b3ms`zI43{yZZ9PX z5tx{)T4}#Zl)lWo&9fm@ug5K32-39wSR(NH|8E!ks_&IceCJIE>IITc$-VhO#6ME}I7o`HivWTZ@=BUzZ)!rc$2v{m>>ls@B4=+}{k{cin2{LuI6y`q@hCgS8P ziQGOF1NvPpCn7gBi4p!b+g$g z)U)X(leKqpVWNW;Bxu{u~FVTer%IdPvUlLu5 zndrN5J|{(;LM=p5#`LCgqF!T1s+2*P>8Qx_D8)_~Qm_n+VU3`qqYF_Y2s%Cd&QK{) zptw!X5uBZ${T$J`u)MLIaMxP>hEXL^3{kINBh|n$C_1RV_)XLZjm~<%0~8p#FIF<{ zweT8NCpU^9ngiMr{x#DYMQ0^SBbqNk69Iyz^T=-%4UTe8=)}Bs<=2V=sQ&%vA?$;4 z$NJCy#VlZKfWCq^hlPMvxp_;Ph<0B3;rg}sAQjLU$vAUV?{KT|Odff%nN7Gq{6Pmj zGjZ(H{E)W9VV%mW=A(BPwSB%f^rf{4=B_{&ztyddln+w4F5X-#%)M-oC8!D$ z%s>AU9Z|kotHaiXtzsCM|hy71XVk;cbx!hyP7wTe|eOF}cm zZ@CVh%6=lwvzpCPp|%NxB-#?=WN0FlY~Dn`8C&d$#6ZQCyxNfE$x+5ndBVo)zqXi- zlgB`02cra6q`Ifg$l7F?z~hqzZkgbLT!u7rqP#5aMN9`D2M_ygWorZgYs%$qzv-L= z$~){2BIsqy=2Il<%nPq`X0cDCw-5HzonD9Q4vR}nl?`HW<8j6`6VU8pGrq;9c2dFM8Sa$|-k;00avorNf09qm z^!qxv5xnjEx6uRXwb47K0T2AUyuv~SV$d@fFg)7>x=IYqh-U{{& z7?KsKGd{Ll+m;%7DUI&W7))7=Rt;ajK8tu`;eY+bRkEhZ^$tkmuXO%=zkSQ|7HIZO zGM39w|4Osu;c_?%7AV)M+!?*7ETI52E=nuP)!RK2hBvvVUM7si=ZcEvpC3*7pJpWy zjGH>}3PZ4|CK!8F$L875OYMtmU51yAJ0QmrWLI~#jZjy$K3U+Ar{eD9tpO~?^8rz9 zB%68(n5<(Hth61~^x8_=y{p{;HXGs1r?)2q$ElJG9^E5P-o9(GbLCmCaHGqitHd`p8CeTS1Wf#dG2gItnPJE$K`x36VdW)EeY^Yu@%+v0B<$;`!b+I z406XJdw9(Q$+v(In*-;$7MH!+PvyssOd10Y%|6pH??EY`-t;u*>65OAX2Q)f@Ks~vyce-c$w zvDt@M*ui|by%;{g%uqiK6Xu6D$scbgN=h)W%kPcOyvi?O%Dj<{URg*zqP>@!{JmXz ztb20?nmKNFR2mLD0xz$e7n;T_*SCyR%~3c?URw@Oa%X6L*UciO6ioix+70V?ym#2h zCCCy!*Ox!+2W)fjfGZ83+wznO(^vuWM__U(tR z5gikGZUythR!`>*1a)rrYSK1BMd(P(I=;Q9n1Fs#cl}a1*_;o1c#cO5eZQUc!s}H9 zV@DGZlvh*a{Qds3@K30!npQI#G|pjQyJqqGS*Ez$7u9)Jxx>jEADhCtwA;M57m9mv zx7l&(C$N5!S|T3&?r>&2bwoKTrhN@y9;f8YY(>m|e<~Jy%UG`DeZyI{2oGIZ zz6)Z$4zOmDw=q{_n(PMfS&7Ig@ z-WMi$M3gunV~LvzW0f_IA}R?1bkfgA6KT0|gXJ>CFeCOEhcGxJ_E!+=v$(MoRZbxpv_a*p;J+BR;Exw(DoHX4b+65#PMYYh=aThP{w%eU#kS_MVx z^v9vYx9tYB=VX;jtk4vSu*UvX62Qgt;XEy5Ro5x@MN7sN}`Z zvQU|a$cE~P8fZZOgW4Al+Kc;m`np);aq+`u!2APL|89-8@l24dP{PTP2snYkxP1Pl zd`=J~OB1P)?f%``$E;))A?US!fa(ffdKgRBCY1*aLWr_1l%LR5%2&O_R~yatc!@7d z3Tck!fZbrw)78a$Q2=mnIiL(&UFC=Sxm=i?4p^}#vM(M~O3Q*TfgI;GqVZ^B1$hCV z@0yK2A-fbx%?|3jr4nsD$XL6beiCbyzLlmPjgtK=+Y&yw!FGr|Yi#M|dCPjQ8F62S z9^HiR^rKP)*KP5hMvS++Qhoz>$JJC^DC2>6-TD|r;i|9F7bpY@1+Gpb7=AC0a86iv zze4*Y> z8c5&v1F?k%Y?6Xu?6VEiC4&~+Mxdtwc}b{C)kJC&L0T!HgF5tUuJcvnW5>pr7+pzw z%%<64B$MrHTQ}aZ$P8P#;AV#Y%;#p5a=p6YuNBOPp%zI#tg-K21eK=QA+yzMKJO*g ziHBygt2Ev%?cQv9!0CA_Z!%WX&qQ6uuI_vQiH=pk)-q8E7QsAKdj}bB4EpJ*LF?`z z=l3hjk&+*3a8N>>03N)ImZh_OpQGp%xP4z}Tjb)JRfzBPHOQ0JpoU1cYED{feTL$D z)HvqOf$eP-_&$;~G=>46EzTzVe#mjR;MysQNv7%+M?TkK!hK7>ABWT#)^m#?qvNh} zVc7k)<{5UY{M-N8oT ze8svj_cQ1tFISpGz0uoVcnr1YFWjUjW+pxS=QpXz-gkFLwAWFF>0+I^a54*DGQUs0 zK~(=#c2m^DFg|{KqVK-Ua%6r2;v1isB(WGmke(D)F|Kz+yQI5wq}Wk4 z@xos3PZ#@xoOkx~SNeR38NUvE4!C16r#t;II3q{lKHTLITE-&$?$$VG`eWTQc=>aD z%Eqvi$yb|u|K5%pSG)iC9`-|u)n!x16z|%kl4<#NTa7F?K@hLchA>#Inr7NsVVq$B z4Ct$yc(#`#FoqdVQBED0HmcS%;(4K|pql+1rS$Z)wIstzA!_TGZ&MfS%Em-r#L0r_ zpU<;}XN)gaHCXvR`hKpvyWkr|>9H*on6%v^QrkQ{E=`_(RXiQDHzOA6Gu(b3U7#lD ze7Or-C~L5z79tmuTX+#E5XQ@<46Rn(1+I&9x^9FoyK+}=i1CeMJ1gZi-DShzDGl*_ z=3WUA-t;O%UNW%#Iqc!Dpo_{34R7$quD|US>WK0c>NC{>iU8M}J1-`@Y`0WMSsV)$ z%7@=?j!=YA*pIVObbcj$?v}b*$7$>tTIja0Fei^Ctob7B_2C3GT^$|zfYehw2cVG} zQc_hb587Eod^h7WCq$(e9^(%VFyw7x{P^3;6?S^QTz0SU9NFY>ijji+)INbEefO7g zk$vNn#=S9v!I!ITr^yTgHQxmor`s%r%ut&%@@Q!^#Y$rq-w-qpIlXX)PPS#qw4Ucn z&iBTJ{QBAadFp1ruauiwWd*SMV+GiRcZhuZZK+z^*T{u$JEAt5(^+wszikl9`$10S zW|&g(fEgzIGE7Ag(N>7?Z5Qr09I>Ji8s^s}EwLf2xB6q=@ySE{$3MyZ1S~5av0<9) z^|M|)o0k`@VpM(ObyTF^QNalY6(NF`g4nUB1gN13Q?&@ry^sIo}VILHLv?7|ad(^5=bxckC%OA-QcWD^jSYPPWYXReM!Bp#EvT%%k4v zr%1;pHdHBvpF!c75+d_F8$TTi#!t`k?6DBjk0_awa4^vMLb7QX?etjhImwM=aXkyl zwZ38B6KTRF0p6Ft3M{~H6yf|z<&VCNVHj?yfM^5auOu333pxf14#vCPA;E_BWRK?w zZ(?}FYBTMo4qA861o@kpmJ*d|ApGjA&T83d70*rE#>tji^uCUn{?q+n^g-wHZ#CZb5g z)Ufg_k27E!dtgeEEoyT!Tzm<5urc&BXpId5o%D@n#8U)d-FyXHCrwpGYQ~;>_w^c=Hr?uIGk?TciajzRkruH_d{}@O66X?bL=X^jCYOsBmnqD5OsLmMu^WL zU6fXKS6{Bu;50Y8oZgeYF8=U^x9mki45^TWz za`ud&dw!Aj@0=(K*{|)-C-fodK|&wWUp4%4c~0|l7tT?Ohk@7SU!EaJTD_d{-3^;w zRI(*>P4XUKycKCDPsYfJoB^u`S0!DfA}R>P7R}3)DHW8a%rx@>B~tz& z*-y0T%l`tNY>+8Z<)2_mun8kQevqI*7oD|xw;{2s6y!kuh-RW(j@809sZJz<#VY2E ziC_izL?B=Cl?V4df15~YCZo@yefz5AMg=0>ibzDw+1gmTJIC)^a5Ww?UH?#Fh)R^B zL;KF3;pZ71x)2e>RtV_mOnS3ohbzyGcf`;6d2Z>tS5e{fpm`gF*ZXlHlz{EBjER&Iy=DVvk* z-e8QPt6WOZ)va$J#@1EuH7!{6YWSc1Ypbl_{iB!(_Vcb`F18tZfBx|JY7Gqu_#DQ} zzU7@8UQ9Nu?R;_ z&o_)!9Z9s$ZyOjfNjU6jPz5VM6#8vTZj7UQSRPF9u;v6&lMYA97n5Y~#u9KS0{#;I8JUc}-@I;%&iZK7h zuDmY1oYCJLh4*iv5$k0UNm)d7!Xi3tg@{d0_GXvhpY9^~mcDiZcKOSo0ayEutdj^! z)}v#Sy63i;p$(F~!I3|2IX_%seNrEtkq#oZI0e(xX z?ul2PucB+7E%@j$@Vs=VE|4#e#{?vv=`<33+QDF~bAI=g_keugumF=_BH6bAy;t)t zP~5}4=mm>Pw0Enl<`*#t?a~huK|ZsmhWUB=%C@5jIrg=+$6t9*4FO-U2%#|PFmp7m zT(nm)kk9^HYJ@@$p+C*TEZJ!ASQ|{oQ=^g8>RxMg zZ_VC4be|V2f7F6bm?J|a2k~$x+G7Rbtx(qXegeiKuutidj=g-Y0mE8bQd@yF z0j}GgwQ-}s92m`71vTR#vJH zkZy316P3=|;mqyLTwI;ajqU#KIha_(adLdfJt$F1MKFvk8aD|Gi3%LEin*oL$5~z^ z96Tv;zR*%BN+B?xFgRKMeO1E2-c`cN)|`!mlP!hR4;nY6E(8V#jFUB`Ya3JyjFUYD zH57&)^izt^4k$htCufTO4k#`dCsztG0F4F4#gY=c14<3a!^X+QmeRQcN&xu68>ue6 z{dvfIk#kO1r;tzJv?7wv5E0!JqQ!u5K=B$aXqGA(RR#5WcGoF^(a1XDES{#dSD2eh zYyJkgVKnX|U!0*(a_b*HgJ_QLqEPe%%t)(@oAn?D1ALu1dp?&B*(0AHvTr|cx^!=T zbpeL}agP07YkYSHyZiefSswtO|4j{Y;~sCu-DrVZ~K3Ne@4_}xA{=L0C| zrCP52Ve2uwKj_{xH5PL!-=Dzvoj8y^PK`e%k&YT()dRln z0+10YRc*B_T;a zzi%a~+zZ4+XfmS~yT@ABbkYh@gA;Jv=90p=k|_9!l?(K9(quK7Je_cinXG(2{E9u% zW3m*0>CxQv06Key38I60iT|{~Md$vR)i1j1_hq>vWC(G$x*9Oq+++B7OE2KNHA_ag zxZt=vc+0+}f%}68SK|2U7(BCW7W0sru$Cg{ zH;8iA3bkP9tD@$92V+vVae7*Nps#yv(KIAH|XQ zllag=-W8h9Nbs!d*81;VhufZHW z*h6|G_TPKi>OzV2$mmG^KWBmde|AQYcbJU<(vMHsN)@t){O62W)1&oU z=9ixSD~6EG;s?WTL?Nws7VrueAOxc_%502 zKRsSn6dLyN%)78CK0{n^W`TL^{^s=WN3nufAG)mysI#T_0Xr?ltv2S*g5$gv(VCbJ zE;05?28R7EDXItAmV2jm3RrY~uv;d!EesTKFNnWojD1{8O_uab{X=wWaXr&o)q7`t z+$diw@$+Z^-j*qpG?Oje{BeDq+10JZpb(LLelec+2nXCJ(5)X5V5c} z=_i20Z9Litq%%YP^CPb?x3zLnM4}&)y1;;Xh7u8~a;5oCASD2f)Qy*43329p)jP@A z#;B_KccfTyah9%jC_Ebt4QvDuo`Xt11iv19Zy0Hb(K!_}Tm+viVFf7-@IRn(6aRz* z6ub+Wdim9CvY8sE(*I}vfgtCnnL+kqZuCQl*II5Fl8G@gYnU-A^Q}X^qQcB?Kvpb` zKikdHblu_XdB5UH8j6WjyZ;|lm~W;;q_ALlG;IdQGs*f_Vd)T zLVFSKk=?tbLkkpwUQz#n6;=?91wua|2p2w~h~No7!(s^GSds3LN0GfjV+cc75z`2* zV&_Xm@I(nK-c9<2O^}2%63E1Aki7A!iO|l|(TJ`Rk0(GIgOq^hfmv~= zkrG0@B>;hV3eW=}g`(V5!TwUAA{_I^EHKB8rPA-1J1jWIFgO9O6pLhpK=2(i3tk8r zA^1RSbnx~VI1AE_)W`r#A-WO8yefAVOhIfmTtS>dK;2l35nG9>5y5;J3(>I^3+WT7 z+^#EcW`HY{oZLld8VjryVM)n=S>Zhk<&))?Z)H-Jq#MYVy;h?$A;(hq#!&O@JXzrE z2|xf!%J7o8RQkj3d~+|HT=%}OCVot^8i($?pEkniV^)Q%@g#>@Nu9c z_B_%f>-@PR*F0gS07OQd0Kx;6VNlM1uN2UCtndgsuYaWq6!rwY#0h{2iayiu$NGS} zi-H~3Ji33%=_CyPcL!oJEnoiGnXgsv9Q7)q#6nUk$9j& z>JMlQ=^Mnc>Xo7=;c-bV_Oay^)cg$3X9x$%oFD~YCG-=l138E5bJ+4R@I?Hvd9HDL ze)%I&((?y0>-|^H-0`KKa7oXt;nAJ1KCkZ*D(_nrP_VGM^YP4lbjQ`E05oJM012o6 z-Q9)f^<`c@{@SLn`65`lV0c2B_1>AcfS6@p`LTI7Jh}4?QQ&fYW<9>61{A=ukV>8U z>Q>^b0!V6me2xw(p88c;%JXR=Rg}!smCcnfw3UUWKO;@C-;!Zal(T6hLK1;~h8X|u z*@&SG0d8nH`$wPx3@RG?J0<@Aq@-V=2{z3oM!6nBSnNL*jTO|@E9mG(rNLNKr7=nw z3eF;@-a$F(D$tO1Eckk7EFc8o-ihhj^hA;Olq%c8gG-A9(j2AD)_%Hh^*ps8|T zrQu^{Dt$q^$<#^X8%#1X;xJemDrykoVA26ZV45r;IYYhJP6+U^HB-8n?}Fc~4gRLa zkEG{Kj35}{j}9ts!h~)iPpdLqEkZtS5wG^!0vZ$|G9IE3V2~Flmx+@P_g*P~zEQ{b z!}@p=cx9UfRmBD&*$(y_Ln)RVh(!Vj)sP8W28&1^&d{K$*Fj^B_}HVinE0~{-A+Z{ zRRhi=7k5b8$W;S@ppp&K|H=fmn+;UW{sY`+`o|ZRtZP&8wELE*?0#74>O$&mIl&Ep z%=p^Peg)?%0~Ep?)Czbq^Ru>^x_q!);+Sn6h}I-ns(OSrJ9)-U^Oah58n&??7QHE@ z`fK>d*ZR|^76`~MxXi5J9AWp2D-<9ZT#bECAM$PseoFy%((mD`rAv$DpI+TIXq z$o~Hp9J4Qu&Qrfba*A4dDJ(0?1~QASnB<#DLOBzHlr)bF;(yWq&-P17?H-K$$*7AS#HtH zA{cQD0IM_3kC$p@v5H!RMmVle-kJ2)5<=1NPsf=f#;#ddam~O-47RMjU6>Ff{B78`PaFPuj2nN;*{QY+!Pr?KKuOBwl zS%2xw=^81oe8o!TFjr=CPnxor0Ges>oT*^VB2_3*RX@Rh!Rtt~TfoWi79Y@zoyhiG z9QeQ%OKd=gmSz3w#td0Q$*Kw|x_Q&jbC7mtZ1?0RMBf=nORqnb>g zUyRf@Z#gy4Zz8o!78<5ekN-4fz0_-wB*eZ}#fey%J~aL>RQ_>VBKmJjgK)5aNIRf= zVOGET)`t#Rd8Unt#is1Ou?^zLV>VmG6e{elRL29TDr}Iwo5GeF4 z6q1*WIVI~sp*$;-$1*G_O;;Q0GPZ`!Lr z3exd?=MGSQdq}O?Wk5CNI#M33tTV zvQQML+QO&p&ur*6^IkX{*^Gt!>XLuL@{YMEbSX)5VJ^^j!K}jSzi=$~Ax&%N*C2bI za$D}t{5u~-PUG2Zl zLm2u`bOB%Pwu|zAWUAxzSf@WWka(X#;Ry6~4Yr|si;X|YLwu>^7x%Bso+t&zM;$Dn_dlUeU^ZO zJ*Q{G#;-GbKdeRaQaLt1ENU%+$r%%_R|Wve8$Y^lW(Vr8=R7I?mvZZ4?w;p%K`PKU z6zfgS%nx~W@yro0^6gu)mb@`ke@s3cGJjwblucfUGk?^6S0((&K_9N#ruF-Mrv5XAe6(c3hV5yHFu{cp@8yA%Ed$ck>F$!q)5{bX=JYa$7K8PAkGG`IJe zvfPCw&xx)l$L@@G&#%9d4*wzPh5f4k5x5 z|4=&cn2`jyG@2ek6c8BbPgh^b{A-E9-q*ho`}k##vvqi(vbRn_Ru(eKil%RvB18Pu z-j=IXh3e&Td~S^owc7>%aG%OG!heD1yk!<}&HN!NL|JJP27eXU->8H=uZ&CmxB3tqyBJKA#3}^=DJsqx*UlGffu}ssHlPb%&lo- zv&k%YeSKYRR17k3n?*=iE6~W^xRnHEJ6Dh($mrV#afu8D5r|w8lN!HP8Y+wXa5#SG z3eaT6^0KmV1 z_iX0CrIk9i=7Qvw_Cgs0n*sSO7(s!M#zxcF5EGdL5no~p?u{u4c{tSo)L%p$;=R6^ zl5b1#1CI^AYPde&i1wGr&ig+9^(UAkTi+x0M=tM~fc7J9D1NPu)K^zh;%=SAlwcZx z(0D1uC!%uV%?t4yaYzi>vSR3 zM?N|-O8F)&%iwauIwA%gnP3>i%}bj!7e_mRa><5 z%&CNN7QjEkNiuJM3dnN=Au|T(AzZ@y<3NJIyIKCyx>-bV=W4TzyU*)Cer5HP7yONU zzF}CHFG_6xOV z!p$Y)CK>|45sPg*I546yf=I^wK5fx6eGef)8;_{{N5y^J!r=d(($#cvDe0qf`O^>% z4+jtbk!I9YR1A=2d)6T-gO~Q-WOF+U9lT%%WjyI7GG`)INH+n40U3+K4mjnUpuEt( zF!1&F`Tc)WjmclNBy{8WuP*s+nTgB@j2msSz`4NZ){=}*7V240uvT~GJ3E^z2=4VG zIp*~x?$%;UyxcJcX&Dmc_uX{Yi5%&sZvI2C)7gYk3Ec?j|DXXlx=(F<TNQ>;#`g z92y!biw!HUB;ZCdx)S12!$KzHZbgIANJgj(3Wxjfu%s6%v>4%l_E=_VM=J`P_nAM) zyU(=pCQ^cnbC<@i-nt!}gKXyyJQ$_7qW*U@fX1C>)JfRblFMC#jPdZnGbe-LYCNsa zM|Z-&JKP?eer%MoUrGVDhKddXW|6{oaj0aCyWsimx%qCT^@qRtT(E3R_ru7bo-KJ`DDXKf-c&ueZ6>^KncMpd;BO#Y^H7XtcY=HD!s z$`GF+-X$eJ9KERNRRtvaCxDDxtyY45c)E}O&HlfXqx&mi?z6uF=9OR*lM`9lX$K=I zhL?UI+2CPSN>tb2cYa}k+?bxP4=-22(Mp0e7jIGrm(8nhY>oe`WR}AJ0Qs>G_%Dz< zOcC}DL_TuEo`|}-`UmYokO%=DG^5v1Jscelr@hBK7UwThqj@a0G>YbFvaDZ$VzPRw zy7<2N^>Q?t;}7b+dMNc36hQl?c5uXrC`E;{4j`Zxzt$!glhUcR);3Wm#2#u)2BRf8>Jd`~PJB ze|3%ZPgvL_wbm@-IC3Bq;s^g0OOakvd?rvWeo;2&iBe~cJU zt7ZNLHk3GYf3E*zI-Xi$UB$3sYO95bD}{3sPi(02T;`cDN0VrU@gNKHVqz3AXFgtt zhNiLDz2?;)uRLnh|BdWN!*8)jek8Ujd%Hx=jmY1{hQI5;_O6!K3O` zD+L0fQo-T3Y_&iS2gGY(SB?0}a+$}jV`3%k3(FL!OFjvSL*zfbTkZcwr?<`#XtYc@@Ln3noS4yXb{*rfWHxAY?9-0AFIk?-WHrC}{&;09Y7>f3jjQ%K7f?4B_X4!7 zq2IBCiY#A+&{)Usq*DyviU-=clhYIYZx+O8E7V- z*!+B8*J37zzPD|VrK6EX;(ayC7Ap<2geOd6kLJOCm!0;cv+Sg&o)c|S(w%4iM1>}E zhD!+R7OP#dL=L#_FGvPZ);c5o%QML(NDwWugnd8&l1j~=mxWsZJvhl0&>oLqkj zD=S%w!99l$#g}=e94+;VYd}N6O{*R8#KIY>kRB~SgR7x(5K&;%yj2zfJ? zFcuCZ4`#CTb5IUAYk3J+D?MEMU9JT#xApm3UDV#%FUkb+%p)JpP}c0Mw6SGud8@j= zTBpv1K=DH*7X_PU=nR`IEgO?7WD@nS9<7EvLuf~+hpZ&kR>7qj zGT8H!z;;lzP=YQn!L{rk3rM z%jJA3h-=mjCAd?oS=zHn!#vqpPUt0WO$^4C7-`?Y;$WuWx6>9SuhOAd>y1zvC-H-R zq98)ZQXZJbWM;8MSzFIRH+X6YkYb+1DNSsGQj*mFnUNfxlph%leg-!E>*N&L#SjU%+Lavo?jv<1oEpxK?~vFxTAe2e#O3-yKuku9^s)xZyp} zrb?Ddev3LL*C6hg*M&gXnb3By(O#r66!9d?t9Q}{#CHbMLwkrsx%-}bH``3^^uflz z0Tj$qMT(h3X`ZW<&%kVIa9(c;#L_=VnYX8LzXuq zDb|kWfyn0`QDtR1F9g^q`6KyV)y6&oq(3Rayz$UlwB0;<48G}MeRbpyp#*in;IS1W zSavN=5xV81wG}Jz$K9Ee%N<3$1JRJ#PX_XoVN=7%8&G-(#{m66tuI%UJ1b@dT2P5S zYHHpO-y^#}ZGJPF*PeG^pleS~u8W&pNiI%qBOE(uAS3-e|1qEtA-2+HEv6;sCLAMN zenvB`vFUBrk%LOPi>OUZPJXH)!7$-)GNj*@yDzoDM^iOHj2qOhlj2tC0jVi+WBIa; zD_;;>z*5g4@&m~Efk%B>GE=@;z3bELC*g}v>8iFc8u9~7u40p@zbs%x1#5!rr^5I1 zUaP5Gok;273#ypnUgA!AQIn@As#1cTLsx2zkQV1&_%Owif`M{{- zj?Iv%!tNYlVVj%OdP^3ul@6~Z`+=F$l)jVa0fTM}xUp{;e2&*6oW*px12L4Rj{@t6 z6jZU*HAQ<2X?1F9W)4xs@|TIhV;X;kIsQ@0i(~>5NOX$$RP;8M$!aEL>^7RnxHvJG zCJqbhU?<=`Bsm$yk8FkR_T)r0kuuKDk6%SJ|EW^WAcxp|=c+nHyiKp^B@OAg{5)RH zuA-K6xY4X!c9PH9?xPE%GgQIrgkp~yiI~d$E<;v%qq+M8L*j@dS&Vw70P=d%6aFLW zm7M*7rO4ynC*)-a_@7#EtdybFY|b+DSp>Vf{Vf1viP-Su2m!-ZAs+}IJwf_rue10{ zu5rL02lhDov=y;_d^K4C?O zb=3?mKRH^qR){8{9*qn<3E<_q&m(0&&16KBe7~Iv@lb4Hs|6_rQKqgo{0`($ftNJF~K*@%*&7}qA}ASbUs zqo(%WnzqJ9I01IbX(%G>+w6D|0HazBOLbZH!}5@3=V#yDGsL5g4jGN8XLztFD?5=u zdTasu3RDlhNn9KJ%D6qL?h2z6BhQtq*J&+K@H8yekC+;ab<;c;GT`ryMSiQZ(q30b z8^XB##i=>STF0@ME5918;Pxb4sV4Ytb_M0~q)lLbKq9sGH{O*{S!A(DGU~*w!>2li zAFHJpMA6%u`*ms-NyJIaWN51F+8FQR7Um4Xp95Lq^!d{`BWB=Nlq;_b`(al)of7E) zV*03pFB0CXQb{?z;m>S@$#fyCh-t7O`&~`3l{u^W=+g?^)Czn9p@_Qkyr$PE~u={p{x9aDydh$Qxs1DqUG!& zo{O5N`^PPsIdthgqDHamugMy&2Q^73UAb0Z{Yh-m)?<5xAbAMUu`|yh=f?Tm;mA<@ z;UEq~S=wYt>@+0zVc6y8V|rnQpGh}zWb$6t?4rl{Br-)dgP>W?21#bQu5Y1y!I?_F zYG;rWMsFh_@Uij-Zj&RhZA9b%%h$JfzKCac>NEo^1Oo(re|Xr(YjD1pWeSGd3Nf0G ztcHD=H6TSbBumG{*Y)q;7ZnU8F3g|VvR7T~mN=5uc+lx(+57rG?Oqq*TDqG{9)Swiz2>7M6lIWBy6e&(lOVF8E-ZnbW2QTkah zMbSeram@A%gf1Yz4A+7VP$9q~(3nfPA&@>}gp{y$g6!k$;1ruE9XHr%$wT`VGxD-= zlV!Yz2p|#JUVpxW?eOVwDv=);N*1~oJxi#J7h~TE>46*OcS^N~6K3E>=o~4=+zrMfkuN(V869`@>Jn>8 z!E1x`akyks2uT{c>#Z*!-{?M(lHyap0&}lMJBaQvm~9cf5KxF+i~Oo;cKG|PdB?=I zPItGid#KMsZ;f9ry(I2{IQ{^#@QH2S2hysVa>_FP0LSWg!U2d?bizUCD2Z*j1=^X>WIR?O1^R8 z6U#|ZmQ+q(EU@?0X%b^x(R>=V*3R$i_0^)^@z(f0w-3=!K#U0&KU|F|N?jn4IIA}X z@(m49Z?r4-2khOAA7Mn%0wddQuLm8r7Nh@q62XNJpe_ za~?4e$b2ybpB`Zs9QhR=PFa0B9RqV#z|CYxaDm*VGQl!uUNuSRI{TN<`vgF%?^C~6 zkGO+Td4|1|gTt2>>T-K$7u~zOEf}sRA_%cWeid+KmG5i9wdt40AU)&FZ+(hDz}h$` zK#0}QBK`vDfr3xp#Q3QAr+e$=9Vz_m>w9Pba|o~4Jl5;y;a4-=E3ZEsebf`YYLQ;t ztAMa$1NmTs{R1-GuRjv>5_=GE;j)7;EH(7C*_` zJe*CbOzoN0n6h+_R)A90t-Re@m1C*094N00r&AZ6I+41F8cB^{ll}2i0t*+Dr$$vG zjVqx{AYX+W5{=22EQ{NhA}w`=1DPrtQ^tq?^Stonmq+QiI0#FPRBlr<6D3=d(D=;c z(r9@(8r7Ln2g*HNM4XJ=(>d2P+~=(61>60!GyCneYS{@XHc*#;jJ74R~jmf{;s6R%0l zUe44RvjCConpv}*C$avUrfMb}cA&i}_uJuhkP*jB!z%ho_FlukQC8UgxM*B_ljwh=b-A;4(BT$oqf zT;31ThM0K%3`*p%Nc-TQrWT7W)6vX08=MpZW^!g1M`*G%=l=(&q*>Cq~VdrVi`nE4nr{~6(@Swp(5YN z7QLfza7!+8h^?5sjUH1wJT6eXki^y8%&CcC+Dyjs)#Oi3%CBgXf?Oa?U{PTQv>r-> z3nr|05Ep}^KeAEv3p7*Zie6niD6=C+Slm*YX`vz?R^XyQt<7{0$6-;Mt8S&VgDPd+ z=!sl{t3QWEWyR2stAU$?$f;^#V{|Aua~81W>HSv5K08=@dM91l#G$OYT%n3UswUnq ztT9M*H%CSXrHHJt?m_@kh~6>LC~Co(gxifi!eyP^;m0ftE#9?xWF;H-LhxRT)|^bl zhXDo8Ac9^MX z^IGuwFs>&7JtUjp!`eliS`h(*Ni{8`G=efz@g1xw#CXQ6>u`LdAZ*bgML)-+$3DkK zx#@kE?1Ef1!uJDsw+^q^<_f{bI^v;8pr897Iuw1v^XizYtWsnaRd4a2=ohBnl7ISd!{g!H#YS>FM;+mbtqgEM=b(_PZ|zojs` zkp;gQqR|^zeXpe2q+pJ1IileW^~>p|^^xq+#(*7hKgGl#WiDX zOROa4iq{<_x?%8&iOyv|LVJ#@)zYGU)guVYIo`3pmN~XQ)_LlhexBaQ>N$UvtY`D$ z$PBr0gv(8$cI)ieSx8=!D;p?`k#rn;t+8_i|;!ekq$1I$ge+D%1%l@Lc z+#USwaf3T#l`*~;YD3$cA3m$z`sEF&D@q_R$MQJmSP(KMHfHz&Bv0cDO7gCD6*}jZ zWyMuUD!l+XRb3W+QPe!)yu~r~Jo!ARwrY16d`Jl(_-8I}N3_OGN#nNl_1WRhA;H;Y6pa&duZ!3~^91FP84eGot_2cLXe9-`{7^r4p0XB6B`Omd zCmbxWZMChwEx&EL?ea7;#r!p#d9DI*y4!shEsvuH+i=E_wV2)F6@vtg;eLTP{LlyR2{bZv z8*)Du9AX(8h1!*fL_%Z79EBoHbOj|YbBPxK(tZlIIJr=lFVB*Y&dHv{9jbH!a4$ol z*QSAq9xA?_WBWwoNj*w z%(`1)x*^r~R6MaShLz_uc{Q1mH}<5xn^#2i&ES=;4LaNLRD>XC;j77_`m1gv?pxDy)JC~zmC{lzN;a`Xjn@sL zb<8*gFxqdM)akZ_%{;e;mtlH!CI$&s!GO zjiIfI80Ie=50k%O>vqI?ZiBzRB6x&IBMV17lF5Z`kDbQ%NFHAV;{C?rhS%%?Uasf_ z2l0mCJ95ii*zDw^F*UaCyOByLFQuWvaIvUU`Y}9l{3@kbG{cOEsYfrbyqWzWU3HwJ zYIARGZA0;EF?UvU4)fmIB=l$vXy4JR2UvSh@298;xE{7gjZKML(TS4s2JI*5S)Ac1 zU(AXEf1!E!Q(U0;R(^kh*(zD0 zH?`zvG-3e}K9BqqXV3gheU>O_9(9LU(-^DAkldlt+_FA=b(|sWycB{~Gt6hqZWMxH zhmtS9TShH9KYhxjkZ$(*qM|OGn_Jps(NXqOOukj-dq>sp_u}R6BtKNpfEM281OmJL z&%bc8B&t}nVSYttuZbGW7E%)?pP z3VUmdcG;Q6p<=r0htu7Y53GkyU}fTT4!ArReOA}%i~juecP(dHnvbTdREJO~|NL0= zvWzO1h%6iun#T?K z=Y{#>C!_DCu_}_-iHBVnu+j)sELn4H@Cq2JPh&%4aB~>OPmjDmIzzoAaE=vfb-G5L zsy)#16!@^~HEcAv6h9@?$THmO$!^Fxr~6>f!SCHNVy`Waana-7Q+F{hVDDiw0F8(4 zS@STTy-+^Q)_R@vCcM(igiuZa0XE3=VIzcY*-OQq-19x_V!ee07?CWdd2$lyOfjCr z(5G_v0Z8%-yiz{0S-^lrT_MhrwRmyYbRAym;}_3D6c!IVD*Dpn%GmMtDkM$_qMqb? zVgqkeTS1j!&gwnec3P=jnJ;p)%3+U-&y3DAk`Epf$c=Nc``BY$u~B_tebL4!;C-{R zvs*Sz7H%-+y2(0KCQNL0vf_H-2r-B;tk(-!;1zTY4O#YC<3QYNeyQwCbveP&Y(bol zcy`-foBUx*6|UE`i-!O(7qxcTbvOU@vg>SK74O(Zj6xLPE$L!^a<;TQEO^*_C3zA) zd=TLM77^qk!2e>MIJ~SpD+Z6gWQpTa+(a^vs%kg4M04$!)hn@vcJ1s9 z-X)F+(4nD^0%(|WXmd1PtvCEPV0AgM@l|Z+d!mdU|zDJ3MkY z>}VrJ%$f;1+})J!4ETJ>Vj`_%1uD_z&}Ec1{)l(JE9hm@#=TjISa=s@q)42@_<5`n zDq-9!w5(%J(rl4D2i5e@zUjM%y2KDNaYiDP-XT}&zb3*%6U1AS@8yHxs;OtF-ZD?<0R2>u|l zh>v!uXtOJrP`pQ?o(dK*)EJ9|i6H@=bRR8a(dpK}&Ej@$3j@n%avSsX=_;Q z>-oME1KC|p5ewp$Q1w~_eD3%}>9hzD!P8;~Gfux&B`cz$tTl)$qBOCHxy10u1S!rF ziB*U+bMENT8=>q%?7}!V-Ro{mmN}+Fvm6e)&-r32&KvoU@QHSZ7M zg38X~-LE{+{^LXygC5Zp z22j^cR$-hNmvqqZzT>qfP+uveQ3<|qY{Y}K-s%N?b6OvlnG@nH-O#4_@`#x?T$?S=pI;(4!S#+Uy+Thfo4&+*S2x%J_ByY0goe2ULYGuARYv#%rY=8L@9 zezJ-@Owlk2McRaY}49I4wDooG(|_(FM3CsDMb4dgDa561j}=r!F@IuStgz*8^Atu zm@dV4v9{lx4E2d;_lP}dRsRt1XZopa&~Yd}^OGTysS{+i64H<6rKw567Mq+JA@)sf zv8Sy*Z)sDYa%%);rVSc^YeS?ZRlzV7>EF8_v2Gfl7blO|8aEFVEIu^qw-8sEg0Uc{T6kBzA z8;PBkG;sTt&9TI+A*OK9o+SyP>m9Y;6t+xbo-R4Wq;uNc1UiG^yp87zoCWc>EIs{I zo~+cb$_BE(B$hu{OEzIQ3O=hPOxVy*W9nJ7EbM!aTg=qA)!Vw$(`C0ts1vr>)hlOA z5qTusS@D0t9&Pt*)S)k#H4ZYS{kid(*QjO2L4} zSI$qJ-m#lK>dn1eeyCEFHAM@@bk)?;mD^WoGlxE*CvD>@Djpq|01gDk8@t^-R}hJ~N@WG=bqs3br$cQ|BueS^&j|?+n-33gU_`zMPPersGLCAGY<9v>{(;64sCX7 z4FAXv2trq<^+X=&dH**=UHF*ToPPTo)fIU^IL%W%KUXl`a=OlDaOC=?nC?8{lTzVx z|H)iRbUoB5TJ^at*}4iwcu+qf?y(89k!(5CriKVbLlbfeZN*Yb(u_IX z#7V-V*---0gqpcb`gb(OoeE8DqP@chkrOiiI1bdw|{+-5N;S$);(N5to4 z5%@NRPMxlP=Op*0d+(Wr=n*{yL@lLS0iLfRzkvLqd#%ove8YQseRy>H-Y4 zK17{;o9Tx0NPASyiuG6ipxqIL-s-iouE6!yqWKKmProK}uPr9IFHeGmf{@xvyGRns z{yt2xuqxdxBco#ZE{ZP@F=H$nKWR>_zw)gVm37DoS;~_;j3=7r*?{a*KQupywsHHc zisS)o&9t!MP7AACgCnXkrd-uJu=GymKcg8n$DtEvsQF&5K=&KRjRkV|?7_=Jrp_tw z2xkSmGS%wiz>ugSoy^_vB{!fkc`S$KJ=`yzjmGNTmOcDl=Vh~qH$8tW$zs)XS#0Ou z2U6Rn`VAet^msje4yd`DI<)nEx|fIVS#AL~FYb}4{bTjHUgIaVe3p`24yrm%Zubfi zRWIz{4}3G`V&#ayV(}a)%fCf6*E(^KAzQvHwlkgzUhc?m>=fB|rfzpIvY6M|6qQ-^ zNMS#HqJ&A6Z`SgQWBSU1F5M(Y!9zfs!G5}M7O9+}-LAzpVb;LYfHloRrF-y+ja3Gq zJLuyzX*l(cxo`T55cz;QNgZyAF?<1QlI9WJNixVnsO!g^VOT@`e+j<-5DE zx_fRJX_e4cY@Kv4^=sQxVg-oY{jH7!(fd2FtPH* z>&a%zH|L)<0q3I^k8ZJd=ZO^`AgOV8p>A(`dd?N=XX{(QY0Z$f3Av8?WdQ@^R59x*4|LZ*6_`c+pTNm_vKf!`|Fs%c;5SSCU*(GIOse8~TdAN{25p?&P- ztD&phP?sB3!UQf2)5RM0s~6~5t`W%=$WnwkU&pw2ht+3?8`DTj^C`DqrImG75)uPc z2BQbKKgSNxwJicjD$eB0nY^8`&}F?OwoykuJ9EVIR2yjGEWMt!rl%1C@}~Wjb*5Hr zZ&w68wP>uCSa|*@9+yG$-B~eDiz8``hKCD`de*9unKyT-Z5}18oMz1}6D|u{U%%t3 zB|N=TRO>Hn_^!l`e0$T4pu%?1V&PlU7M(3t{OaXnM`g*%^reN#jTg2s(nU#{$Z*#g zcC1wKz}+o~zM(^{BuYXGXk{}mktF}Zp{{{kK$Q6J*jBQ?Nn|7v1o~JnN!*LYskctYgrt>Q-YL zYpv>iYLBV?=k?bN_<9n}nRyp+HPxD?`!Z77Wcd5CxpVGsKGol-9>MaZV^$UYzkElD z$GOYs>IAQ2j+16)Cd^J8=!)}_ zar$VngUwZ7fPUUy9VXCd+`@nurQuY&05_eZB)1K{`clAw3Oe0Yq&3nkBk zheJYI)mK2j{_{lpC88#v9<)n*01es1ibPwwGPOjnPpb@gFB$<-C^zM(h(i=H@ zslXUQd9N~*I^f-M{XI@iS>Po9QK+w^w4SakpKhGzmmYHxqs1cV#{_CiOY@F;$e+}n z{exDbJL+%7@pkS(q{IB>L*MD83TiO#3Xq%bXl~8E);m=xIz?iJ&@W80e1hn2NdVr> zewZWLXef3+4u7`c)0Liz60F8yKmIC9y}9|+*f@~oaRO*(&75_YG~E7bOL{=A#JPRn zxO^?(?!9Pd7;tJN98o513w_Y6W}Y}KmKWcXTN2L{5e5y)BGQ2Y9f#bQ!V5$BiCzoa zO2L7O#z@D&oi7RBe*Z;SGe+kWP9y*&KQEu^0(*7jYk=ar74+OhC-vi=gK5*O`jmJf z4Kusv4I9vvxy<2tlTXUd>VZha?%|o?l7BnRZE__ykFWYe=bR$TgDhjUodM!ZaNY6* z8T=O7$S@jZuv19GL3{B!>jrZwL7~HX z{2AbL_wbwNZ%OA?lDOzs&Wb5m6&WtJaHf|LX`a|H!~mnZrMhjfuui6FDy4ao{2s6> zkFgj@V_T&v8cxQ}OqS!S46%bHaP5p7H2Df)FYtsW@Wjcf8=J>Q6}tjr>Df ztUX5Fq3IY&ZR;d!@!+7}NH5GFUg)u~s-t`Fm z^pQsn$EY%-8YntCyho`DicAKbu&`^H6sJ*IxYFkpC+V<(2+C~af+q^(( z>&;EwUMjZg{X^0Q=>ZAHJI+ftz$Qq5SO#&J3a`Tfkenfm+yH`6{@uvIi&zU~^ zFw)V=fMc&x3e{xmrp{}Ja^CR;qvTL2&jw+RRLb~;L zKEhV5*v`08m8LP-rZc$y3kdnuHL7WFk$HeT&^*q3x^T7dqM)2_eo1%TUD94jlul7uoTXeLAv8e}ilB7RtK0wWNJ15A2_5Sa^skxOQX8_F znK!Y+^W&k$mHW}o+0PVUEgL4awJhKme_%EayK{tFFL&@Os$Q$sqDA9Hi^g}@qG3kE z9|kp~{5NdpK)dE(O?x2jK}ObXj{d4{)BBqkXVy{l($69`#10DpyD8u>)rj$|8rCIS3z2o#bhDKj*pbP~RgE!VMwJf_e<{nN zfL*~yxp>4Vufi#%DlKayOz^8XHaHbQIPT)Ih_)DNSP9e+voGmATNT%fp~xI@PXnielrmOrRtKN< zal|7du{*wf7^gW|vSil;6A-GJEH+S0)NGO2^;vXwO%}YSZ7i2X2X=cZedV8IuKe>Y zM?As7{DQ-G?b4rpb{D&U8B2=@WS-~>yu);*d&ROk+2Vml_1V_~k(DY8LgW;`!Ru+7sB6+5~NaUFa(oTKn1R zg)_wStryzXSyc;_)EetRf7=u~Q5dbn)k)ToHuKH&7Ga~ZQQa)uqsUHbx7o@iii(J; zn$=n^smQ9@H2X9XCzPtH$!tMoZnNpEpPHP_PU_r2H{-NY(I$n|4pOmIGnq3^q_n3f zZmKhf;@agFV%dS0Z6g-UOFM95CosZ{Ylg$q*~h7M#e;PavaisIf8Igs9t=rMQnQ3J z3EkZ8VDoj3ez5UiW3BfP6JYLN!M)sWyZaiM{MPcPm@=PSeLwfRtosIcyWpmx9J<^q z^*;vQGJP(wpL=VDZ>`SXZ^N?<ZF#@%m^eFYcJ)n&OG))=TxK)AgB-Ij&irIo`V5(|y-^ZlQWkKoFb(i^+Y2ecTEl%!; zv6zG$Zp{fox98CyTq!a;o?CI%I#gAHqd$#C@?joXPX_*)jQz=$&TTuN>D;mT36l5X zABpdx_iy}7=Zo|yvW)!TkB_%eOn$PTD+?r`|Yu6&h`X3i5>A|X{2kRG|ojKjtDu=zD ze=Ad6lJ1U-hm#v+%;avhX}E%UaH$QgZk2euyH~obvT&s*K(SxKVF&VE&K27Crb$b0 zYWT48$X>7SsRGo)=A}V}3ooW$Ez=$Q0U6@t+c!Zkg?0=3iyH&~}l1t$Dru zd)9mH9rpKZ@7i@7J0XWX%i*v)?3&5xqv70av+QKg%1K_6Dch5q6Y%^ZxvQJse{NUG zV)u9;oX_RT>$Tf$YTyXrI`U>^mp32~wcRFXp2d|jlEB>nIou&2bMJd&s9;4wbAeEh z@10Bnm?jsR^#>>yFS?Ae;mwIHd)En3^vsKxj8isoEw}NY;k{$jwXqoAH>k5 z>>GS-rX1!Xid&ZEREebKnZ>>1eE$#=y+NzXyKFoNH+bU;x?Z(uh^yYXF5Y+!%s=^o6cXM1VX0Z+#=>c_rOIOS63aqovv;Gi$-K$BRb3lxjqPUkDSOTP ztT(B?h5H@N}ovF9*Fy;crlCvQ0%v}l@)Q&j7g8V&&I&s01Cw1=02fB z48}M&mo=4hp*~V5f8=H;t0LyaCe7|iewt`NXR1ppfpni()M8e+NH8xH5CyE|A|A$~ z1^5`xg#vy2X)=ZmVp`wj27Rbums7J4CsUn=$-oc(`gYVj)yjsT=j92^y3@ zBiD5wjmznAf3qGso_Q=e#AhEj&-vBX6^~AtID0^5>7(@(iLq#!&iN*`SAmMqCjaa%A$@eVG7f{^?J@`VZ1} z_hI>&e^|?%Z~*20a@;zDoguy~vhEYQ-MpF|AP#3oi|ecpai3ZR6F@c+V$Ms>%NV9J zXFxa&hIzEn8ApZ&g|ZqHQg!diN16tOn!;`vc29Jpx$c$j?QX{XPo=VBjb`ddG4ww< ztjGIm+*3Bjj-2J5GOJrGH0~*9xu@LZBAQe$fA`cZf#Xyx6X!~2T@6$$OA@(^x8b%u zwv?9uQZ!YC2xG9yrpw1QSXsI}W6tKV`X|XuutfveRsSPJiwv#z7d>eU``oWWS-ElgspI9vC&O{uszH zq^0c~7H6p>F9S{zIf%H_xzp;o)3&NAplN+11}&Q6Un}0G2=#Hm1caYf@pB}ul^NoEz2+H z0}s5^{UX+$-`>7*!v?mP`V$D=jly{6U}jKxNC9e&5zA`89gVhZjFqJ~#>$>ODE5YE zalC=C*|X+enaANZ4ocq=gwiFAf0zyWpj$!3_F_jrSj+Si`$_%G{Vg^2T8C_R5Ko1j zY%IEa!mR)1x-HU6iQgh@csAC<^$Lo!#X^x%Vu{=Pvi-&W3VGs4aVpy+&Q@kwrrNKA z&Fo@viPBla4}pvypt3Ami9SGMs)Q}{G(A&|-gWX1ylA!@53xQqF* zhQdv}AW9M>bMi8nYdEYHvl*(Y*=Bb*6x?mdtS}~rtUz8x4oP-6!a%}=L}HNH95yjd zlZnBDfMF1Fn9U{=5K}JbfAV0y(sCI1oURum1mBb6FZzAsx|_To`?{LCnlLbaSo2V7bk}qXvTftW<=Q1l$U6RK zwYFK*`g*Z5_lImdJ3D7mB-XUvEPhk{LLrtVUmYa6g*Q-VCjl&he>#Wu!;%QxK%H0+ zs3Ym1M}ov!c`BVBtaD&Jgu#Dii`!H0u)942MXUtYGc1M_Vy!B(<7e9I6jNSgAOv}l zdPOD>B9O`9!N(jPe2hQ{LzfS@+#!e+p>K*$f#YV8*prcN#Ue@#>>Z7;5R#}gD52Vn z=?_qzQdn^nOuW(Ee~pqCG6(Y`6|PJ>x`dv~>{;6|aXQ@9J?_$%Na<5EF_eL1-W;7v zn9y9xB@|94!X^ylh$`kBQAH=**_cNY2C|pt@{Vj45sTU7V292{F6D5MuX5zwUXEfl z+;WD9W%^GXG6Aa7bSNt4s^b{XM8@l@KZD5fxACQm>I>EL)OEkOvJhN_-c zs2FF`MYn&`e}y^ZJ!ZD(1BQwaL}KewyS1NBh{RTpVd?~dc9Joa6fuwBX#6CB+DO!- ziZ^2pdoUje=EO^iCdtH}#N?Ohxu^x@6JZ`w6!SXY}fMVSn*Z`2913vbu!8BVFe|%~jO-RO=?4_|?43hzr{`d8PvB5|l2hKNFDBVwT4-W#o3L)gXy z0_A)1y~)y&>N>WrbQC+Xv{9UyTqw3A*O}T(FPpwJf0?w^R$CyerlQrJ%81iDr+7s% zDh{SB4VHtJdo4W{?q16imcLpU%QMD+Io@cYe|g##q7@SSv5-nQNuH>MhUi;(62NbX z>!aD?rDOG}MvEoLcut^4k9sw6kXVdLWqHUn?`_UtPypF)0mBkR`&yo>Q6(o3=HkqR;bZc$CjK@Q8OB60{TI^^z7GKe?e>Z@JBo%8~buy`9LQnI+yRy0hwd5v0{+Q?o z=dsd_ch74Xwb`3jX*LTj0hJ6^IvR;T9;^x+2TU?)GFggGFnx%jH<*x_N(wWI*W(E~ zY4kttW+SeufrhZs94(S!O0;UKbJx;RQ=QO~wFV)ogu7iXr`uB)XL!MaTr@QRe_zDZ zFL-+K6F(c#I+q2S#*CqZ|Ah( z|FUcRj`2>5*&mI`%lizRxyrk0|Csc=(PbMhe7$R6KX|Svs1}V&jhuV+gn{dcMR_+K z$Haf9f;?oW<9IXVOx7q@!wuuOe}??S`6xfXAXpU~5?qL+`Zg?D*qkRyPkJ_|K|9!=g+?1=Y5pllkW?2DQn7E&NW!m+*s>G zZXx$>-rw1;RFmqmusi~RAZD_%D`-(jaCNUy&zobv$p%`d3mU!AvkFv|f3z}J*{-l! z9H&CZtm4%@_n#Z~?F)1)D8?iT3dtBFsH0F*4?!hm4JMg7652E*Jl1Hd0(Qf3!O=IB&ZE}rdoneY7#2DPSsxpLJDkv;SFiuZSrb?fm zbgX{z+9y_}Gk<&bXG>7^v|H9a_T#nd9^+1S|NY>EgTHRg{5A8Ne;>lzpP#n>^ebmy zI*obB#GX%?F3dOlXr7i4?diE-$TG5#Rw5aI)c{ljAYGKJqgGqCS)rAX&xv3q=4Y%u zs0iL5t3ZoO5J_7Lw5;~#ag}F^V~S_4 zW3J~1=m*T*<_FaWfBh!W?2{Lx7G^QG*0j>R-TaX0De0K}l*!~a?Kb@$F_wZk))m%m zR>lf38%W2?X;j)=T&;F+2z&%CU<=k@A~@0HE;- z7jt;SU$U2hsFKXbvJS)wuqCM(rqen;!?fONu&+ji!}t)zf3q}2vXKmmZ zjZQNctLYpae_2B(L13o-$-KWl{%+6 z;m%RP>2jm_I`hZ;AKYKTixw5S7>lA>F{M-l8^ELz^PIu*Wu!8jo8_&7;F(^DAH;0d z%c!dLJJBuLXpO1rSsPSsY1>@eb{nRvWTx*tEhdBc6Xe{|sM2kwQ;zDa|T<*VVy{_3w^cFxC(UNKdUko(U z$y7SoNJ8$S^Af!|CsqJbiV%=b~#QX_kU$bFbF?zt*(l6V7AarJe|K5R3QH4%3I`>|CfZ96 zl?r_$eTy4PhbzM)!-}UyrWUsd^CR<%=az0SeK+xG!*-;d92$YAa zVNgyv=yuvvScyVg(<&DXTIFE{L6huuRmG~v3^lp4()=wat<^|GjyB3Mf3Nqf2dbX5 zXRc?vhb>Jjxcf^fee+QI=E>4G52bG;FP|R$lSbdjRU}Ver*9rD1{4FB6n~Y2{a@+t zG&OqGSYZql+%KddB*pwa3clTN|tsu=HRctW~FhWsO#fuvR}o zSZe`IWe<`XX)|qDDb2I`f0CtZB82QE$M@pwD&5nl=2AXN`Y0}cPUf&UuTNufUUQtR z!Ymi_SpcA$0l*RDsEmkP+(hOMIKC9OI`486QLJ=m`i>?rV(iDbiILJna*3!0lfcM{ zG>Yh{sj^YuVmvqVdEpaE>^pMNrtM-UClg-I+5Lknp;8bMOWt`HKgHRa6-!BY}+e^WN;PSZ59BD!@FRY@aNWmWRx z;F@nRrt@Ry6*0Ytw`Gbk9NewQZhq^VaTXFxA?F z5u%>tw*Udje_Do%oQ-HV3=i3ia|{gj=?2hCIi{Fin9G4#1MX-0bTNM^cX@=Sx_X5Lm=WJo8M?e<}S5C5_DW5bzw&%DfQc0DCWc zh&{}nVn1T}Q|tv60XEE@#d|EPX|QM-n?*I2q8clcDzHu(`L5a4D4==IS)%XC1nt=I z;x`d)HJuxhpj9$=TF9o=x#s-K{{@b-GRK27#V7x1icStPM}O}reC=Z6 zU%!ioe+kAH<_nUi!`QVLW=qzlE`670mNsry!WOP7<#(Ci^TI|#J> zPe5y0;#g{^EfC3`D@-*;RSTGH$D&6q7z>gAxNM>+m+tqHMM;ib2>8U;~(d ze@8e*n{)*wV>DL-XlYy&!-(MqlP#*50;)g*pUM2Y$cTlxoDp-tahmk61?8;zoCM`y zEi~&O!-{~Xj`)UIBbkU~6$z?XFV-`3tGf%$ViBtiqZkGRRt2S-$zLWFuuCf3RW(kyO;ZrV<+Iv1&+z*R&v|99*)ILA|pm)uH;FS$-1g)s_zBx6u3ZUr0wOj zU-WX?yc|xeAtxn&KqRy;CvvE#f5(U=(up7#&t6Uh2^AzpY(4vs?tP2q9R;%1d3v|) z?4XH=nsmg+u^eB>te}wtw*p5FF;g##%XX-U(JE-Ij}7UcH{_lxk8>j2e#$FW35!w!`xfk=V9a#!-bMJ5SAFGFcjonL^2m3U+DL#^4S<{j~$Akn8)L{#M*7p z#!^d)ms(M%4~JS(oCHN|bP7^}CN@OvDJE)9q23#t5v<;8RXG8hj(Wv!g)8gkYICDE z)*gTX`ldkkO#%9*07-g$8*p z)XB56u`mYD0!R#8TTD(zf81%Z1)$yRG6YjY zXaA?7MOs#6KPHusS6ow>{W>2RgE0 z!^FF9>3+x1dOpG9f7%T{q1w5FV|WL8SUsWsp81300`s|pXNi1Jfbn*t3hz|UdOz~^ zc-gS%v^d>%to1<-dD7{k( z=oQq>LR~Oa-@*G|>TVZV_s4v$Wq2r5rBWdNuZ;H+`sydTe~-?zs(YbQ^M)n^Ne{J8U*RCG|U19{C$8k1a>#VRd?ZDsBI!3N_xNex4gYqA5Wa zsTy?IiKI3c4vqN4c-Pgd2f2BhB#W{jGrStN@s=Pk&EH% z6s0&r$IhaYf9^5N!KJqQ*Pfeu-$YgJC|NSH^(Sonjwgn#99OxuyA|zTzHIQVuXg_o zGpV6HpRx&zEoR_@Jp^BlxxD0q9mE??EeV7IH5153PuK<7XBxqe6dU=O;&ptBC|0Ze z?fu;~-eKw(`xy5y?`&?iG+Ax3H@PQ!mvPIa1?n>Ue=_$1?|SHxc+Pw^GnJbvUu{~- zG;_`JQj_cnvVsj$NatlX8)uG9+L^W4sEy8OfZAsQ6y1dEq|^enJnPOJ!^uYhJxNQO zWKU1zqQI%NB^s+P#|oyP3Sof}vJP(IuJ{mBN*ZHGjExw!7)WL@aLb~*LI&e808ADV zO+sgMe*)C61cDT)s1;EsUX*wPI>94I<5v@^h=AcL>7B^jq#M6Mg`XH4_4&(lF-cvO zY{KGc)8+VOWQ7qUHH|5m!cCE`<*t=jBIZ#-^`v6cY}E?u(IzezauUUAwJAcW{V>-g zGxWi|zjzP2H-EPO!%WxHN7{BDIl8Ou2y(#0f6ePMzw18z*$prR&9A=l>g&IF<=6O= z+A=L{1Y?yQgy3703av4zebj;K7?o`Z9}c7ZaIvW{uhLbSHzaRmxIHZP_w)~p_KXh9 z6t6bT_RJ0}7MGY>)McI}fm7i(oaemf{BMNLJI{wc3ipKFg=|tyx@y?|>Tq_nI!pan zfB7sgqbfEF;|>zXG4Bpq6kzdPhETp7gz{w(D%j|Yo|U00r{%fwc9{)RvItY=X$$>D=1 zm_Au9Mh!6pR}3EJb~(u`_wj^{$w8R52m9Z;XwTWjYd_pP>tLDfp>-SnbJ70P0m0!P&>FO>3&`TI=Y>>`koF0&JK$V4se{3~- z6+4Ap$gW{|$tFsoWOmpjGhjrh(C!AZRMaj)u^{Y#4pi{XH3LZStKlmC=hm>SjQ&O1 zmctr&I*KooN;HEQpQBBVw~y%jE`!*4wdvyO^CT`Bw{o2^%QR45ZnMyw@21tTDR7*K z4Om)GPB49Qq=j5b!6VSf5KPr~f89T*rQzyp1`Qc9;2LL$jo-IwWdENeMl{S_-Tfxv z{tZ2!GEd?*EN4Sh-^$JbmX!v5#F9}`5GaZw}MCx)TyleB~2 zA{#7I^8L^s^`#x&>Pm8ZB_UfrueK%B#7EZ{@rB8qzA(AVM{O`Zf9l#IX9r6fZA4f1 zCLbJa6rv^gc~1rF&X&Lu@@n#!5+i?-0^~6z+DzaWc*f}Tqm3ngT9-(oqBWPz6#xU*R*O}?)-$9lO(%Vk2k`@lF3!XgO{T;bdeB*Bw1f! z6^#uedN#?-B0t%gygZsTmrnEv6>`qfxJ|XI4wc~x%;5l#ii7~<`ru8-iFYHG!T=~J zG@Ha?IRJ|ilFTRB0LWMKh}@^m-$gf6-6%=!*s%lT&~swre{AYK05$akK$xe*<9TH) zrQBtT&+m8TQ4a4Cawhh&8G#Vl3BnWcL>a27CbPSJBlimzlAcT*Gz~|rdpB>{P!s#! zOLt8e+^^)8DO;bNWjkzYZP~Ke?M?-5eEyEcmY24kc?S**E?M0?bYP)3Ryk_N_z@e6 z@{=PsU+0}Xe|vImVKC1jN2>;JnLX>?>5pM*747*OD&g(|9=M#^Ai|gF{K{o%GMSut z-Fsm^2bRe!QSoZJx=<7Y+kFr~lUargaH~?%Dr32TQLJhKD1hegV9@#$AqAL0n_!P1 z4wHt>6;=w{g?51jSU@}^92QOqX9b>43!u*raFLD!e}QC!(a0iA7uNxO#(=LVP7~3S zh!e#4t4pAoh%KB%i-8yReRAP9%sZH6cj=Cm^B3!BG(vYhVb`{*D)r@@bl<>}jGN~F zGYXmGtuiewg|gXfv&a%<-ZD>6psKPmrHgtoj~19x77t%hvvpVU3QPJTxL5EwxY}$s~A5^(7(<|LMGMYO_uXM+}9-;vHsdnk1dZous zov_(JR}baUo~%acaq8|^-Gk<#Mhg$oD9xnFe|tRelm~jo`)OtzQ6~Kt{Ai{BkpHm1 z$Ip^@EmTOQlbtt zX}s?;Q=aZ6`?lJs2@y0}uU-=#D4FrIs>N(IBVL;U6044^DFDo(EdYq(SW>b>OU1yl ze;h`B8#PEUikqis&|rk|X|XAZI8Au-P-@VZz)ZuIx2}0$f~s^Vw&jy1-8`VpN;JXvlkUMLv1vyfK*c<&v zvJ7)0`#hWoWRZt_Hu)?{Cw56Cb92yWe+t_18V-U2Tb)d}w%JxEx$VJfk!%oVRY&nJ z)PH4S#gjsjYEXnXRFanpV%5NnH+b*e^z}t$)gX*FR#P!3lHzh5sF6p45ppAJL^H)1 z(n7cpwTLa!2CyEkM;pZr(t5cKwxQk3USW^8Px>LaQ@TZd4BRh23yup<$}fXof5`8G zx8y&A-^*Wvi*hOc9N7!pauJBjwekdzmL)E2cUN;5jjN5-ib&=iPlR29?pB)q2q?cJ zZ9%8SpvFnuD)cDgIFmxcna?G0+u*;`$hD>axBQTixX|9+A`sJ(RllUv7#V$%>{_^V6B- zY`pu%>sCx%hxSmcv|_CMcZ`)PN@`eX?!`(H8}!__Qeg1GTr_i8p~ACBf8r5u#;swc zVw5#S6eiq!9*SO8JG2(~w7J|S`s!v`Z)a~8@3P!&J;j~kPYJJBC2QJU=Vu&}%j{Qc zV1H!?yjc-b_UY_QVWu*}atFLqzEe4lPMChB{Mz!W`Y!X9^t$;y^<&v?@69^1+pJ!* zYGj=e$V#)$WEt__&N^GjfAfr%cg9OJ^UP{hN#dE+YF4vZXR6FwkyTb-0xwBOjb-!B zUNS>-EI0LxS83{*Ji!j_qs-Tv3S{d%Ub;Rl4fE1r7dCRdQ>n0H~lEv zmQH;wCyEOg71WQ_i(TK!GAm0q>A29OuZ%*H%xGp=r?$mE0?jt7f7g9y9Tsn19ZdjJ z^6E?lo;n8qk^Li)I+Z39yXs&;q)ti)v-9Z9qy{wV=At;2HqquID2_Y#@`;Kdtnv`_ zswJK+CIPMR#>`#6d!Q^>8aw)S<`%gB+`IiVe?&zv^W}*0Ayr>zOx>@+(K9nmgdavS zlbF9?ob#h!P`wNHf0_}Ik&U1=jFbjoWsL+~yJ2`D)+PO{*#J!0>$8R@127u^VN=gt z?yS+6ST0)U$xbVyFhQTy&MUklZMTM%v?;8kw=b3SpYwZ9`+X|;p-L;2YXe8EL1-oI z-WsecayD9@keReOjd3VkR9>x;jbM`OZnM{(P!gtuxv#0Of4RnTmrW_M7db|{XWC~v zX1ZGJEshq~Mt+@nqivIOlWUiGpY4GCfMc)oPWfTwXX-Pylg>ZMe{lZY+^v4;>_=#-wKkyy8346bt4X!l?UXT4feDh&9OgkNA?qN$T2G{ z0K)<@IYrwn9X6GlCYYFsrXHG%Ipk={idzUZbOgd%un>ovu$xS|kFlRj0q0dOp7)W} z?z;S5wTnU+^SXM6f|%=0CSyTQvmA5SGG)wRZ*K2()B|V=)vJ7F;Sft9?^TDy& zI=P^>&VtFrQ?5FjK7GqfB2AF#BX#`Gp|n_L^pQCh)ACZE)hf%hH7TXlY=H?aTC0{M zkQr2$EPYm3u+2H3w0@+=7Uz`AvKP-K3-Xh{@5n4294+6{Se?1<5w$29SYpj%i@NVx zyJO2bf3)Q5Up+Bo<`gnYUc#GAc$6?;Go3{p5q8Fr09Cps5cdG}sDdzc=b!J$PSR@D zCS17CI~}NDl}T%>4(3rS>jSLDhjgh53(KF-shJ246C+EGAM~XT8t8%R^fCJ=?Bw?0 zI`yGeCkw**LOo>a!7J=Lf2V8>q{w_b_$f!ge|D1kM(0H)p(7uE$UgefN8~9>&^h=% z_bQM;D}9PeGE^D-Cy<2>7zvz!`A0=8ES*3Pq^*J=LQ$%L_!Z1rdHT~ZrLD#KxxV5l z3C^q6=ZL0!GVnBhNq$-q(wM44C_pk-pRFoY)vKEeYVudt?#SsK=4&b`b@o`(hJTjk|4n!jv|4 zpYmd{-{uFJvOH6_PY0edoBgt%w966Me@4IOe5J8?6-K*g?KfB6!+IAlL|i_;xB-R( zvEf6940hd-cX0O|Hx1}>Xi6cx0iCO>YkWOaoGc%dx=LNqvToYcG5uNxMmGZ3a}vhj z!|)B<%id=JLVpDieFgx!@FWLQ>Up}jD~!}c;KLa^{0odd4zzo?z<+)Z7x?O4e{Npy zJy_}dC-;2Z`yP-v35WOIBmNie5y3xBiaGbF|Al*0@Yj>7c8>}cf?4disZ(dq*s!Hv{mL~(rE?cV$Bs0KL(?n} zaS4W_^`+5hX+1L|SY3{FE^l!Bf9Q3qS6{nu_>k*2^{rgK*zTU(i1_}48gVJOW>&~Q zYt!Ocvlee+78b~slCrXR!9tMw;B;N;^x4yNDxg$KJ&Q$Dj5!!OO~BkgdL2w@zv^q+ z_20PoTi4?ja26KSR996d^k0Ym>(PIW^TIdw;eT@eoBOeEJl}X9^JaNtwb z6;%~c0%d9|@xPx|Ra8`=$zlbAN417v%d#Ad*x(ow^GUWWL zz!;P{4Hm;HW(gJ|0wDhwe<(Kb#ZL8Sm?X%+i?=LDb-mvOQ(Yer6eFw2g>BWfeXGJu zwYEf8Cs_JviWCj20C8gF3LJ(BK1~SSCH18;se>ebAr_XhES2lHG zdYS61YC2ul)YRRHyT7)^SVGao*qEW29q_hIix#zivgPj0@ZF4O>D`crLgq^VGiUKP zS1>a{2+U09$6bA0NL4+>g3V+v#^N(5h5~?QtOY?V8spb?*qu(sM%u)JHK%#Fp-7t$ z!&(=`NgJ8;GW9`MeJePcK^oVsjBINh7Z4K z0{l&8U%`Z#EAPE_*0vSnrow^tmRRx7L6g!xxN+l;YT8$989ThHA8xVNam`b>#oTy2 zk55}Ywqh=b>kF0QAb=rU*R)08gm&SOfH2n(7~eCvzE)D}eQdkDs=}R1oDRgZ?9nP2wy9)E2fXcdvc^J!RWAjF~)r%C^iaaL|e| zgEDLP44QOs4|+lv_nYB^hHh9pawuE|zdxudv#f3S;GKZU{07%JiEHcvg_!<~OuMj_ zhl<^9XK}Pde=H6LO~oY`(@5u*m4)M^x+)0c>awa)U2WwvTG0>4)3%aom!h~sLAB)9k>CCt47T}@RK={Hf@|d_sNYFg+)b$RjGn_@V18HRC!7IRwSod zpHEaSYVA{eu(hFY^}yBNe_^2~kg5oJy@AZWZF!OUe?bKyk`qB@rSq@@fdlu#$aLuv zJDg>QOH6Q<2`&)fH2fbmBgD0~d!WY?$!iT`anTu)&HfNL!DwzOvbAMv*rfgh(Aj*7ue z?tN~w&jmNSV6zQ2+TdOb++cyDL^zU#1&N}ff4tUxJRHDp=20=$?xCWTypn)-Cmv0l zOfahwI}&JOVr~KrNx-5+zXVD^d#l4S0Yd2D3lesFLJfIO;x+&H>8USC<_Ab3%c*~|`Lt8i;uz=(9fEGR72!hgNivde-NV$q6c7n|Tn zOjbnP_(v38!d=k;SrfA0Zoo9Hv!M#(e?jVWC8lVnJJrt0O4=iZ`r5D&TOnizywuUX z5*_~jOPSqVCYIR@cRj@1bg30B@4glH&cMty)s-R zZ;;U_8IG1_NsA?BxB!PSa2AAt0M}}_D$>lMbJTAr>e>{nv z0e+_Bs5K;7j8%eC8s+P%#Df!)J}RFQiB6+`*?&+AG601I(L~NFr5a6y$+q@mP|f`L zqhpziu4mo1FW>j*x;1mY-gV2VX0FT%JZjD$3cv`~>RBZN82uoXDXUM{NL!#M0zpAd+ zD#-w@tfWI2qham`U-so>9$qawD?;;63k#49=8SCU-TX<%rLSIpBl9-qe>dR4PrMx! zzufyvIDG3}ckNvN*rVv;i6s@E-f{*H zNYIGeBY@k(4GKURcsRX!K^dHe|CcnEpe03cRuNnhg|nh?egSL_!6iYs*b8^L;2Ia) z?SShYaI?B!MVrj~%xI&$e^*9r5U#^a1z4P|em`newuT8C2XrtfMY*5+ij#Sm+2vWp}NiJS(?C4-Cz9hrZB zCc}3?Cmqnd-pdlY}>zJ+oOlK?tJiJ#y2DLyJs^Hf4s2&jEBAIll$KN z=-%IsyK2Y01#P=#FWc4~cyQ;=hacO#?XjL7x{9)mJB4^m#{u3SfQRsO?i7}nojtSZ z5q%wbe1(hdSK|F5?j+v#c!BD@*Vbc;Iu9eSI}kd_DjOeOTOcj$6jP zfuA!1Y)+5cKMZafe+FBI!saw=Ov8o!;q+p7T@jpC1V@D6&^$QW2a8n*O2cjzhDX2= zBP^rB@knG~+!6^_h1~8Tfl!m5LlGu!@ERh?ax-)Q|vVLYC&Fb1a~ z3!hW!h-sohA8k%&h=G_wS{Rp;%o{lf)o{x`uzJO!*&FU^f8O})4MXd0{O!F@zg-fV zbkmAC2d*7pJ>{JFz1I)?=&c=nImsUA0nwIi2S?4neq=B{>G~O0|I4mP1x@|p;~NqK zmi=Jfto9WXe1VkO^u0y3g=5xE_O5tzb^qZvzkO@w*NbjnF=5C+^uEdG^C{N4v9rqS zt{DJ#K#0E@t8Tva8h?HE@D;cPLs*-+H@$3k94?4KA?Asp#Rag@2L&H&^uiHd7`Lsn z?Y1%d%y6>_wuo@C0BabSU|?Sa4~F3Nco2l(><}Ckf|#Yd;vlSsQ8-+j?Vu+muMu^wd zg18moRrmaS^?lt>G|hSZi@R?5le=dZi;A$Rias_BDc>F@u&Zx)4)-j@;i}e^2&13VYA9qmzv{OkaEFtU~-r!I`UejU2ak z^~^jm(Y$g0xaB8q9DNF(pRxANnT6l+nfb$3OuTC8*dpz7b1xt(B48{ftNsK*-*oF+?FEfm(yxIwW6Y7c^lJ+Bv1)_Yl+8IvdZFlr zV^VnTrh~W_+9z@+FCE`=ay5DXA}0LR@V6?br*S|0M+Y;5^aG)5za+U$Aer_k0u}<9 za9C=Wki<$ML6n&gnT)Z!6aU9}-F>c8J=a-Lj(@o`X~0MguD}3v;QaaSHJ^OKoqYW3 z`yYRty$0y(cFiSoV1ixgiC>HG6B!?Yg9t(}k#zeog1 zpiEHaD6Hb*!$G?$xPuI@;Lo5W82>kf`+usGis^6`KO?v&iA7bTx>(Vws;PpclMR%_ zoz8stFk5l!qUIm3A3S*NkDH%ez;`lC)0}9kH|x0$bSjk?n$wwK;&u1tpULaI;mC zc3ai`S|u?w(5Z@RJ$iFtO?4pWEPpPv7rDJfR|V%Zr-TmJC(*Ca#xaLPv7&MP2$rNC zVYwTi2Cfgr^@6mj$YP9Rk%E#uC-Ss^I!_ZMKi!GNYfZGSA=cq4S0UVSSM7 zzHC!yUkJ^_%&`>!OKW=+Mx)hbtzj?p7KeB&Z{&v@SO5eKx;&g!XDd@(L>bFvhma^* zefw5@L%*%9Wxk2~tM)BC&{XFryKBMRdzRM^-t^ODYmZ+)r0?n{w|~qYHK=7=Y3cZu zfmbb`kSv?Hj5~R7@!jj^RhA7Ivi>Iv7CyOS^q8Ao+1~u(tLL`Q{py8O|AY9AB}zT78B3I7sYHqYv8&isSY~yB$J5tXEe_e~Vps>;kG~Ul zBL-p|@8tMV9PGzIfq#P>=UC`~3CDB?av)KX1t`N95S;i4V3Q2%~LXGkQYuc$qtUy=|d+TOPUhciCfHtCmi#vlC*$$VMr36Fmx> z)HbrXw9O8QJ`f?xJ{Q6&2UEr*FozQucGc;v8FkIi;m=N?1V(a3xpvf$e<`^+A356hx9HtcV{iNGh@++%>K0B18{!96Pm>HPMtIl4~4d zDE5*ihv_=Rv41K9eX)LSfDxv4;Ov2+^tzuc%2dK%z5KE#HN5-JUDdOPB@#nsR$YYl zaSI3f0z;Nf>H%o3+HZ7Y+4QXwdGw9LFMIjA@S0gKq?(i3@)S5SF?Nm z!fwR~5Ct33BgPcK+I(2+gQLxGqzGpUaI^rYF>pGj>3>m|3q;$ahoXn0Ohpues2UAN znP@Z~jONP_qXvk&aEW+=R@|9KBSB8lKRj#3)W&hsH?>;Wt1eK1N{Abymf$hF)j#9< zA2+wXwtvL5+s|xX@PpOky~jp;G;8l{EFJHhu=9a1TruP3=DySJdB1Jn+us{kK4bHk z$XorF{eN)&nx8DK-oFiFGU>^^xF{Y-Eu53fRyjjGnL6#NMMg}5dP7?)0nqQbIi1%Fm35GX3fAx2T4nU`V!hOsyxBqa%Q zNkq^{PQol2bs0EBnz9NvEvEfgmL*fV(?7QG(pqLY7D?K=H=@_sRfjUK9LhXs^z{kc z*Ad*;qjvjX%m>@BI^)>wKzmf!Y=%?Ju%A3qMx$6bfQ4%z%+Gh{S)x{JBnI-rdFi}E zd4Fu4J4V(xvRFgONF-njVl+=42?P;H<*G1Uz0Bz{89K&CjIItlgm@&|(Zs?YVNZOT z`BU46hh|Lv!SCAP?Trr)&iteKu7y?o7TrGQHnrrh=RjW@h=&-BdCqOT2F z^`kk9?pt2heDXn~b!X7lEl=B(n1m2#7Jr!-CngbMWq}yRAWJArL#Lg#qt=X_nsG8h zMUIHAik)$y`^d?YX#5EzcYlt1vJU=IdpewqpUwb(T4Hb~oyDERP*W#i|B#{ynb8hT zK8Z<+UY}jGKAY101uUP-488@E3nu`WV8{%nf&j>(B*kRLDKnV&$zdYol3D{U%zq({ zfwbO74bs@qY13&)RZ5pqNd`HVl)Nc>ow~Kn(#dwVab8uIq#%|IplApM0vi=L3^$G0 ztZ@@Fw~vDxF-x(Iw4$}R`4FpGIaXj?F@!w45F_!DNMf8M$)N=E3@GY6qpDLgoKbnm z?jaW2CN(QwHf49c*?mn+gSZeoD0I6$Reed20+)K6&pft2^EmrB&)2Hk^N5J^DcJ=c%-xm#1r|;lUvg)8{A%MdDw_JuV7P5sS%6OqHM{ znUT@E2M}C>HY0=tVlq#gc8YL;xCYZ94NWVXn&`&(EIg#zRE^yk)u&ajA{JbB>T})4 z*uy_VquC?OtV<8!-gtI}Ue;;l3c;>xTX9qwQ#n3HCR^ zAtLN6!dd|iMX&}zE((0AFYIG{zT(1YK5;SxWhE5+pEwybTK+9h1D3{e#zMO9)Su|-LUP&mj0 zgK~jajA;Yi<#c+Jf*^&H3MEbwB~FxzY7En;VkH@Ib#`60DPsyL#?mVDg3IlJ+L~X5 z5%%TtZ^Z^SjIOx8%wbsDcYj3EmQmSN;Zf^n+;E?p zt+*SGZ(J~e#?*|)nBv2jG5|c2UbC(auI&dmrS_%J#*)1yXhRI{jl!K_*c^sa!*F*# z+~|iJd~l%(r>Ss1f@aYkO$>+vu(T9jT?$JG`oU}6 zB-|iEJu?yJ51Gv;GTWHvnAb0*nAZ=HXWW8&X*_;LKA4s6JJa9dN7G%`xzK(YVj)|z z2(@u=Eq@1hv2Yy=u^OqhaYWTeLr5jW+#3{VJ6C<@NQO=ei<^zrG)Gp~9NFE9Q?Wt(@GlVsR4P+PyM4bBB6Fp!!^sVdNG#G%|UcejozjbxUQDlBVjRGyuisdy{J$%*=qP`l(K}A+rTdMR}PM!GAKlxdG1T{y6u0EucOf;$s{uv(OR?gTr{- zLfx(-LzZDI6m=PD{jgKtO!v7aGCP2-&BZQhz*< zk}z3=uP*4hfcBt&hl05uoYu1&NJsI77_n<=$g`Hn}$>IS)~I(pnuZS+TG|?bbvdp-HooLcRQHud-2&l^ep~X{j8il z>%nJl=AO~&j3#O=fpYKNNzdXs<9l(PEl96(2|l-tJ{Q*tpQE*68Ld|IU*BxG>z|ZU z;1v8DI>@}qyvg?P)xuI?spR`+k+&&_O`FYANwF-%y4Rc5H*J2~X2)=6lYgt;)$Qu` ztntn9b^A{RE(I>-y^$ZuDMRvyMB)Y46h0HZ7_W)fB=!}x7e8G5aB^&^uZ&9t%STjP zTXAhATYYs+zrF)%ch~OjcdGxC|L4jNv*px(wG2=Pv|lM#%9Zl}YfXk8L?%{Xg@{8e@MzAAp9Py8lEh8Tv*?%>%YgE&y1EYS7 z%carb(RYphbj*}7Kg6Yb?Biq4j!TZ)J8tiII6nRVOPT)va9KEh&G;K|xn=yl;~&T6 zIb2TT^8SCb^4a(=$A39Nx>Bx`E9FYLQvO#8p!3wgYw)%oI0ZP+4j2&aIf%ElJ@4Ud zJ>EKjvu6>A0tO$C;(y}=uA|#}x}AxyiGta9o5I(0khzcW@f5u#MXyQWvmKxcpM4K+ zZJ96dHj0ne(6`j!E6J9;tCn6<3v4}kcuTIS1(o#3Pq$yC3Q>I zQrLlEdvX|sojKRL=r?MxJLkBM-aDPb0s1cOnRz+ahIIsdN$A4?UMzE3|xeD*C#xU8=!^d0b z6=nF$V1KX_moS)&k6nlFUjtg{UNin}##gVy+XeJWGcF_X-nIB>Ggyz0OrTF+j^As% zXDojDM*Qrx_&H(x+!gqlEnq%|=VN#!KDRpio^ZDI<(T4xK|H%x3rcAn=HVx-#Mg%L zd*|WzkY~&XOZ00;+zNx~mD(2>Uonr? ziGN_g0{TW$=Oy&(7XE+2o^M{+|FX9d9J&s-$5Q&9Fet*;x6m(Gk!`nP&`8^=HTyk% z@pJ1izw3R{I9#*;vv@Akzbm-@-v!sdjR(EGG?Ze(dVKA2+#aMK7vj>Qe^VdY_A79G zTId_b(=&_k5z?Biv~MO-Oj=FPw9qj$1%GdQzn!#M1;yFQ@4#^K-D`1OR?@H3zIP$5 z?;6^FGie)#>1f3BE1P8V z5CX=4fQXnPj}Q_JfrbzsMI<4?1Va)-2oEVDBE^V^6e-P@Qc6?GH(!dBFXfB;^M9ih zDe|R!DJoKmh=>$1BBh8F5wrhu&Yewmmw>#KhndZpIWu>jXU_S|%)K|ekOTWvNc}6I zeC1;PlgQ3Xshx7_wOV$ZsHITE^Qi7}8o@-!RY}*dR6g~?H=n_CQz=TQno@B|%J`-+ zBsImGb>mX$lvBI_%8Y|}lF$>hM}M{5q^5R)N1)Ew6q3_8vYeJ=HbsoIm~5(qtjA~R z!Lr9PCB!8{{tf}U+H&n`AFfxn{+8g=&kE9gpT7BYzoilQTEDbk5Buo=jzk?xCAH_n z#tO2YX{0~+{imgb7v)P`N-N>}^$(#i{jRPJhI^E9t0; z+NEMI(pTimPoR*CUs%_THSpOgc&I*Dc`kN5(i2bUsRuq7lC zvg0^=!WpU)T}h@ko+R8Vq*={_G?dU2ki&Palc@9YAe8JNthX60CN)XS*PCluhprO$ zJ?@}7GJSP;qMEdM0;H+)7qB{_MXNfK={x zbLkkbP#^P<##hpMs^)GP-I9XP%_sZd(kL|*PyNU3>sLj<&Q2Xe^Gf8KL*ysYic<`I z^~DSQGz4)=ouNrkTk{I5_Bx;XQYcoc$xUp=ne*k-d_CP0pHerreN74TR^{sJ0- zZ^i2wfZ};jV;Lb%%lm6}|L0p}n&nf}v`(~yDS@RX5mu;kl`qEK@|v4>nHjBU8vP{F z(o(8jwIX%p^S}sR9?y z53uEAF;+Dn$|qM`!8yYIWx}UC~HM`SpWv2=pB59{^XeH0H^qSyXfOrSdpN z9Bn4Wnn$J1R6iOGN)=_03j83T0Zp>YCSUDKwqI?5vVR*+*PC;x)#ijR(q~s zBWf+a>%+uMUn&=rdLNPr_G@TU%a^MeZ1X=oT{_?YpeLuO&@-s4w5)Pkd7-CYSw(qS zMP6lbS$}D=r%y?VC%gEGqRL60?7~Tf6;*`=$sSowFU+qfoZ=Z=URaugWis=ol})bn zl$1SDJkB$&tbAGpmhoWqox6J4Venv*Cp)jCyvUQDS30h2+>?+xu&k)mlRmj%61J36 zR6NO3;$P4BvIyTSmF$tULp8QY` z%6~K{r>Q0qTxvz$l;YASJcGxNhu(Sa^JJIh7ngdnipLd|mE=uI@(jtVtSBB=oaY&u zM`N7ix&NUaU7A|(OqyI?UQ!IB8(&shnd})^HrX>VZ<=Q^jI$CYipieJGS9e*!o14D zBu_!{q;imQk|(dUz*AmP3|GfNmO=>gCVzR#3o9lTS5`uG`O`?6KABa*1rU9Oj~S0G zBw4l4+jA z;tuNE`DKS1uGCv~s!^U5g_BTjI8DtBVDYB99wrGS7DFqQg%fd3D~h4jg0d;4C4Xgk z1%cAbQ$+93CJVk{i<$)3f^C_Jsvg3q6g&?1z;{0OhbFwU> zVvR2=DJdfr5TZ`<^1_1RyyUWqCpuxQ z6XbkcD1HZ+UQ&xm*fFf8WlL?z!hhZtIWjTFJ1FJ}WiTcbO<`4G30NPAJJ6O84417`{AT-o~b1kIQVpmmzhbC2{5t61(Oerdxc!e>d8BDGy zh0YXG1qEdQyVREnh2tuH3V+tD$DsTL#bkIrRTa<6FRLo_TNMER&}67TXk_Khnj$Vu zD$0XVKUBv z$rv;wGowGGWn}fs9G04qHNevs%4H3P#U}$S5h~3Y?7;>_RT=$@BA%h?eSb1Dsi{80p!eC-zkY*obI22&+aE~~#<3yRtkFn=SE1>?hp_HXV>YX3f& zP}fi_?4LPVhOJE*9h30LQcA~>d^Syz;m|Pw;-Aog$#;FIIN}u0v7|s#qxrq&|7rdR z^txuVW=+7upl|B|RO{{b*4yo^x7%<1?RNE%Y3nWbJM)&iI(x0R-CJ+Fx88Pdz3m>1 z=B>Bh18=?iq<_EvMr-fa zKB^s{{Q>w7LGC<2KisRUm{laLlYXUPgrRuGt)Q2|unymQocrIn(eOUIYAp@c#gQ8D9qcFZgocf5}e+|1W+X_%Ai#OwyP&W~R|tG-<#O z&^!u!re-Ga&uE@uTr*2^7WgkT7lHp;(+Ip*<7FBx(@tWNwo+RO{ABGk;HPV+1OK%4 z72p?Xe}4-6V(nt!U)8<}{1ROkCh5BBx-pIJ0o{YZ_s~5Ie2PAmN&5bJXjh-99|U}s zekkxc`eDH5>W2eALO%ldk@_D2KU!Z2{AB%P;H&ggfS;;=o^kzL{ZD|Or+)$X>X2F{ zh5RPuH%t?%#s7{I;;|!2dbyFTn2(`#;9R z_Jn-`d_&l0kbWxcbKuX0odf>gVgCmHd>BYR?8~qVz<&jkr!h!|H<)DDZg>;;orW{O ze}8T`%edhS*~BC{Ty`>z?2>bVA1;pp{&5A`RkkVH7+2mfI+$d18eRgLi1_@__Jaa-})wf;>YgiU>-qVP#pT~wG~!IqWeRhF{V%+0iEeX?P5KPYpghjkm8 zmFi)=hh?WCXyZ51YM2h}*d=&9GvTis5+4Fq?iPF~GqWhcw_z3*O)|x}mU?1kF@7l$ z3u6%gZ@v_X*`QvYnUn5e(K*?VdVc_z)tnqqz|LYtOat)eU~wX*rEi>%X9?rVCzZ2< zn-$j>3ag#0<=SChYx{3YZs!^e5jO7ho{zlHqW>)S|Jj_zq z4=z*d)uwU$Z=|aVO<*zK6n{P^g-Q-7QR*ROOZifTG+SCEt(4YF+oZRpqtY49xtYiD zF1#<#=J~J|zO8Ai>8qKpS+6;wRkSJE34mSI+8XT^?H=t#-I3!)C)S!$CuX;eUeM7SOq)jK8Ei zN}eF&569NXb@FC;mwZrekS{206_?Uc>8T7S-Ei8fBVbnr^B#)tKr`n@zh+ z2O0h^ltjcCGh$p4aeqLK4>ktI&-J1>hnX>}-Vi9f-;XV5guqUcY_*E zYb!!Aj%fn}EPqIvmLC|O&I0XZmW$#Vz&$HqzM3{rgwsX1F0hVShbbP^quFCbSSiA- zYWSQ&xgCJcz2MN31qa+QY&;x2s@P06mo0!3$8xrctz{e87Pf=!Vf)!(cAT9Or4vOs zM1-Xx6!ZL?nCCg&L@4?`XSEtWFUI-&1QBjg!?{)wihuOEqQ0NFL?}k_lbvcfPw3@5 zkv?y?8onUxLL>LT@&`bq<(Y*C}=LG>avd{J1)izn1@zL3EDjcWK(PZ5e9 zza%VvL4U3Yg`T}^5@EFn#mE+>icm=Gl_E7~ zOgH>ra9E#m*l0Mcmxw%TM0ipSSBqI(Eu`_E0%z+)KkEd}*Bw&B{}OurUl-JHP4AX$ zc8%!u8eyxy6IS-Sqm=t$HiOM!^VwpyjMcI=Yy+!j+u3fmj~!yi*hzMlU6izvL9$A2 zDStsqlDbJLQmT|GBps7ZN@t~u zT+0pI%H2GHC-H7Pg{SgN(Ff7+k1TJk9 zdip;CDL0u#xIhhG7kd4=(2UJOHveCe2!93A)QkH6pRmg{88A^R)IuY#R~YR zWDyEY+9t-aZI2qhAvANlM}z`N{w&gW2)o%K`uAqJ8txQ`wNs@3ujuzKG0t5=K7SGR zwOcDfffN5H?0S#T);)XG@UH?t{<>BT_X@k-E0FmuQQzBLM7UoK-fv<-bQyx9+NL_&M9pUsLBz0J5;9()555(H=fxwUtgv37B(UL8GAW9t(rH+VF zM-~Rk;mD@IJ|8*SQf)`YEFaAmp?|=wj}iiB;Uj;k!{?*gZ-}o9+;@Id7ZhI`6yFdO z-y9U*8Wi6V6yF&X-xUau6z?7sPYH_m3X1m*iuVnQrv}B-f`8)aLGgh> z@ywujR#1FMP&_**o)Z)w6%-#E6dxaGAIC}p@t27h{wxc6?bmY3=C9@cXsb+x+N*Li!~ggS~?tGgzL)^$l* z5qvhZEK9V(KnuK6W$r&p@46ePC#s2incely`xsDVQ|!8J*1MsFv?BF$b!F~UY5R}z z`fNwFzsB>;HL|u1ze3n z4tH(r4s_n5@Ocl%fMfJ-Zc5*LgY~A8>^20huB6+|d*uzyQe=0m^R2Dk15GK5Zm`Ce z)!jdQ{NzH?YSzN0^MUsiyJH+Vq3J#Bd+lyWn=;w=+O?i#uit$iPGYU@=DC}7FQC<_&imG- zT&weU-UC$mDWAV^*OZUR(Eag#-CSwf8F=v$->QX-`YL*7=L!NU9C42KbO1gUEMs^UEpH{YxKZk_kt;FU_G z)2XNV%oFt9<9~ZCrQR9`BfvA7Z+CE8oYHRp{Rz5Txxe$i1fMj)V_4^R(x(4Kz^78; zdXae7C3tT0eKmad4thuT)X|6j4q>;2!zWI6%2TIndro%aPql?^eGl>OX1x)h;zbMT zF9gc&_I0;zt?>TI`?B|A@5jV{+`{#b{kgzcOX=Ue^MC&7noE4!dRNq{ch~N`??G?w z>U&V)z0V8mrn@WukH+ohZj-(6_vSxK#oO00s(=0W-svuJj9L@bQt!7ney^#8EN_;2 zo}|6;1Ql()LtvemKxJa^`mJyQ{~Ph%)!lRV*(~npZ{$tvOU@PbEuSlpzwEhU+V}Td z;a%@tuYZOuT?>f)z2zJ&mHcj;ciwfBxk)?v*7NL*IqwvbNS${|i`P_Sts`t)-W+Sr zp;D{+X4jJ4et+HdoymOstv-|8TIc=H`yqwzwRG*WW#01s)t3Wee`ViG=lx&xIcrN# zTbt7YulmZgbnW}+uIJfytGgb(YmQ^s`hLLO>wmoOw2-F1#yX~`JF%APx_eyne^mJP zp3UQJeP{ei&U?&HQtxw+6$y(htJCfcfH?6j@?5=d)uB2(CdzWI9xAvyA zahIM!zYE#jway-3oA;sT{Y1QRb{}hXS9Hy5DRSyM>r1;iJB*wEf2H7336bxk-hKi! z)_=Q-`af3m+Wt)yU^%~B*P$oS<~vR6LaO?{AeKn_R^(m8h^;;B^4{0`XTO@(`Sl^HLd?@&gi=UUlGq5BX5;=B|aJ)+_YlHgY$j)87^@-6`jHu~w+qVsFwSHEdczFTG3eliLl; z?~dNz`Oc2C!qV#MzXE^jtzYF@aXUKyJqklD_^wgrE;?5P&Ga|!j;|ueb-0^*AAjY$ zasj<=mdm9Qvip&*#7&dq?Jhgo83$ns#cPA_Y6Px(myYR1M(KUuZ~t3Mz519WSKEAl z1zqEh)t+4a8vL!CVtsYPj+fSlm(UkyGF&ah9@+0iJ~r_G>L_hh3pKuT?R#18{$?G6 z{#@o>)a~YcT1RJBwa@gOG9b%(?|)`> z9au=M&&~qxp;4%6C0cYX$O-QfyhQg`YO$Q~#p%^=^w)Eq{nqc_-F)Zkp?_cBUlMbr zTJU9ddN=oc?tfyznPGR3^C6v2CQUQ`4SVFKGuaJm#-(#{XFZR;OmDyYef=GEALWYf zYWBK!z&)t%{u$$UbKmhhc|Lp7pKbf@xWit~x2ATb^jdn>^T~IE+jr{oS&-bv&CeQ| zQiZJq-TAirmAdSn={lZQTz}=6?Dlf>R7dQK#r->V2V8rJG;0H6H*>#vXUgtcT}u+9 z=d+C6>`8G+e=~*{E|7Oj1>E96+ zrtYl2wR>*Y`h50QyFg6~JV~^SMt9!5-rK=l-TN!wC+GhJvPld5R)1mfPQ^Q|?*+Hu zuJT!r`ZiUo^LIYI^MCdd_*7Cn(XDS?VT0U#P1@A-M64-PQ|tkn*@|~p=K|!^s&$vT zfai}b?>|~~?TSvUvn|{y_90=b-d)ZGzRBu;Pcm3`t$X7Zo&8GjoBdA3rS4jv&)#a+ zq-nSVZhGsp`33W}970cjqo$ zEBx*nw8~C6zqR#}ce?z}6rZ&2@2=!7Cp*^azR_Lbox9e(@pZbUUo>m|mZZx#Kr?&r zePgi#2fY#BYQ@1W=s&yO@#o3^4$frPvA=6|!inDzz4~_-$A607;%nUj+$49UUyu2I z{pQTo|DH(eFOM`k?@{uv`ZpfE+tm`^H|KrXTXbW;!E&em4y1Rk-|xK7y@7h7zMC?) zhYS2B;_LZ_Sy6JsjeZ;c&H6U|@7mq0-%xEl|J{_iJ)Cz&Ky2o9*Q0({Zq&7F50<$z zbqdkKo&;IEZ|6yCd@GI!>$2GciKH_Pt2-}o2b zg@69?zp{Hdhh?t4)a~GIp5EQ?ZzkWN|K;M{gXbY{CGpq!Tkqf3J<5$cJXhRc4R^`! z%lm%oNIjij{iv?z_fo!v-#5R7?#@K++r!;nzg2#xxqoZ_Z8z0j&u?sf8^6nS>)iFD zb}QZm{Z7<1IQ4g;uFYYYTlf1qH{1DsuZQ^W%`dFo92fixuvfoUG~ZRYhSsj5%7;W?)&)!`i9+-%U`=B@ z|9%wuu9oKS_L?C6lfHGGZP9uA2E-1qR(JKz9#xm9l!CGwYsZychC1Oeh1F`tAPJLc!z!ohrT5VPZ>Azz1qGqcdzp{_+hp9e><}8H^GC}iW}WA->o}t|Gn3p_Wj1U-d)}I8>{y|ugwPU`g@-# zB7dBJnd_2dU>YVfD@$M3aN?&otC4a8tAv~0~;cdBr%iPHA+{q)ko5yeukL3xx z9q+*JRJ|$V{q};D`Rk|q;DBYC@m4}p`%EL;E z@&l!p@`%z~>8A`(GL(VJqe`YSNXb$LE7{6WWtfty3|B@fPbfu7u`)qEK_6KNlBYYx2=QcAN=-qbME$)C%IOyL_@Q=X90ebieT>TV2 zPS8ir!a*ms;LDQCT%emq@PEUlaOMCVb+Sm%(@2K88pGV6ud(3YE8WYYKyQ;+H0bVq zEC%$q6Z3!$cVV%h$6bM6A}xVBUzc8o+TM`ffEwPE-ehs0+i$UW(C>Gc4Rm}zgB|>vC4Yh~e91aUUrArF zj$jjv-3vpJSQ6NVj@<|L5yFzeMnYL9u#+~dGuTR7c0bsQfpr0!ky#?xjgfT)+p)85 zU_Vaw0N79@>kfA0W)Ffb#jqY=PacLg70Vt1yGmd^!M55#N(bHn{CoMm;3x4U_AuC5 zGD`t_>%@KlHg`Yk1%GzejXeUk_WG+#P4SNP~ z=`|?(hWrMkY?pTc52yq+9F>oq<$rTf&({iLKL%{lu$h2OA#4iZ zQ(N{dV3dK)2Aqw5_=Kw?mjjjFfWLAZZp` z2534M>d98J!5^v&g+2^ZhJg?03N?&WMzUW3#(zG=CIhC!<^#}PWm6AH%@swNPsCJ>(9LwMRwN|urV=@3;DrOr}k zK)U;-`ymApwj&|zy@a7ER>l)bCQ0X|^XxuC#$-aqPK1e_2@~%j9K4@!P({G5gn-?+ ziJJiX!g)CBz|GtY2x#FJKtL*RHivRU2&KBDKdgq}~!Z_2wMEK1)B8Me1|)!&$6; zr2a=NK5TW^Yph+^R|dwC<>B%e*3B4aY{ycJj~E|eeT;jJ@3OweL&gS{Zqk~xY`E!Z z)6;B(=~dIKfTh^#Kly2BHAa6E$GE1wraRMXp4FUXHeI4FiB;=T^bfO_^}Y1{q?h%h z^-oBz>WlTo(y#PS>Pw`R`U?FdsW$BQVVk5?u(>Of)+!$u9o%hfZ-jk}ah36}ywp@= zdXg_SO*BpC%S=1)%>bGW zW#&P+0BEtG8WFA#v_&OgGFj%r(q6EHW&Ga5;pvhB~5khK+`L!#2ZC$hQab?K2!CS_k>+4U3=; zN06Wo$B9lF&KS-c8fC5AmdIo{NMr*Z$qhVEbARPHqULxalAM2Ra1nI_9;v6?nwxAL67@`70u3R8bXo{CZyd2_Hz$49&XA}A2^MFUfGxe3IMqU93y+&RS^=$&$ z0`ct--v#_$p#Ab8qN6ar6Y?oIZC^lAnBkzJmrubC)=cCuy#aadS$n7E|s^TPNV~Z4jW39V}|KUgWQ(rG}MK3 z4tS)CzypO{G;$ZL|x=Wq8`8_ z^#UHKSyzmyKm+~aLy(NQkTyIP$d$iO(&Wq_eO%Wxk$$O5Jy^M zTuQXuSW8rA=s~njB{|c$QBb|0ZGtFn+zI)R_Ne63QR6=2L8N9KHXb4JT|aI-g4C?T z#*;)MZajY@&qng;s`0$M!q_OUF=-9CrnY{%38XADnUs|#lP_+vnM_Dcaj;F38}zq1 ze;njbY`UHd*OTQ_rf%{DqMm|!o6?9fP1#63-0|tVX@p`X8Us910q{r@fCo|xrg9>O zsR{`($~2=Hr%baUJ`ZRC@Cy*fOp8r3Op6WqrW${s6%bzq@m0XD0b1|N4?3SqB<#(! z3HlDy6yE~zEiJ`O+le~D_>t00yNGfO$B|5Xl`NwDD#5iwL^+`EK&GRR4%CcerV~h} zQ>L?~3x-BGcIm?nK<040&z5}@?hq6$C_zw1L7fG4R|zp7JSDtucshhxhUwus$`Ybc za2b0#i4c!7ml{&dm7tr#4t(-6PlvjJ486>=3m=EYKD7-F6aG~coU`nw8k4f+aX zSp)I)hUv1&;zqJ;g7_AQyCDwLyic-hM{3qj%Pyo#_8U!j4EPKrpSA2oQW$^Ww;m{H z9xeNo?nH-_zDUYp%TeVR><9KidqBRpk^?-DoM}0MCBOV((4lQjW0s2!0EL#&;V;H>1;S(zj$+OL2=&Emno zpqq~=m<}nAV;=2E@ZZoLz!ZN<|AI={we5g^Ti+gi9qh~5hq?=xlPv*1T3ZNyina&% ziR4?!XTnb=AM$vQvPY4}=TSf#(AOuC??7KiSE+|gw}SF4p_G%9VkI6<6yAS9%aV5m z)%=wa+-`l+Qn7icX1fo17kJFMqE^r0N`)QaXa@Tan3C{?TlX-Iz`QqB#U|3=^2 zpGn-MT?gqMy)U3Nv~Q!|7z-)OwZ8(sq0vnItKipae+KzSG(HA?N4*aG#ok0npP_}? zc!~E*;5Q*JCFy>R`6*?FE)!Gq)!^4?;AAE3_jUq*zGfo$I~#wCJ<`po-b*1zaqYn(w7o{ z82pd*zksWcV;=6(^#y(3ng!I%2I7;n|3mYYj(PNtQLkR5nqMWY#@3(F4g^00>tUz$VU+$6=AoJ!bW^~u zX#6K#C3)%%kYCpIL!a^_={^AeHB6CS^NylCF9APT^B2gY@lHpXYagOH#r&V>#-rbO zmfBi?z18MHN;`k%LTT$zui|tdA88CTp-(zl<82GIWocR= zQf>3;YHzx#qpJ}l=Z!S`=r5>~~7LHtU(8b^P8Ig~vf@)(U8Xa7a48T<~I zLVgt0^Cs57{uUAn{yF__NGTw_`keU5RQ440yrb?#w7$kak`MO6-Hjhp`U0}eL8Kvo zFnn+0XXMAyY|ckb`x>>eNH+xairQ)*Ih@uPkxxAK3S|BUNdQ|#+oSQ0F^4I{-9J(hm0m4`}QF9?OCrLH4yDi`b3X2_-vz>cy*4@_8U-2 zQagbFxxlwYeU{R^@1u{J1O7?UpZ4UxgucE5jr4z0O2Jt+<4OVAg*dh!aSUwXH>7Fr zlk_H1&JL946iKx=X_2bi9_*FoHSmAe2J21_ZW>1eT()FC^y}MgfqPeVNfUgtMeO@M0zrUX7(}Ct6!7m zQ(L;7WQlreHw)84IN9SCverY??hB;JwCaDUYmNRzN_mlH@c(EPc!VU7NhyD&ls+Ue zMBVvZ;a{XtdH=WKuD za9W`%5g8gAA?Hyo$q?6Bo=#TtG@;p%#^2)_hZ+J_iF+Oc!?!ACb1nGhZ|S~t1M5q7 zq#vU@(qrh3H12z(ur_QgY-Q#Fp*1gtum%V4b6XXAix6=Iv_n7C;_M=P-md-ke&izU!ZhBSws@g z5$Rbp7VJ+jVgIO)d=wCjn~w)7fwC1qQ-L=VNg`DFnN7U!no4s-8sG`32D z|A6v^a!&bDxnS&S>}Gt>*u(g+F@?&2l-U?j2Jt9C^MIzi<^@f)=AW9=nty4|=+bo= z`Y!seSc|@={$YJD{Ug5Gl&_UWV|!zwf33!C#y5;RjBhr#PtTX?dAnQoe5sA*8O<}$ z>KB@eOwv!)KhN5P?GF1tW;cI)ZaB-F$~I*ii!?foZss(RNg^a3&a=d8!49-t$Yxs17ZmrEVcK3msdO!#rL$Z>+zG6b z&1Cc7q_&K$V(aML$vx})D@~B5O0%W;(h_NfR3~j< z8orb-=e4|!uj3mT=WBoY2ELhZ1+JcNgS4H%)$kR3J6{9bYPi0cZvbvCpU*e)df*nr z^)-AGa20$iUkPZ&`7F4;l+Ool3@?Dv<-nD|^<{vKoDbwf_;kJ$xDjx@oG%7$Ay47s z0fjl#JCKj&Lx7vd6L~i82HYIpou>m{W6f6Hi+g~Z!Q*&0o(O;3R1UZf=+Aj2SGb2; z8JCVjy*6G2+*xSXfRn^ad8M?LPnS0HS<((^H>6ZTKW5Qb7NHy<_gZO#bXbD%OZCz= zX`i$cBs5c+!RJWxqy^GqYIipDYyoi9(CeA7x^Z5_OQkt{I&g4Jnl3G(KErhhdH`+A zhc*^5t#nd4!@GY;UHAg27tF^%)_Q;BviC={F5K5@XEHp`oYKRZ3)+U~hYOm0R2!b1 zJlI39LM(e+zYyBm#+;Z!=^L>vkTRZOR?x}nIGzBdv)%;obI^x$l;H;SrM0xr9*92F z(3^ayQ!_pUR(4G``5w%v=@sI}{vgi}Qc5v9*7z6YZq)ekgzfH2{ z1d~Eaa1R&a*1}#^Hx+lr+N1ipSP$)z$LR3g=_FXCByFY^PQv_iyf>jKr*Z8Q*g%fI0N=I3Em8lXwnWM~Fz9>rA&)})7Y55t<2rXQeB*JtPl>K}!* zX|R5X{)hUZxIXDe!OHZXVRd2u6}Bd9ZP;sJUxi%^`#Q{PV6aM!kVnd+o;55Ri$zVQR&5#xu(kBooEj2|0M7(X#K!20zx^lQK^>DT3Z zG!VoIs0~QMBv^R>ZI}crk90tUNQeD+ScxQ9aU@uUBv^GMSb;cz77rDqh|ns?1>_Ng zd^VW zS;N=!O+lFKkH*)E!&i;K--Nf9AnoNaR$za)_hd7=UUJ`AtIr{SA^H2sN2@=iuRxRt z$;Z)!?8Wqu=jmz#@vF&?#TMy)lNRw1&dDPwe+l*f2>46re}3 zIc?C}*+BUH>u@4vaJpu2x@IeY@IQaj*NAi^IAya<;`$a5`e=JlyoOm=Ijdqbp!RuC zdNHJ|fEw38Et{Y;{y)SP`0Qf7-HEy*c|)w?m+TuTo%R7Ot@pIjU%-`*UBI;scwEa_ zV=wZ%kzY=}f%3a356%e~TBR8Q=NNyJwo(gd zqn)k=tSZwI{&~la#S`|8jbqakZ^hMS^ zbYbW+)-Uv*p=a2Tunu9JSx#6(*hx0pu-)(`dt45eoopPm(Um2zAHeuh*<-Mh=Cfy6 zH}(R2a@a!l3L6IU{1qDxGF^WKC#yBELm$Onhh6&PYzKRn<*_5|AM7diG3?f-uyf4I zek^gRBm0R|EzM`^V3+}O21S8mh>b2-$L|KVMu?Q5WDnhNK{C) zR2vc-@{F{q%`atp8z@qbQb6W;}#I1MGpi=RtxM#EDjNe^SmVisH2E? z7Svtjfpey%ZxcxtI73*nfO3FFQOGP~Asi1>;zt!ga2m196ohGTcCl28@<EfM*b z0j&gD4Yal?e{-MU{AqzzANs&7Td5B0vsy-NmswypVA)OixaEIsk#^uZ2zC#aV}1m? z2g_-a2e+I9y4Xa_%0(LNEUcl_H?@BlS1wEHbt{Jau(`-wYOXX-H_tN9#WxnrOU=v8 zwdOkWI`c+zJ@DJ$>P|@6W8Me;LGuywaq~&@8GIjrQtB;QOIwS{d>-EfFz>U(K_19& zNrbW+@jU?Gdt!fWmfqmcvLr)W8!c&&GZS*Ivt(OFSjJciEE6o{kh6+XW>{uh=9%YO z7FZTrYAh?D{u;|F%Np?4Lk*iOTP)ixyDWPx`z?nc{ix-H+eav^Bxn(c0PC-I`+U3n}T~*I2e#v!K)}YmRl4b*z7NJd`T2R#>N6XIkf2t06rL zaxSzku`aW>DuF&jNm-b**)Sb+dJ=b%%Ag^=-=t@DErpAm5 z>%|CeNwl7h2sIzHtcXx>6n_4x2rKd6N4O{jMi=3M^mZ_=OZ?8VzgybM1DjO)N>i%YK|z4s6?M~f^S(*{wXNC%Ul~VJz|!5XT)4f zBJ^N>#G;6$5u+oPo6kqoM$|>Di`Zxx5m6tp4Mut~VkgY$tcX1k`yviT9Ems{aT0Q# zi8vq8Xi2tdZEY$M)*0Xz z*d~|{f?rNP@>RAO=989F=2F{inAyFydA0?%#g-~tjctW>nQfJ|A!0dYKR^ z$7Ne@J!acvnW6U3yxg`0^bpgx+jiOZTHF!2w*9t4(4V8A$wlUkwiDLPmNm9hwzIYi zc4mLq+YOc)yP0?g@p|({d$jeKJ;73ib7z}v?`ZFA?`}`AuC@2Ir$_8G*V(hc7Uq)e z)Z26HqwHhtDfaPjwZvWlGRci7wMW~h+Gj%9IreI6f_+e* zCdWa?MzE$+jw8Sycbv2(JI*-Hn@`$$I~vU=9cLm^k#}l|2kUUQwbew_S$Wv)Q>@0WgjYxlT?zbku z)kBsE&ZEu~*44nDBK|D#&FQSwU{ShDZ>cfwa~WVn=`fGGTxN5r z%i)T)EOsT>w73emI=VW$x?A?UQe1rzV_oSslPkqs@5*xJz&sKkk&D>t8s!@68t*D` zRag^TQ=KN)Ov_o<99K0WziWRXple^(65ANymqFQ;w)L*nmQ2@LNMGyP;H<7#{BL`aCkwYSLVKtl{iD(R~M&xL7QDi=) z6gj#;&eF)r$mx-@Ag2;JH*$XDqR6F@%Mqy}Ya{C-*O^a7ZiKn0a@0oF;|k>%0zI#R zT-zddM(&ARZr80vLNf^0*~2@?_*0%O)7hd03IBN7jQ@RJl?j z8)21%RTb8t3hOer7WgW6Tl+$1w*8!CmD>cG90%*>Uh_V;4SBaaa%1E`J9EcbvfYX9 zWOp}r&xm}N!QDGjF)wnbK|O2TnSff0+}VH_h=gYBr)!RTgnNGs=)h5TfqR0x++F3K z;hycD=U(7m?5?pCxL3GWx!1VYyEnPFn9sYnyLY+wy7#*exsSR}xKFvyx-VF^L@~>* zD1DS6${gj0m>(4lb`A2x^&0GYc~k=M>(Sn$I=U{J>!UhHb&pCh?~Ll}s7L*YO1F)P z%5orXjE+jTr$>L~M2)hVqsD?II-niEy+UL3VBY6<9rz>vrx zQOoQMSA?jQ_H@@p8>HiE8`UvtwYd^-!D?G?(;|<0Wm^yRueG^V{c-L>UR@tuqiksr z1082vr)|kTKB9|jyt4*%&rut-0nq??%PHV@K|Py652Jshwnpu+nUJ^ajoNBujzv+s zefsIFY3423sI^gV+s{SziaG#$n^I@CZAR4LsAEwLj#*Ksqs~QLv}}qTVy?B1jpnfS zE{_g1ms)n=+(j!mchOd~4s{f+!@==|uS=w9HL zQvTBDO7N%Ks-kB_&jnjcg4s!ro{v6QUrqEPsDEkn^5|Mi8tM`tDz$}vG$1qVrxK#q zx#swM%LViF=#8px)!S;K>w()Ac`$ls^q%N_V?sZ=9(^l|vBkKZiLmQK#Mt5} zaxSngjERd$gr2O6Nsj4e-WSs|24)g%Dkd!^)722uEhgJK6Z}k&$VJWtu*w{T6qqmDDfD9sEUO$vF%uAnV{t3G>dF zQ(!OiW6oN713J~)*2G+htoJZnBRqPK!Lrz6j_L?|?=*V@?5lS<_nT+AU=v|!>xqVy zZk8tjci^6mHeB^8VJx#e4EOV%&ct^oJ|!X_d0a6)eIs(svtr6I-9FZ81|IkS8$EyN zFpt|kX5=BAczZgYK|EQw+qaEzUhw3=-u`IJ1cwXG3%%`Au|H@do>9@E(1)>64Vdm3 z-;`cL=@rCJMLwq7+17mAIS<|u zhdswU2cjClzIx+&YFi&U1jf~1O@TFc3Gt(dPe(r5g?vnT#5&Juu;PW*zL5w0c_-}R z?FT&PP?Md#q0bj%c}&~bP~uC7S0dKMTFv#5>nv+xUFM=#t0yJa1AIG7k4=Ay?Gm{t z)^!QrgYx%^>KL19Nwamc>thF6w6UqNL(E4!hS*#`el+p<$Vb=1ikTE!1X{Wzx(<2I zROB6gd~7N1Phbz38WZQvbXGYpxVFYt#>B-=cdo~ipz~<#EZD;BCbkhu)q^$yB01;b zDbjWV5!+fFr;VBCs26_QI8&T0&K(yQml&5Eu`#Zj<78aVxZZJTahZQ{+3FcNZiKZV zZVa9@;|lN;88;!WJgy3M1?mY`J=@Z$*8jw+o>kRTYTS&t*@0(O^)wncFK$8H;<%c) z6>+QL*2Jxk+Z4AYZhPFWxV>@v;||3gjoWW!YCUl$;!as=;?Blhh-cVtyq?-Uf$hc{ z)YCMboloG|Io^ytiFbccPfj%VBtBXlg^G}PQjSl+Gcx!zE~relE8?fd&s6V4sHgt;Iq}u;3*(o>FNLcPF1(@%}IQ&yi2}*}X&PZtADR&&PYYSk`;aOZQrJ^jtyv2Kjr) z{}uV8DE}h5KfaAps4aYx-FuSW5w?==dp>apYgSY6?QHP3lV6GN#Oba0{1Sb>9LK_+ zLSCCmDNj+#DM~p?Ic=0ujl9lEd8#Sp*OX@+rPO1Jb|!!2_mKY(<$0H`zDw`W#UU?E zAwQ0;enmO6DP=dMR8h(R0o7DCc7IH6fH@Q2VUbfWD4VZ||deR#VQc z$cL0r{=ZVr)pYgO#Q$8#Aqrag8KuYKENE7u&pXrASW0h4>2oOEtftV_R7(FVrKi$( z7pjt>(Y1e}{=4XEyRY&6bWK z^`68ZR(p%SHjMlpl=2AHCe>1&Nc5!!;wP&-_0~eIY}0*C?_greS<3Sn~&Qp}qp88NvDLqL`6Nv9jvws+QZ5X8_ zV$Kj%|GSdrOhsN_ORbNldP-(3h+bzN3|)E)kdr# z#7=)w+DLVVQaxvdOmOVOL_H`U7xDGT^S|I#zL#bsiBhWZs+6SK6sAZH!KaeG;j_jI zl(QY?WEZFp9!hx^eULErvp}tf=5Zm7k*tgzQmun}vWN1VCAm!|i9JOvo>jGuBzB)V zYPy<=BhvJuR;FUQ)B(6dS2aoxGzWiYvm@n9!*opu)tNzUZ6x^{sn2$GerXh6 zQVlhf=Sx)wXf7U9`%io|mFlhgC-`e<7T!`V5wB`F<=lc#G_}8@+D6bk?jl)zN@d+@ zy4n*e`xi=ofKo0}-#SpwU!gH}pfT>HC&b5TE-J`c-=Gn#r<6u2`%}tUq9QH+Ujl#g zs#vGm9j5SE)SpO7Sx7Y;q}FA$0&Ne{-dw8Z3A$>an)gwPhH!5MX%~%JGoJYORLRgA zKba(fd+92twmQ*RhLN4tlO`V}3GASDvnXe}kPIOn&E05GiZGe#Z%20eIputs^k)Fo z^A}Za)RXpf^%UuqgK9gbN>9~!N^gI!ViEcMsVxK5_8eW^Mq2tdmF-C~f0SB3Mk%LM zlu&hs(#^D^vzdvO-{DYegJUk9n?dsVc@^pKaS z=bw<|52?d7)j#A!GS7&v##ixI_+^Vh} z#Ao1t@Bl*M|7tuyHrQ6xaJt%={8Y;GSIi?tQU7P@haykXJC0XDdUTZ}5QU|rZ6vD? zk=NL$o_mS+cwZspY)^AH4kd}tk-3Jho}l#Qls{Cg8jA?!W}wEBUS)_~L~m-HtN>*N zDAAiFfc_R0pXn;eNAr7<$ufU|@LsevlG}rHH3a{6LBCtoNvbVTT^aSNMo|j!oyqp! zS0zmTB6S}^`tT6dLwKT_t+r0-b7)?ENo~y`x&2MWVJiDi%6Xn@a}gg(81+*s)m^n~ znza#Fn{Ga(uT@ct`Z47=G?UgE{Xk3!?S?7(983x2 z)M9Vax1Gcj%ISttyT4QIg6gMPYm-cxPdiNgtHje(Z2_9fOzOfl2dI_g6z)nA9{u+zY+L)H3qD$*ii6i`1$WB#_2 zsBiT&cG}14i)hpp)Ot7S59yMmrFsgf=A-26b*eV@Cd9VV8x+`+N7a6QT}7x~g%(7! zu#IH3m+bK%%~3mnli0U>RnJxHp#QGZkiS=zFyU<%YB!hkDocNzWvY3%x*wwynWWm4 zc7R9Kbh64{5dR+iAIw|mb6M|7d^pI9(&69Lhp}9UpwLL-g3{>~b)YjM3lTWFY)9MbEYTHV@OzBI= zI^Lso_OzNpdh&k@nyE2#^?us3t)rfwQ+Mq6PAWH3D?O<{ONC5m50CGb>C)8oQN=5| zx`}M$dFt~kq#-03?N_8}uaN$fh^q;-&%w7vyOM_2QBH}p;uYduB&(CEwyW}_bK{(?OLnAhLo-Wjw?2pX{xl<_X^j|7 zDGnOf4orc)CC=2dG`fSd`aG*@0`X%g&mUE!CEfTZUHu33@PE`4>hsH#{|MzjN%@P^ zlOUy!qyK-~>rSPrXru?p*Qma#;doWILS55UnUMbk)zGM}Yvk{s`Ux3e#h-ztXbn9} ztL+`*8##v zKc|{2Xm%db;oH)av^d^}Xy5+44rBw0z4nE5^Dd(ORc@11Lmf6@N-^M1~A&U@bT=XuU~&foVr&%v77 z#F~_SB*XC6Wf=Amd_I*vv_9Q|Ihc&w8tIHtZlv50Iff);A7VAp3+_+VN)zy3fbXbv zbXk3Z*fS9fJ`Ip&5z=gckP9V6Ml(=^(OiH0UbT0*BV^u-*-IkAi_35h@=M?kTKJcGXF#Si0QG)~bo2LQ`I{OmgqdWyU=)%pQ3Sd4$P z>e}xxlQGtYOnWk&$ViQ#?a9@Zb!WX;Up9bT#cU`W!A7%jY$BV&rjtF3&1Li1B38nd zvK6e9t!2FY6e%fM_CDlALwe6_0Y)L&H(<@Gc9Qh0WQS_U(%(1(oLf>c3sduPqkhHQ zS?!m^`#H2K>>`L&YEJ_0R{$~csC9q5UPVRKIH}7|o)?o+m7IFvrlFb1+QcC=((OfPfvUH9z8!`+vw?FzeA;XgL95^F6-!==bXoGbS`i% zV4a-{od)bCr=io3-Rv}W8ndoWQ>Q7r#cAd=V@1w2P8;?k=N6}k{n+W|bYp+FVlQq5 z)v7Ab4Qw-|zLV`?`?=sQ_jxwYk!J~c0WaiD)M*vof$Yw_i1*;VA+w!HVtX(>nWVOR zBt3)mqa?ZaCf*10GW7^kgdx|RD{AuIqK?StgGB>!H6o7FQr+~XrMl%_qWE0SVXTG3 z!(+`k)J6*A{-^nwbek{3|9*c7ty|;{s#zx8e6WN@dwl&Ze6F`%pnfb1AvxgPNa0na z*#*#p&tRnUB*KINPm$1Ri_|^>ROwI03ADEXe{WE$H{P?JmHa1tL`Q2mxi?F_3&wNO zhZjg`a(9cP-$M2logG&0&Vr1aLWG6-a1( zj`T|LuU3? zyTpEtPk^-SBuL9nhqQleDWqjTbfmQGN1=zp*`g(6VAnzh_Meb}{TF0lKZFeIr&0#i z$dNLzM!uARHO`kZutq~E18ZC?Wnhg$<}eoBPG%S5(Y<7sG3J?!dtov$;}WS~FCK6&f0q>F*7~_jo+%mbgeeZiY~PLliy8dpLa`ML0@3J-tjgCF7QC4i-1v zNLr=NC0Q;~Z&94~I9?JL`CaOeikIt<3}zmA|y(NjVji)W`&s)CB z`i$Fg++}&?Lql9m=)O#kAEzyDLocRpOMRFrcqY+O3D+TM#t#LF+87iK28 zlXw>S#Q88@CprzkmR~z1kGO3fg#I|aW*YtRcga7}9glxUdHHpfU%DL+T$K&{${cZkEe-Fw&&XZ*O`vW1<2;9I=@N3-GeO-_p zk!k|geJZKfPmD*HgzYeXb(yw>WFBljMMz~>GFK&7rQyEIlsg?Yx{Rd-$ z@shS+Qbiu|?^36#q#@C64#j&j)7o}APo?))>HU9_E+dIkFgutR??ZwG!HdDG!Lndw zusTszL(=-yBw90$Mag}NHo>}JBg$EtEy4C+SFksEoC?ZfW-JVSthp&^#m8APu{yE* zSc6z2xSPgWV9bph9bRf-h21gMCDtw0Gu9{8AM_u@#0JHNNE7F~*znjW*kfZ8lE>26 z&gZjJgi8rEp6^qbabU!zlvu2P?AjlMMor1ymx$G-TOlH3m;%pP)x z^y1&;I5snh-!k?4%QK`O?-S$m1Km#I?KgkX_TzOo{#kADoxWvt$m$G# z3M1`!8t}`{DnghZS-oXma;<8;LU4bGJkMNyOZg^p-zrzN{Ev1(J~x)r*Yb8!I>_pb zoyk9!T~F@U;r>Xv&5z*ziFDhSVRtuIx&_=EZWE`41%vxuxGzKa*$985bUTm1y;Qn6 z(q~9tAPh$stFtRLIJ_>QeVK$VQZ|vYga4JrSe3i{YJMbP{H!u^SAXj7Q<#6qui{3e zUmvmNz};E84aDNZkne|xwG;lplLJo^auK2r!n^_ZW9}_9ytH4(y0(yUchLGRD{{T{Gfbgdw%%2hFJ-Gi3_b%xU&qjTr?n0vai<{eN?A#M=E`a+~glDK(1tCiy8mPRa+ii{1&OvHJk=o0^ zd?rG^3+mRueHYv#;l3JSK7o5T+#cL0H&e-zIB*xk-3)F>K?n}F`lo+zKe!0eIQ$22 z_k;U;2=h3?Tnl$!xEq7IAA-8`;Rc@=XCVyqn}|!`2A2xOrTEv$!*D~wgx`)ZV-Th_ z+}+`B2zNf**>HD4`6w>RgU?-XUy2e#o$@E(z8vn~p)Q^SR{w$w3*Im-l-OU9 z&OZ_N9>jeP{w46=2oG^+>Jz-Iq+M&RwVxjAf10N;ggFn4H0G%VyS)V zE==k>;I7mG7D?HQdw>mQjo5?iA=a49rROsCHa$(*JFJvl&Q{ZN1%HDtXU)x3=DVzg zJeAH`VV8LlYeQx#o55zYd29iDk-f^6v6U2K8Cys0jcg0s&UUfAtc;sH%wuddugP*Ng16@Fct?8c!n^UFybtfs2hlTx4_Eq`@HFC+DHnPuHJKv4@d?uK zX%sfh8_`&^(=3$#38d}`qrQY@j@6GzS&@FSm(xBH&V$dB(#_9A_$d4zk% z1aLfHXQWmFcORY3eC$Qfm$G(nj|V&-Y2Jn1)W?xa8GL^phaSFi35_V+A0o%s5OQ$E z?yE6Eeie6^myp}R9`Y&HkC~L8%#nZpk-}wwy#U)NH{wo*zOt3j!J&9S{)>@3AT?an zAs(p5@>zXWz#6cN*u|`nT}mAAJ=TP3w>8ylTh@-XXFp&!u#W6T)|uTzJT#CEVnf+5 z{9AaJL!*BOg{niQBRH%l>jSM5-Kx+#v5+litJoU0o^2wyhTvFww#Icyh^gf(@lWw{ zCiOxwxgRav{7iiPgZwJG!2KTF&jOA{_`cd-hTjdJhJdXAv(O&a@;@@oL2TYr>)b$=}h_bb&4n#nd(wXA@Mjp9HF1yj%!bG`pHz{52c}= zfzE$myVw~tyQA zMrVt?!f8%97Qo2dl-cg=lIg~CL5guBaUg%=>?M05#UkU(pc0@5B~j*@_H-xD4HLcD zj_=0Yn)WO=*R7LCt;Ed-b;)^?aT~aesJ_NYY6(l}iW^D4j44A(ybi~VaGR#!pJM3S z6eq`R;kI_$xg8T2CYenB($DQufq4oQzcWy3iE)R!qwI0+Sa*UunRsI&__V;CX3uwLQm8rZv+hD?p1W9 zXl`hJXc5IJp&aUlmWEb@N<(Yu+2G7`%AB0g=Fm2KPiSXoPiTKwgx#sJj^K~s;C8qN0J#69u^)?ea(XKq(pfw2u}^qpc%fTel+zNy4>xF zge7bzJ3KGEApBzZRoRN-er|s_JdE;QCQW!{cy)MPc%wbnsh2Ql+wPk17791EqF+du zMNT0M+I@ICnO)(%;nk9N!etQ??J({pE+WjgN5YYqyCm$oVnV4aC3FY*u_{ZwqaUw1~8hw4=5?j{IhYIz>9l-Zs)Dv_F5+CDJX@Gtwv0 z-)SQIL&9&Cy&}AhavDVa^L{Fqxzw8!Qh3!HQ~gASP}$|knkOns?VXX~kx`McyBRe9CssC9>wY60Cxl|w2 zJ4JR!_MuD&?^a+73cNfYZd}1#|nU9erBl=3{Y=(a~)H{PeX0G;b#W_fGIm&sR zg!WX$jp}{{xG^g=1|z%+O`+SMJ9LD?2mWeyyG(JWUhRKPN1Ya-cBD@W)JP}f^`a^P zU^^eBRE(O6!Tk%Qvjk~o0h1M~?Z6EhjY&vt9Oli-pqsuH-~jk{Lyo;srvs2?>xy}^ zu@&jeRWoeBR=VAVq^t@`xS=jdSte@`riV=5+^)(BK7+s&4K;`0<`2LL@Rp*$O zMt_u&OaZlHy@hr(44ifjFj2iI`X5>m)ntNJAfy&csR6%|0c3YruCx(a z3vIVf!eLix-gwVXvXgN)wcRd5{Jp6(dL4hsbRp9%4bNnnwj6|>vV+)Zc~;_uWRt|R zaT*f*R3|Boo>k|?n^X_+HlzL0?L?S9WcrgCL}o}8<#LkPiSpI#;Ml1UH^<*|__f|4H z$m}MwFN%KMXUfmF$wYNH*(Wy2P>1odO!ud}{47mdQXcW|el0~qN*{PAUQ6q50HQ!$ zzpL!8GWAQQ!pW~);qTWaQ=d%3q_R3#KNK&2`?N77rBBhuZ>-CijNgn*%V^3t<+mZz zo=m5-wCYqCzbl#U+TBalO~S;}>8tGlWQxfQRrDXs_#>2w^PN9h+vB1sW2rxp%#>(K zKkZM~_AFhFS<#fSJ{}6qM7I3I^CdoG_@_J_ffhp z3R*=|=kYPsj)S%p^aUM~`du9^=$ytUy1av;XbR6J$|zPrYtTb|m#c0i;UgirUxE7- zNYp^PyM)&35}F@LXkR9w05tK{ychnnC3GH>kR!Z+kBczQnF#qQ{BH!DBcY*x(*F={ z#5Lc8&l^Z{J=|Bqt^99++XAcspB8WrM%;mbWymoKn1`>s5b`FtLkI&OBLe?#;NJi~ ze+K-wgkj(x0xfP&z=!a43Q``6SQj9*B7AL)uS1dMO!%(>90{LK06q8wfW?3U@INS% zset|9^EhB% z0f$%(CB*HBoNebjwY*yF%5Oct z7L4%`WJWW2y9MJD$xIG##h`1;No z>7Tf_=5UOkbiYl~9XAqx58Q84p!3?J@3lFYX~J6YX1pbD!`t&tyesd{d*SJn^z==* z2Jm7&l#kHgi^+`U2+rT|J?xu)y4UKFZW$DKuS=h8EU&rf<59bEItt~R0#O*KH_*w^U+`nSq4LAhwYQTrlTBZESi@XoD9v^phFt?L?6ZJ0g&JGKA zc7$X(^A`QlG2i47gEi{sAgLJue1^+X7UU8g~Y_4^RJk}zZL-t`(eL6JDUm9Wfn2?|H|oq z=6~k@uMzBerv8ZbV7*xm{(_#(=CEhjIcyO<=dq=1HOprk>G>YpL{Ag8nV!qo$MiI1 zpU`tT`;?x4W^4~VSFpY8Yu227Lr)8KfS#+k;DWW3D$Ur{+@{$|EAH|T`#z8G2)l-R z++%Hczyo$Iufc1uw)_-+3cHS<%1>qO_-Xt!c0E6xpU&FzGx!K;*;3Td@`TRy2=?g zyM<5XQ&|z8#;36#(Oi2v>&9pB8SKY=CZEZ=(@c97yOq!8vsn*5htFZR$$2;H$>;HT z>~{Vvf0p%z+Yf}_)GjHb{Bt{zs&mbSNJRJZvGm7jrHSy z=YMB^_wd*G>#RS2gTKLk!r$a?vH|=p{uaBJzs=uf1Nl4r9d;jom%qyf@ilx6yPvP6 z)le~C$Jen3`1|~QHkg0FKVU!QAMy{`5dIPWh&||C<6XmsdXM@c_E6&1a7dhxxk^d| z+wJ6EaDSOEB^uI0w3HztPgW7)YJ`|xMTk~^2r(lqL@uki>-GCd-zaR*1|j4OJx3cR zr3^CQni}SsjM%1zX_FD()G*g(#JIK&hm`|sn*nD*@l{HSuIn=3oF1lK2AtEwT%Q5w z^f2u+;4CPF!div-LB?{fiP{ikauKRS#*)rMNU1fbCPLkinwI~MjG;QFg<6|2)DP2t zLaoafs#6;F13_V~#-D5KZ_HTcHFauSr`0(F_LW23lmYw7p}J(izH+FWGhlC^%oYBs zhPr0J-arYc)KsWjGGJdhR8a=(D~I|~2J9<`>Xrd}c`8G;a)V4QXy;<=#~Hbza=7jp z`J!^TTQhP-<#0VR@yFFvwR}R-JW9`>UgycHh9T{u3 za=6|Z>$Y;ZJ2Td9<#2s6;AiUcRUs80+?4^pOyT-wz%Ns{yEEXIDO|rw_{Gn)G-7gB zhYNY`H4uLkPm5>7v*K@JX(SYRKC&qCLgdBBOOeHqmm?)esU8c+)MEv#kmf6Y&1rOM zOFdp^YArno_GbNAemzgVxp4IX4iu)@(%ysGIl_;kS z<&#n_)hv&A{lxK2&JXE-Y&5r++s$1G`uCb;mT85pm{rrtwdz>;Rs*Y%)zoTX_OM!8 z?c()hb+o!z-K?H*f2)tx-x_2Mv4&fttg+UFgO-cNE78if0p0=Vpw$e78`8b}TKIed z2pM`MHO_tyc%_8pkegT1&-@F(i|`dP^hyqu{}Misxo41!XXhe+?%x4xBTNYXBLN`+ zT>dyxfD}9b86aY@@o=94_c%Zc;cKXV13r*fW{{LE$4LMsTg>6ZKyUeKq>sG#9{{h$ z*LnDgl*@i6;eq!h+^@<3vez`9kYT@?(#vkK~b0{a(yAkAO)Inp=qbr>Md zW3b2Iug)9byoB88CjTekkCPSrJ;3|m4>@cDv>SC1raQiWJ_t9sh=YH4A$$;5s525c z|3K?p8FxS64fy&ud|eDTP6dd&03-01CnbP4Mz(ykk$Y%NFjB?~IZ}k>h$4Oyx;fM> zbX%xT=&n%T(A}Yap`S!{NA~D6vXkcYQZialD!-~`ygC`;$#W-16MKA>vE$=;3$@Y{ z6AyDNl=;nnqLDmRN9$5nN=E4wT}q?)Qs@?)RiRx}e&ab5T0U#(kvkZB$S)5jk($&% z%1U{?N;*mtY4AdFH{s3cYYA^fUnLGQETv0do3KT^EzgPfd%6|l^bW%rA@*<*pQBx~ zzXGC%WMcrqIpydR7)}Z?^eXD45JR8IZ~}zk)D6Rb86k$ALCs0ZaW;md2jDoTq52{Q zDS7rhpgI@yX$m*0dE!rW-AFhssm61#{;c>em@9rGe#034Y;pTO`#vVz)^2NNQ2h^L zCe`_FRwuHDYW|#HSMUX^o04Wty*BD_OjE5zGqBotIv&$>>rx8!^}fIWa!a14UIi^R za?lcg%hTbLzf1U0QWQJm1TOg z^(JTJ4e05Sz~uPkQ=jGs4e|8UJ50wbC)I8`92cHZt*0ZIF2^nP+R)5!>{HL78pxxk z6Pd2ZG5tK~5I^?m=Q5i{Rrz!#Q*<11I3ApTQ+ixEr}VgTPU&&xoYLdWIi<&)b4oLe z|3{nhTN%gyW0h+9_c#CS}XRzTCpg>ecvt)wV6XP>rz{+3mu)cPY4#01G^=E?J1m? zc~JMHU4d^KgZREdoEuIA4#%e!N>6w#l%52&P(2*f9(`O+GkG@rTPFY5HK*1(fUP3; zY2vq(TGyoXZlx4&r!?;f^+vk=k@9^yZHav~{_aJ-ihRY|VQz6fJ56c`hGE)HH@3D- zZ5w1n()Z+eR$AN}%t7W5b2yoQQRY~4f;rioX3iut$9&dYXf8IFn9IqmGS`^v%}wT3 za|fB-=01yAwiUIq$kZ~|TeYpaR(-1>nZ{N#tEJV(TxGSVSX-@5R#&UL4%y4{ZyQyi~zMXCDv9s+QJI}6X7g#&(LNZP4=GHj7mEG3vK&G>uZH~2zC|n0J zJ?!3gKYO6L)gDY{m_5=SV~@8dnLF%B_EdX@)y$qvu6g9M+g@P5XuoPNvxeHs?3MOv zd!04WoMufYGt1s+&9%3GSc~lKWOfl|Ird(wyEd*gxHvr}W=*lD z;tY32Ib)qs_DE-fGufHu%yj0EdDdCzEKcQ#)R2e46DeF!WxZE_Rny0$Zk;90a%YvZ z##!%dvRXP@ogL0@GW%R+=ef2Uwf4JFH_NSMb$4sKb*(J7uG5D&wy(9qt?xFpHn@#J zQ3@Bh&D{DFvOeLu#0e92E8UjXTDOfgpK4{3)!uDS7<5o2?{;##lIf1NIngS0dy(m@ z%dEXSz}jFBMh@|Rki`@d?Z~APbVq=`z3ymt9GQudA}YZtRL)bVbeg+U(rB3O&T{9H zneQ&LI@!Kk;x2VdtXl30w^Y8_Wp0UMx+|O*OOXW7+6I-Z2&5jh)6&L zDjlFa3<&+940=B~q=vM-&167m4%KopN>e!G0hA6V$AG7jEK>3bO6rLR@PQT-?R?zlrYG`L$L zmXh^q4A=%x>BoElDMMPRJcm+}B{?4@Np2;>rZm`p3P`na$e!6Xq@bI6!6)UuNC6H2qH;w6-x(gDhpObax73UCzh>U#RB zbjv~#ue==L*T~!r$kGV3ECxKwQM1&J=&OK~9aDADR@bcb2Rl%SIGQkrK?NTVtJzXsZo3Ar-!0YJz%8mK`-AePeb`!4Vq4jfd^up5{w{lbc$ z!H3jl=f|}Gb4blW?opiskt<5nCz*kX8RX$fSQ#|G>mRyL&rMq}CB?zmeTSWrkSXbO z1_8e|iIk3H&+5o?FJ|hrL)#OSf32ial(jN{CGC6rqb{9HsdhL9RA)*zi^b1S-Iw@6 z;UfRg-`jwi4o8)1i9mcFE`rS8}6KkSysL%o?g?^J}<_2{IOB7^~zy7(=vbv=~5kFpPc zQ1&q@`}Va0k+ulL8|t-ylnR)JcJjs;`KE@qm>W&60Rq8#_O2(f=c*V!-qwAI8{*5vBKS{6m(fSZibEAWx-qO2Jm1I+;Xec=BN_PXx<(T?x5rvtemv ze7sj4-%h>MPSD8zD=9Sbhd2j3C$-uQ|F5jY3JRq>-thm*daQ$!YEt5T36rOP)<*nS z)}%b=Bj;|*DZhO5?U{PY|Bf2XPokFpSJP^-`t(RSMLGXnftAO9bIm5xDo@*u`LC|q z0(xo_Zc-!aO6-h`{V%3h_Dgc+Dz&&Y(DHx}RJjLqxbxfU^po{jL)M(aO5G(*^gh|a zu~6lIys(iRF13(OB6o#c;=!cQ)O2rfD~Ya*EjgWkT2R9G~QHm7l*F?JVcl23CsKx-R+_%6{QcWY$o zU9elzF>MBRBzaa>`t^9^T*|7yUTmOeWBFR<^nqhC@2M{J#}|jvYSusw{+Eu$UPvc4 ziXH9V!0|4#yadMLJAiL|_eK3x60CFDYW-v^;R<{W$YYN_>C0H2q^Pa`kQq2pG3F%4 z`Q&MLrQfl3SNff6cctHdxpr6j9c*{iEoHgCCjaA3!d^%>Hl7`;9jD{n%hgZ9UHlL8 zZv}I;KPmsNPi9J2*M#o~?gDZFQX0;H-kSKo<8R|s+y7eGw~u+nZo1-D@g3sT?{+&= z(j-zo_GqL@WSqCy;mL%^`Pi|L38{YGamkL6>_kX*98MY4PGHJ^Phvcir7Yx}diY6P zq7`_a2w924DbosxhtcdrNIV=)smA~0k7FlNZsBlBH$Mqy{vE(LRfa&0=VQJDrJRiM ziIfC5oN`Y7pFe?}$p87(#af=EE5Jx9=NrD(+ub8ob9ZQ9MC$H7>{~13sm&uW9a3)6 z?aKQm?#z`p_>+#|_exMy3ZNiV!ZzWWr7K5WPh|%9rqx?i9QvPH}wV zxMaWs^vHA(kHQQTgMrfkzElhoBgGgop2AP!d&E>RL(CR`^TY!2BGtq)u`&f0N{i_; z$NIFfI!TPPszRL}R%c!}!UrdV)k#Nn0$82;)#rV2o|xm_19hTT;6$%Jzl&4L2F@(% zQ@J=rDsY}vowY5;d179`5~mvlZhKItY1OG*fis-~Cr6F1;KmtQb%TLEA&L`_LY+Cr z`B8Q9Rh^-KRHtv{%_xkUF}SDVt2*b3lh9fRzq%(uojg`&aB*f-pM+Ltg>k=uJ}Ilt zYU7NrI@zhtbgDDT2JVp%2k=#$@5G5rL!G_GxeT1_jB6T+p8_1rDs<)x@ta6ouYO)4 z#7_xYROgS23F6n0y=mcUC&I~_j7>3C{8Ee)Pb5Nr$#yMu+ttUvrOY=AsF3okvg8nX zy1a!p^1Zb-?X>9#TlU0uoWHo@CY&qgIPc2T%^bK>p$w;036J{Jo3{p@-a-2p*}EM4 zz8raOeHP=|7)fra8DH80?)m!rB82y8Y#zrZvMJi0uI*Xco}2W2KG}=(d)zKbvgLPq z)4+UxR?60ry@Bk_2|FH6mrFVBxG0B){&L)dQI3=SWxJBfWnx9U6FAwgT5CDVQJ?8o zr~JW_<$Vwre5lTmm*WJmYTZ=I@*b)-SP{u`{1tJI?9pqITk*!P;=ClD2xYvRfl6AQ zF7FG&wW)~{7S%C**#K6|hSFS9mBu(K*J6}^`T%mzqVIEIWJz|%N|#m8TZS{%W#};u zphqf$K7#`&pE9(g18AXTp#1>u3nfR?(QbTP&`qGwv z-UpKZV3=W8Kcc3}R#()Et_7TWKLEW8WhE6grMR>VJ$xDXvkblEfptkW-jOBWZwO5U zWQL+_9y>&N2=9zFV*m1}Vvjovy6Y#=J*-NO zu81c?XR-LK;9=>iH1|){(N(bmkW#rtZ02Fasa`layOY{WWREWAoWr$yl(yyEaDsME z)^@U6&MamkTo!t$e$+Gdre0|vy~&emcSWWyH1#J z>{%xa1owqs-a2mi5fwJ1Ud! z-lf&_C5*~GJ1#y%#W(j>#^IY!Ghz14Z!`IR{m*LpR?eNm?dg{(_E%;m-`#_&>69r#whgYV}11QWK1iY!q})E0F`ebJC$W6?~s6m3L%(Mfa_ z-9<0aS3~7LKopCiVg$t+O)I&HVv3G6UCbglSIifSM2T1`R)|uuR%{TP#Wt~1>=FA7 zVYr4b>KoZcj*(~7GYX7ZSCyVoW}0SL`Is@YrkQKjG4ss^8R`yyImX8jwZkTG!zWkT z%P@b?_hhP@B(Y1zaWf}BLqfe9h8-%7Ju7{0q|zjZ)fW2<5cgYh+|Q}>rE#?bwi!_A zUE}bF9zKQ~)y<{)7FOK9s&B$n_mSczRlSq;kc8#%Prj8@>0RTOA~oFDsqg<(y4ir6 z+H(`2h$~HUSHXRMIbwlcr7uvZJ79rr@*Sj=?+aD>3k_((6S!rRV~0@ftqD*kZUv@G`gwXROpZsxb4#f zG%$x0*z-~QGX`owJP9{SRbc0bZ$K>Q(J*jRsBs~n(lU5|4MM8@aWgtaJk3lH~H zA7gW1(r?TxO}a6&gxnQ3UE;n>p2PFxU6=&viQkwBKRih{W){+yQi3Y2Qkf1?Nu)vf z%w-$MrwP3`=dE~K-hp!J%scQR;$W3ZLA?Da?SjVG3Z7Q`$cDN_SM3PDSy5h!%M~xG zR-|}Wae&f)o~QLLf)}+mMa5g#m9Xkn@R{Dd-CDuT1~|;XeVR(=o~myX`*Frc6?JLO z({*-i?l(QTpZM-w-D67g|L$~^@Yvkx8n2ZG32iZQ|6#g#O3W0063>Wv;%ypL-xcqP zb-@nMmPax2aA&@}IlqwHa;LBfxmqP?$1WecHi<@m)t-Kvgw;7Z_nO$-lrkuBjgp7Q z7X~HM0Y++OP5mpF`cF{(5tM)3M&SRMGV<@6^qB3F%B@M~A(0da9N=>N)n3QN72zMCnrEnL)eLvhD+{@tZ26s=meYhWn`vSOM zhxw!(udc9{}6=9f_pyPZQ-5`cMG^D!`%?>nQ%9QyQ_3lE0*pK zaBqS8RfOpR_ddWe_&N>#jipbrPTTTZ;jgrR(>@3Ht%$V_?h$ZDk-`GFOW{8b?k#W+ z(P5HCY3M9GR-<$Y?9xQfCHp|x$8Dn!`(+=-=IZg99*pT5(4V>LN$LY>B$iO8wGHVY zl|&i^)C)Gj_?(R~+NU0?%Um({;%t^XMNY+BQ^(k-q2DXaVQp)*+N23FdCm408X$2Uo9ulhTzX3=V9 ztMutA?YX+n8nULWLWkzTdq)|+F3cf&NO2wV!u(Cm7}acC|Kt0yF0uLPqh_f0F&Q=g z$1&C6m}&8LOzBLkl4GU;!)fWGDRk|B9rb7`l-BgODmaEid$~}n!7FuHsodo`$+nP@ ztcFa_K{1n>+q)dGIW$FTy*i>gtA` z#M(x$by8-I#NSD4n{6r`3Y$nnt!>DsImO4yhB#jk=XWOF?;W3iCQ9dJK>Qtl<(N4d zYCVJXhSH_Z)fyCQM2^)bS1Wt9hEcLPr^8>#ttg$~N(cHs;Km;e1M)bA(mSstS+IH$ zgArG)-PKz5pMY4&7+C+955f(6j6cH%^GXB%Oin<}xvI=*9)2`6CsRqJk)h^tD5uT@ zD^{h6nlrGgV4Q`Lx)1I*0I~Cbz`ub%_6-c|W~jBM+Ko~B0LB9qH7C@53s(9Dq??pP zldeCs7z1e<;27fx_$$dMC546k2Se$S@19goSc91O3uc`M_f;ph&Js0ND4#@~6=v8; zkSnlKs<%pYmb#NbKCLLeYHLN56KX8c+A4Murc`jTcsHrez{N^NO_%k5qNF-2Nh;H| zNp&_hsXYx$uQS!Q%%4}(oLL+0Jr(sN)XoN^)AYU%)`TW*_b|T%?3z?_({#<{6YPwh z|KR_R53e@mNVod1Ohv87>wN|GjbvS|NLf`^^sp5zH9pU%+)@{zrLG{(h|gJ4_m40O zp|ESoC#jF6obpinJ#;F66)hEGr{2p{GJWcP3nlG{S(t$ylB=5)FfY-&MQFiFVo~20 zqHZElH;X`qQSC`-$wcfBnYgV%NeCL~UG-e#5%{h7`mAkq% zNX=0&`&M$oNW^>Ez`hXcXelu+V|EyrE1A)|5g1HQF9d4gW^Ak zq5eBG);P#JYF@=EZy?}*aD&Q3d2@@gF{zbeU(Qf;sr!gj%D_t9mLqx~g&k}$Xq*om zDy`ZMdq@5|w!aIhK8Ck2pX)AV)~y3>?ZNVHdtg9cw)BpF0k_}9w)eih#{iz)_tt^^ zcwLsu%+^-fX=t@2pE8#@vt-Y74Z|HsK>v$NRww4%9$UCnNiyO{JP z!fZ09QoF9tE~55(1+6N&u-^KcgZ;#_*#*>tTuQ5s@3WiPo%);0Ja!tZLp{UAtTDTi zYNjjeqrZiJn9pjlbJ&HnO8Fku+BNJJb{FJa<##CoB4tCGur};^){*^)`i#EpCu|V= zDI1mu705LgJA<9eE@RiS_UwnO8@r9&%?7ah*%0<{BAmfuG*>7hDB5*ulgAo$>Uf>J zV^*ahSPd$jder~5Wj|n@*pFFH){ouGirIrwB8kF(NXe2cb|yQIUCypz*AbW8$hx!J z**$C^dw>mPkLXY)JB8JzSwS<*=Wd|6!L6(p>(B0EgV{rD1pC=-h4X8f z37895=ia+->u=`+76LW{Yz^4q-g_HfY;cV!)w*BLGJOjw4uTPXwHQ z0yrIT7T{chm)P?G7Xg+4E(KgMkf^gu0oMU;0^A0;>%M+>-e&KU&|!c!U=&b}-3Ij| z1?g8IBG zssFl)+WghjGk!lMW+s=QzO-gFY`Ld@C1GxrFj@sPsMpJ3XB>u$qvt(1j8p+F>PNGv z2h0ZcNBYLuc~wH}J2EAupl&-<=UY_yo(& zXcRf0)jtfEzMJl#uy&O&uS$4U6;RL^UauN@&k=j#=MqYPL1IntjZ{=4f-W zIon)hE;rYi+su7d*vhf$TV3p7_BeZ*J6A8rzVZWHbj?j0@;j|xu;&k8RLFAJ{?Zw>E_xXj^-Bf*2= zE}ARlJIy@8Yf|51O_Sa!VvVKr&MUsxc$MBm)N3`OUZoYyA3D*Dr6!XoeMjo| zv-9vh3XK^JXjExV^W*k^G-vEabH;u+c|=s4-Co<9lwC(?TbFd59m+muineu))}62H zb89QRo-Unwl)82>S-K4R&rq;7U zrF`)SZ7HJui@{e_YKHYU2>aN?+t-9B~RgVI<>NeOzj|M$frc!%b8V}w!5bqIMBh;mJQu>TS z#nB@{Pd$d;u1o%QT~obuyXvLK{5wV~ySEuB7=8Ir@x99WDBdO~R4Z zL46jczTed>m4>@Y(%x63z3)za?^`SFeOl`K-E~uc^Sir!Dt>o&N$m&j?vdKAD!q40 zd+(Z-Us}7qyKh?l1JmBOq`vp-n{;+i=^$^7l-jZD`Cpx;6ei0YDF0T_oOiI4bu}Mn z!fokxWTxB2?ZQrV2fIU9P4^-9VRpLvi2Df3b${+Y%FcAhxl>r4`yY1~yD)No4BFMK{q)^b>=` zP)OWO5L3hqF$X6uUKPtlsaPjAiEUz+*oTt|F{74|XXG0VDdv8|G@?efk!#d7>Klbd zQ=_HP*63(-F}fSQjs8Y4PCkq^CK^+XnZ_JrzVV{5#8|;{jmgGzT6;W8s}FfTVU@9e z*4SulHFg?%j55=JsLOQBzZ{j~Ec?77Zsu%B_3z@F#) zokGubmeSiZ6#8}8Pdm$C&vo8_{fx7J9QHitO$z;tvx45{QRuf|Kkcl9J=b{~_A|~Z z*z=rsDD*t16!_0^-qrN2*7Uun>06`e`v--d%8PE+?UP2GA;*ZZ2T4VtbG zG+i4tT_1w3O`5KcG+moDUH{f}ZP9dn47#>zx<1i#ZPRpps_ELU>G}+G?a*|8{YTTa zQ`7airfZj`>kH7eThsNWuDv~)zOOWWdo_JuqxSY`D!m>5 zT+!tUMVD(xx?EGy2hl-y4=$gU2ZK^d+zCqJ~v0v=bj;J&&^d-x@T%C zYilac($t*`eDgGQXKU)}XzI?<)YaA0)zfsHr|HVqbe*s1s;}v~0CW{-x-QgoHPCcj zr0Hs?>ADzn6>7RJ(R4M^bX}_HYOLw{9_VVK>AFnQ)l}1Uxvsrtn!YQ4Pc0C^b46g5!-wy41Jo-^0-_419|DDKpOCsNo6ZvjU=WjnAcjq=I#sbvf0YpxTpi zJMAEW-;qhJp{_zI`T^D$dtn5$favz%W`c@HCOL|ND#Y5$ygvb^ke(5BE3+7z;@ z6~5xMsJd&Z5YiJh4?AwPag029csNq{BgQc;uDXw@5#&m19d_*MQ#k!FDV%;36iz=X z3a1|#h5lNmZgOi>4GNRbBdeGOv<5b=28EU5nnas?npA^-!pgC$Uxzaevkqq*MIFvK zsydu;WOW#{Inp{r%pEiU_Kl0KVw%xe#xQ>@ovhQC8mXMAFxX~>b%u+Osd?6aBR z^VvU)ZN^!Dv=Y0(Xh3VP#>Q}Cgz+{;~C>G z#@~$RjhBp9jK3Spjg`hb#v0?F#{0&H#=j}8?Z#)c0^4Qf2j$ik)|J*(*40)ktF?8l z)z)fnb+kHLU9E0b59h+G1gdXoHgE>U`@0p zS(B|P)>LbnHN%=^&9UZL^R4HsMb-<}%hqew>(-mrDy!65ZLPKbWqn|MWNo#!TRW}Y z)?VuytK2qh$Bx*6UBf=bKF!XtYb(0#I(A*Vo}F*kw+rkBc0>CT`%=4!eYt(5eU*K+ zU1WEEw{N%ajXWEfA6XC;Q9Bxr`q8Xt&1g>atmrw>deQu7{b)h-;^?K(%c9MqEu!C# zUK_nW+9BF0+9g^P?H=tJ?dxy!H~U-t?fwpbm%rQJM2&r7d`dO; zALDZ?-zu=0S~nL_O|to^{({~U1J|xpIZNa zvA(dr%1~pc+h-o6#tQ95RAWu;=5`CaC2FjvJs|Rz$X_FWORKTk(K?A5YZz@5ZGswW z6>Sr3msVpR_#gQn`=9!s`Jek=_+R>8`v(FZ7=aZyK`8Ko8o{Z-dBFw2MZqP(_kzoV znZfK}Zt!fdAXpSE4qgqG2FrsL!OB>F@7Ue3dt&#-?vFhXdo1=VYGw7=c;js2e50Y! z$oRteh4Cxn3FEiM?~Okge>DDTJZHRMyo|b8VXQJ%8*7b!85@m{jE|`;ZMV)hzOc@> zE--#!wX-@{ovbcak=5PmY4x`HTK%noR>ljW&p068&EE^5~V(tE1OMuZ#X5+A-QW+BMoO+9TR4 z+RxwQZ}GSJJN>=>{(uG1AQohQ2epFwL4%+$XdE;Rng@Rho(}#J{4IDscqw=#_haoVn#-!i zUBp+Ct5P}YBIA-OIqFU0ZR1_zAH-1~fTKP&KGhsmzuFwN(5i2}WW8d4{oQ)Qddqm1 z?DwpHYL5EE`po*=`qKK^I$(3#vO@`uI-5A^E^yS@;HX~2QO{-MsKRLDXwzu(Xv=8p zXxnJ}G>-bv|F{2%{~!M={~NzNhy+1!N^n|mesE!Mad2sHS#U)#E0`0^3+4w4gBOF6 zU`enn)+hFp*nP2I#vcEFA4gS}qgW0L2fKqW)hsF46MSW#Wo!$iBtlrukJOxr%4U7j+7ouBEi)-Jcv<_oTe7l(d%rI;CuXh5YL!|GdjE^54)x z<4Y!J2J;oc5ysa9M;YG`9BYrFRrD2hF~KYC!33|ehY-9vIGqW9S8xWw-Nqio-HW*U z5O+V~K8m;xAns2Q_d&$XLEKy!*B*+H4*?DXd>C*z;3I$|0DmT7^a}}tPXV_}$kd+( z`6o-tYzt~VrD$xcaNB2P3LCR3!dAEuR%&d@g4Q}AeK8lTi5jm%shWxO zO%=my#pIk?RYZN51dBs?t)n zu?_!HOseJ4(15FEv4WkVc4mw$Ba6AlHO6%;WL;u4V!qXX#JZft?C;yxv244&{X=$! z-Pyj0oo(N2-@?v`%!)k2>P5bZGSPq~V~I<`A5Rwi=fp zJF%2!##g@W*I3t~6`i~@LESB^=x&!p_n}e7XaS`+z9w#3T2-Get~uD3Qc8y3n~?Lk9q<2NPAJAEpJ?EioH@* zZr3Nu?dWsNW=q%_;-yAx51HlU-pMwRYa3h0R%zE_@|BteLBurcdQ?jba)Hm0$$6)V!Nw%CbQ<=#F+xgQHWP9ffwdJzh#tP6>s<>|#mIB{6< zCbd_8an|G{XzPyw{wk?&embcPK1fh3dus{*oq^sK#LL}q$9N;+sxHLatuZgDc7dl-J9$Mbi6_WG4V1KYT_&V4Zd=ngh2+AmQNY3``J87PI1I;vVq&efuOv;vE z{G%C#EQefHu{S3Fop37AT%;=43-mC*tACs1IXS=dd$IpeoBrHi?7!^y^h^9#{M(b_ zP}=@ADQO%!j-Wm~+Z*Zq-2a6?#(&Ho?f=&QmH&kQ8-KDt*8inH&Y$Ez?vM8;_`mjl zC!(|qs21NOPJWB6WFNA<+~+Z##pm#O{8_$;@8;#g7Z-~{Chx_&&>P|X%p2_e)EnYG z=neHA@`ia2d&9j){F(k!{vZ86`Lq1l{tN!^{Hgx${VD!@|9Srp{v7{lf1dxW|5yKS z{&W7H{b~M_{&at?Kf`~<|BJuSU*x}k=*!vah3s^qp#Y;$E9yzxTw0@aG8sWqdW??9hylw_#6u_j!Z7V()(M0q;I` zF004R^9DgaU7glwz%G(slTT834^*6_@bB{b`uF+|`j7a%{X6_S>AjENm-QrnzXAS0 z|31Qq@bVvIZ?ku(f4+mw^@sZp`;X9k?pGAP4||3!qF4hd_I(tCzR`HOiF%KZ*(dB% z>f^s=->?JR_50CtkADxh{Rik7><{K14|olKC_TgcVf-|HIzNM-$n*u!iZ&HxJfGL+ zzu*&zi+;m@%ct<)@u~cO_k0?ElK+7}#sA3v#Q)5n=FjlI@V^p=N&b3)zsMK!68e?)Isze%G_| z-MiK6qu$H+;QcOdpn8{oKU2cbO8t%%PCUM#-uoi|GQX*Rx!=rxzrt_sU+K5-uku^^ zSNpB}@B6L&Yy39;wSHUwI=`KNz2Dydf#1Qu!SCq*(C_5m=y&#S^1JvK_yzujegpp^ zzoCDzU+7=rH}Ws_8~fk$oA@{5A97dmbIR;d@hG(;LEKQs5Br|)`)ByMer>;we~w?* zKi7}=Q9tlwehoi=%Rj}>_D}U|`ltD|{2U5*rhk^7=b!DL@7MS1`RDohKCMQX$s6!X zq>fy13bVzj;sRQKj}c>-+^r9@;r>hBquyxm7v31}F>kE*OK+U_D{s8_xHrN3wKvgw z!kgs%#+&T@)|=w}&YSA}-kat<=}q_k?9KM(cyqm{y=T0CdET?$U%bD1^SuS$-@NC% zh2Hbt3*I8{MQ^e9l2_ur?7iZ>>ix<4gE!Ng;R{OtDerUN_GWpnd4Kduy`A3c-ZF26 z_jhlp_olbXd&k@8ZSp?yHhWvVZQiHeXWkC)3-3#BpZAS#`j+>;x5RtHTkgH(t@PgZ z-u2$|R(orIynlFWy?=V^ynlHcybrt&y?=Wjdt1FvyzSn9yglAm-d^u(Z@+iI=f2~+ ze#k5H%6;Y=-Y!qh|Aw>B5w*t5ZE)a0TH!EihmWEq%2xQ^L0X=HRu@jRxa_pnRyWbo zR6F|}wXuV@u+;XooZ8k(-LBGFl{ZTBdR4r7wCzBD@p^%{nK*Kk7zJK$!_FqIu93v$ zihIMv?Xm?(eoy80)4}h#$s8~LR`Cn?h17sQ=Uotcf{$6ncI9$%K9wrX2t43{o zsw^>oYFBywQI0o+y#-8OLAN%FTd@MgU5mTh3&q_j?ohnAvytNV;x5IV;ts`M+}&Ed zxVv1w^Ph8WZt^ELdnbEmGRewX&&-<4GqctbX5U&9GeeIVz?a+`ndY-5j+mt1D2{(3 zA=KO`a-wl_-KZF{5-W%tHz3rcw9zmAxI4GQo-UQ>GViHCg&Z@;6{}FhzC*sv7DFyu zz!pR1IJ0!oMC@n1CPU!UY5R3X1n)GNXJDv5#)adNXbbx>f3K_R>$86xK!zp6JiD%h zI9nP>)L;0DkgR6*Y&9-h=vL|zpRm10?qH~^|B!9G#gb6|<;M7M&zSy%`EEE8vl?5F z#{)$CY7pTPFkdw`b!P-wrQJ1jY)(X}acC)W;z&0f!l|L^=5B=%b<33YptaS>!8-Dr zG5P9bBp*Ad=v0)K4oQpvxF!p^7Jqr0RxR}tMvf=F{&yfzYXgWyn<6y@Qe;o*H$0gT zSHfBCXv6P5M+>+{DU-7Lnc<1R8)j=3RU1b^O^&qf+^hOdKE$s zONsjHv0rSnwdlKvZCo~a=m4KqvPe4fhtbZdHENLzZ@7ZBt4h-x%B%bh%vMuAN`_@I{&^_$V&++c|VR8TYo#?(5@j2;S@Xl$x-LSP^63@u}P`|hr zxX1YzwklJg%-Vo98)n&rwd@;zl7p4xeNtV^mVYM~N`=uc1l=R_@Ev8e*SS`_5~t#~ zgXzsz0Q(lncF559>^llxUy+ke7D0M>knJDcdwgG*>bS{%#qS^12t5KW%0|yMJ=waD zF$Sp4*FA-Devr{L^*s5C$LC*DTFfZ0340Zm^2XuZ9K`1v3aic4OA`)XLx+E+B(&xl z`BW_35XFzE&>bEw_8_kk{~18ORZHrI)6V531E^G3^mKk%Q#uUx4J2JHWKk$4Yd5I^j9kvbe3)0!O1kC;mi)4d(L zfhmmgI+a=XB9#&L%#jiHGL-2|^PoKM@RA3!{Cyz5`TIb5v-?1CW43|Xt2d$->PolGLi8B(DGBBllY3oPjV&8F7_c zP~VoUnh(EW_%Z0x9gQ@|ndh*+cBsgc#xRQ4&#kbQ^rtfZ$GzMbMs&$mLTT!c^!@Z( zLaLx7tYiu1X$c_;fd~)k%p__HSxIN4GC<5G(YsK@S|THHp%D9@EDP15E76xM@f^y@ zM0j(09odBh#ht`SDO8M~T%Yab;$}*sKf8=%IOhwMSX3FQ$~A;JTKd6R;!c1q?1BvizFXhG(KbYuRi+g9+Pbf_Gn^bbYtkJUK9(-T72M* zeEp>(xCRVo^b?`W6ldoL`%XXcIT06D}1! zAxU2xB=#q*$|FSSXR-PqgizHoiKY(s0749IEYSa~Y`#uUhH`T_6=skt104WXEa51-f>^4yYEaa{YanaJ+7SrwHiJ85=hYP< zJZc!FJm$G7lcm~_E|67puMBR_RvmTxC#xItVG71kHDh|JiXRgNgmvXi8AUObxVEUa zFm>LQ^p*c0gn9M0p_Ry^K^8HUpGISMgDSB{vqM(Om>gXvv?ILYoJYt<1a&8sc$FTIE)#4!7OA>rJ12K#^P=TCJ9zWmWw~Pt2)b!SovLGIRgch7 zL?w$}oG|>dtQ~CA$2!hsTEOmu`S`MyouIk>l9HW=`TEkvu?6I@R{Ixhyg{GgQBJ-+NbbVfPgO(h9QFFhR*EMcP^%jB) zF9lKW`UsjdPc+d$jHEj+Z%*cqW9ZY54uo~|YuIb`5KHGtz(w`P?w<39)*?vC_tDmQ zh?cXX6A`#-pT~)e;wfNt@I>O4;O-N~ms^s!tq2q9xY5L&8}TMO<=B$&N*LwzlAvSE z971Jmos5$4FE_cop}c`%hoX)sjsh6-K+eZWR7rsZt3Xr2^0&`Ht>;4Ne530q(@pRV z=@G5rKVXpIfjSb1JNath4`^gqECh2zFbT*V3KH^H6hY=FcsEK4)!20B^pv!|gu&kAH=t9f zR@fbMFakLmh%jIc-Wd;KKpq1k4CI1oMcg3;`+zb6xS*|JoXH@50C_Zz`X3DX^RT>e zg}0FQ|Ew$x1dZ4Pb;L*o<5TU+BcG>XR>rPfTl5HMbU~Tvh8UD7Af`Yjs5&SJ47nDl zGT{m9|im{#Nypsc_aC@1JGnEp@UjF{Tw4xqJw7HAz*b9V3mXf3b> z)(LS7x*s+i5mT8w2P72e34H;x1>a8;&Wq_tE+4=IT?ZGAfk{R#0`d*Khq-{?LhQ!~ zC&T>AEcBWAT{l*&cneSpbl_!Q@Fna@^dmtyn_NQx4{+5pd)YG^#Pk3AorLAb*bxE~ zlkRmlb^C4P?bG&`?$}njzU#*H+N&`nPs>}Wy$Auz&~{{e^s8w$Wnng#1a?k7 zj>S={*E4P9saNDAl$N>xe^u8k2XY15L}53V7AdG4hOkSxkbL$+X?!s1b7wWj%j z`E~#Dy3vUD;cF^W_wZS!Tg6AMO>>M9gMI0nD9+`VXij;Lx4xUv_J!sHfiJWM9y8-_ zP0mxonw##dyJTjAVQXwh-Wf-$#N*8ylVRJn;t!BRLJNxxH^-M%fOxujQ~kl{>cjW2 zB%Mk0q6n{*-jjmnN5Nc{hm+S=CIk7mzpl(D-YXIWWg|nin^(q)_-E3;Jw<~EItSK1 zoNUwyP`2H{YezKoB>$AT=SC~_Q=c+YGN_%%uLvQFm?4WXg~phn4ei=?6E1napttzu z_I5ElIM!)LZ%S6%4IC*B(nZWl&^m>DKJw0VBC#=ujE($<$5tOj;8wKNy-60vCtjG3 z>&p@^t&!hUb-)+g9y_~7M7*C%LXlX22^q=QW#n|L=PP2GIQA^+L42e{;6OH`{gLRP0AL^knNAZwf-FHG8Q z@`*}zZ+=+ueKfFVv?L9C^Yu-kUZLE=xMe|BreWxX*b^6&%FHojh3fve53{wvM_*(z zPjCE-Qq`p)_#DEC`@|J2j?#qk!W!DZQ7;ZW(RsXPUQxt4YbQ0ANf3_csCI26nQk~< zS{E+ArEUYYeInzbwJ=d3jKAO3rk|HvExi#QHl0vTx}I<%CrnN~0Cbn`CzrIl_1wNw zdej~mlh_x4C4{e*#C4IZ_;yp#tfADFFW2z!=H*XQd2&xIzdS$gvaHlm4>Vok@dqlWqJ`kL`i%!7* zj4l@t8F(o+KwuFT;LzVTi90+dDJgr?_t{z03(u0{`Fh>3C5VQu=!etrD!%L~%@IW9 z+6y?Rc`!wgn|81J#;mlc>)6(G*z`QWv#)}T*{4zaFD)~Pl2&pd(H?(zEK2e<==Idt zGMt($k>KD=&|uT{ZTK$NesWCZUV7Ez?KR3Z{+ldzeZpbf&11F(JiGMb$(^LF&6|g< zdl5C##MI(!1MH<86m4)<`)ngKXZt=oqz~{}PZ1E=#Io;8ASB;qZj>029?{l7q^Y2; zpmCIAzxX?AXKXalF)&s(`@yF1ptJbgHvfX&ch3);&p#z`m!Ix_9mZHXmNW2&pyjjY zDKpBG?=h0g89|Ql?=-J313+`mv+8CL!L-_V^deLvLL;IZtO4pF`XTfoa@!Bp>kq&@ zn^ur)6^9(&l>cX%>l1xgVFo7b2PLpWJ@%WH$`e-fBKa@cgpM`TVK;)lNL?Ko;^b zvY%W$Iq$EqeIgQUZ#Wwj6M#(A8}Xga7YQ&$tIb&oTKTIg!E`wn7LMa7x(c5k@L8;@ zEu)l%FalA6Xj---u(?4tp;N|7ErM9QJU*k4rA%6hq9k#!kl$KzC7z{_?w@pZKy$r4 zO`j|Ufix+39N2n?p5wy?L`zN!%&Y3iHk;_9#9!cLMalnju@o- z-M(xr0kbRR6*Wk%l3A+4utgSOO6JUg<0|+K{{VgJ`&9P2vmh213KyZqeHjiWd)`GJ za^4f@E|?Tb5l#_C7|9#yn(g4@l=)Oa-VjI~q%JlKiVH3dwhYLD5=Qn$x#s#tdq6N% zpSKUH2i1$Yh+ToM05R4;+<;e9T_jyNT~u#^2Ape@Zv+RLQ_fSid7ttY#TdmZKow$+ z0UK~t(4Fw!L=CtN=nbUT=-*%u45p-}eDW0Y?g)y=yO-p}QaMNF&$Nt~#qa`j16hu> z;_w1j0#<@n0wWKbVN0n>u}e8iKa?^akUc@MsyM2gzbArM0gO~cRb==b2|gE+CEH3- z@IHVueIbe>JG5lZi2x}V;x)_xo${AFLY0B&Pq2P4D<~@nk2nn^4Y2gH#r^hvb|>IX zOS3Ui+-a#-5WhN05+l=g+CeUg%j87Q`fTfwBfQb{rh3}$ds*Ea8@a^Jju$Y(eM<$s z;+2zrWii(*urTRD`RK-7w5iwkdwN2;fs{7G3kUC{-iRTzhbiO0s5{v8d-sc7j!n22 z#05F)OF!aW6zFsGZzt&7y;_|<8d>q2km)A7+P`*Ly}@osS&_U&`%^aS;k_aQAoyeH zdr_kLK3{fL9AaX2(d%im*IC%M7yNlfo4{1B{ki!%0KPm$2QRY%t1~j_csqEP_@6OD z96D{{wk!-CQhNO7h>+Q&yW`Z)UB=MJEQK^8#kf{KU75qo6I|$=nH4RbO^!EG*H9xa}Z-oBVw>BBL-4d{l;WZ->BC=@$2yI%zB<8xW2f(ti5rO z)I-gC0ysAlIh=F5cwKJ3Yw+IG-<)f4I2mMD%D8Pz|Tei%w_&oz19nfA2c0HH1TAEURw_U`BmgnA(C*iNic3cLFp zx9Yt-E60^Br*(q5V+0@f`}IPltLyqU=R0|l1o_NWo|Yv$7Gij})FCAP3u1eRebjMe zBQ^SZ9P?@FSF^@9ZYLAnDI)G4Q_q-kXU=ag3Ubu@%6>hRJSU~d$)qB5w6iNaXBR(r z0>!U3+-?hM!d$!~+PtN4Y4}~cFfSbiXJaArTD-LX60tor2cA&d@Uu7Nsk(^2` zCre&GPqJ!}&lU-3Rt_!|)dgP)l?>NxhqIU^6r2@br+O=giS!p-3Wt>445kV-eD1+( zAsRKmkJJ$(o`z73_@z#rLQP89+)sm@01Uj;Pn{(DyUq2Je)H6wza@hpUT}wB{yYUc zkqS^TwUG%Fy`+hOI}1v<&f@?bqVx7id&MAJGbTzAgVYgl#ljW1GIi z^%44eQ@2RaH+v~%Av0|`hVoLTbB(&f=CAua2Oehe_unv+ivD%yw0M3GRwleP1W2hm z@Y*?Ce>BIX_Nn=ZZhj=Ij~|wVNN6x{PcbyWXGSs5Mh)~h+0Y7S^W6VZz@`v&KQVr| z+%;MaESMyFt|MdaEA(KaQHt`rmrZz*453a}s}mHLqsdnHN$n6h^EZ2O~T9cHJ3pgKtn+zKGq7C1&n?lcrMrJ8+TQoea)O{!aSdI3N zZ8q-fKrW6cHNj)Gn8lyIKy_M#lW9R&t-E=9K7H&az{xTYakbN7g00oQpbpIw5smTb zw)^2AKgaOrGXJWV;Mzi=(x!m{{RR0c9%5FMRa}zRJgPzNeHvr@yw5}g7&zpmshJrK z%XzvmKI(g>(B9#Q(<7|NU3QmnzbU<&(4-3^-ppecw;G$fsUkVko2W#AEWf@E88vj! zzIxv$EgScV7~j}v_Jt-Nl^nkFx!)5b8&_8N=RI=le80P9S3%_jXAiM{GS zw64LKOIv%%%W*s|g*ozSy-njZF8~4mx9yx;s|gevN3D&`xw9U>f)`{w#0*?VAMP8J znlXV!CVQ;LGmC^LrG18Ey~ko}3X409Ywl1|v~=M`iH>*;pA%eMDIbU9H03j|#$pbE z0x!^Y2Hq|Q$=Yl&KuSwj9D2h2yI9%fkli(H_UFN%?Q!0}C&OydB{N-C!}E=sxc$fO zK94)jJ%`_g)-OXPwupzhquRWyndJwfs=qp@iye;JvXPtmhyAgJHihD3hvbv3(mH|R zkx|Vp;5*mwK{Rn;QCcKj@b(!!t|H~^_?7Q`EgO4&E{^0+;1W+J6b`$mivs_oI=BpGflVF(Q(!bO>ab1%wk6fVSx zlHHGZ1{4B|z|6GXWhI1urCCpjSkF+Mkj)C$U%$_B7zV>BeP`y1vDwN-<9e-mzK_L) z^dc%gA^M_vm64WfOfc1^R`0KpsL;*<|J!Zu2x-hfE?3qj%OJy=<RL6Tpk`r5MNT9+fgX-b; zgiS}~IbG2O8nM@SDoxP8QMm2Ur}GbFo^d|iVhY79+G9KoRSfl$UkY*;3<{0K|_Ww^7BgJZ^$AMZ5#T7=CQWUTMFQs$+mZ2Qp5w+n5Ns2AFtTP-jgSpf-$C-Xyb80Pr98mH!I;|a$BeL+oQn@l=o1l+21Y`8mp`|T^VgM8k8-zT4Kp7qJ{Ww+6e1%A zqFFwn`mlOg2Ws9_l3|q_#e@^puxqk|^3Kt{&(H^snGlZpqY zcy!%6WiGpREjqyJMl^=Zf{2k8&8U7Kkm`wy^z-uY2}{j9jW|{}&wm+VqSFy*EIRNX z#+>cY-z1KcJ0^9n7#P=yI!!upfl-duznM*kwNVs}K|3J+O!}*{uh0Re8mtF8_2PSr zbdo87%JY(JUVvP@=IUUrJJ>0EQv@ySa8rISod)Iz6{2T_<4u5Qb|%s zWF$hYJ7qY@ocPV7OJ!YT>t-*r)2LYHpUHGqg|F~gdjK8CnU>K z>6^9D{w#Aan=o|RHd&&?y6POuW72gh_S5nZdMCAejFDM4QOA53b&*(h7H0gf`}OA) z!&Oyj14K9BxyA-Kr9<~y-KIlbszz7%Slu91^oCQbDl=H+FrUFn+aBph;NakM?lqrA zM^gCn%ff|rXJcwJs|2iuzDlc95#gtA#X_v664?u?C2kbNOYR>KU99KgPjJzTU;m+t zNc<383L#^DW!J^#x|O^M&119RbefxQpn98YjjZA+zKdGNAZQcFR$dc!T1-0>-n|Ov zcc^hT&9_Mit=voJ-Sign1pY<#ThoT&SV1z}h2mGTr6tkZ@jG4vTK_0Mr;x6PV`oI>YCTkqA@5Jr8geK6%HibMGi)5BG^J(L^1mFXi6e4c+w_=Ku9~d%*`nL^ z=ib)L(mwC3Y`FYg(VKCY!A@V(%W^Uq>#8vQe(X4w&(SgdQv5P|0#MymO&eJHwVTat z7qkzpz$X*j7+Cybi0L+HmJmLA{5I4Vk2f58p3gbFd(|Ji#_`uS4P$+iJURz2!_Bj6 zKkt0%4?>RPd5r3j+--HIT!_Pn-BRZSWtFK%;vdcahN*d3G%0A3`NcJ<5keo)Y*!_S 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%0A7# z=ceMUp)~DUPwIZN)7uNH{H1U?PrtD!nPBa+2!;17OiIuWF~M7vqzpSI`sfkYR-v`f z$zRPt?ayC+P=38VvsyDMTyKwr*j5PA~N(3rSvsM?*l+8Vqb-vJO3Z+eX>ha zk#l=Uax&KK3A->NlBe&hY`6y(_cpNhL)`?W4H5eRTgGVA#SIs))7^Omv!Hqcu5IF) zbN^~8lWarlYeUtK{)~in4bTjrWv* zWZ&Zkm{9-+o$@Qhji*MdElzl$>ESgwVW&>7SGiTaikRZjG5-KP(HPFjOHYc|r9y_q z$cV!q3Ll39QT}SIRdi1(d(zQ_6i}(+I=S|OxZb=;f&xHZKB;BKG>Qtm?ktz$0(?WGb0u{fXa^#=4D+sQ&;?6FO$adq@k>Bd%I6yMgg{wVqVm4rMo2#%t zxl3<2u=<0M#8tk;{X~u@utRSXn<)~ z#Us~CxxNlCK^sEQ>lJpnQLlUY(_=!*9YKs=P;=y1<+$Le8b`q-$)3-_kvWM@Lvnx( zgT83*go_(jg-1>E{-V?aYsZ&dWStF{zpoRu#sMzQ@xnW#_Yhqvl+q6_SfigxeYt8k z#^Cgw9aGlr1f6S#PU8U-;yvgLD{0h{Uzp$ow6{Ismbb|q zfr}^yYSNN9bMp(6d^;?R#X(4>PuaD&GH0{6WIpK4AOU%3J63nr=Ub6`f_DX6lv~w~ zhL-1lQL3e%;Uauo@Av9$8(pV4ll}h?FlE{<8Pqg@or(2-s5?4ikGOu+9n^0S6)Rqv z|4ZG0YvUF$gN998hrPY`19DdyDs&F=MKm7=49KWrYzal1290kw;c8E0`I zfRjSL?~mDBdO-JGTnj$n`}X+o-PG&z>-`vC|3X!ElvAvi=jH1b5amT1rdaF9$8J<7 zUYMr;_4q!U2Kf9##@kDaoL-Q--Nlk!BKx;whPU{H-1kCa(JwLWn%nnHu=lZub3R}I zf{!-y|3F;J|AM&gkAgiRnwlFa@5y>>%snzc_rq=JWR}}8!3WyAGjd?x?D zMNUO(E}hyU2O;yBqfK{5dS+;%GlZi+bj=fR8_?1e26OH>3uD@PZ8l7c=rWH@dK;;w zIS>PA8q5v1(3K|)rNO&=Su{uc=1B5@I|{l+ zCayBsq3*we=`@~b$KMYQ+wN2(VOE=86H|V;HV(&4hA}h}~kX;=azZjnU>>Es8B(=hkIg4eKKvnddY8%@_9z#y8JOm|3SU|!I5FJ4sM#c+CR=iTii$CR z>trOOF;wl_wTWMOVOl(|bc-u%ZcENQaaXTxLAJ`+=WjVc`Pn0b!*cl%Z%}s(EEE*&&1=};+{2o~Q z*S4U8TWBC_iPPf9oJ7Bv2huN=$p?^N9(;}ZL$^>=&XO|uEosi`z9#f8b|5J;Si_{2 zQ|h60kA4mX>AxVXxp4@s%T!Sw@kbSd@-oU6QS(ru*Os+b<>8*F7e zHMztkjl6lPK!9P9JcWeo5C@ToPOZ4Eaibp=MWNKU86p@lsw?^tvZ&gMn%puB(a;TaTN?58B|r7tZ^Zv66t_wzP$FT zBL1Wyp`~XD!ZX_FsVkn7JRW>Vm4#-{9}Q)rH}>!#6#L988PX9^I(#DZ_aqu%0nR} zLfXe{(weA@(hftRkOIo1!b+haLPSunK*=~p#5B;%dTYAhtO-7Ky9T#4xwF89IJ8sW zEUIOtv>aY)AzX{!B1!-Se#_hDNws!e9}7^f4lG@Vx3m?XyTHFrAN-{vk`^-4TYiU?j> zom#?)*kDrby@43g8fnssO?=n-0?}3M>D6jV{uX~V8+XYv*Znc zJTxSTZ~IB{&-Vbyq3HySQYqWUQHhRUtCbOCwA@r}o`8>ww_XMgD5`$_s?(k&TTj6_ zFtetxNqppQOJQm^A&tuKR-}&({uL?&l6|%1hX(c%#Bm5<<*5oYUEvxaKRWK>5Y zRPHh=F-l&|mC(ROR5cftmLmbmWXK+FR=bJacB5gW+ef*UMq!8h9g5l9Ud~7DsEND* zqJEHXn;zfp!zEdl|62oT8R5!!9`<^&I|YPIfs5dM^ew|?T-dcW{hwm#uk7la>INvn zhdz_I6OS7}vSrFYYf=}50krw$?!#cMe z_>fmlvh|B8J{J4g_4j{xE-h=+cG@A-ckcK9PUI?jjgIR5nf+(4DeG>rT430WNjr6! zTrz*qaplO_i_mA&*`r$F2DL=~yDRu4i}Stv_Gt48KpGgY3$=cL9S9Sr^~E`94maL+ zA?+df<0iUQ+pM5gxK(-}PrWv+GL%xmQB4PGFF$i@dw8Mzk&sUf3^j0NmxQ>@NI3LfU#Sa99D8dA2{3gw!BFv5nb4VDg$ zcO!@c2(Wy$^*~4VhJ_}ivV!83;S%Qtq^7b0!&CzvO*9|BA>Tc@HT;PV?*5t&#*XA7@Ot=j($4iay{B4%08V^l5DD>YIfrr!Z$h* zuj|++9H3|4zWQ*j72MxJRx(JS88a&Q8Ti)#_t!Ke_7p-#p(q4aa0QO{A~Q~-rp=Vs;?%3U*S`zL=Q&w3g(NyFg* zA~Z4K_9kP)e1JK{on3uzg{uRUH%T#Bt@rS4U|;TL8^L{S>cBDZ-ux|W4(48~j@y+U zuc#JFB^`{IQ5b7(vvd5MeQ&F@%hKTxcqDc+yX{B~q+O_otqOV?m*t9MisQsn{h{<{ z1Yu4_n&RKj(P)2PG&+wYo8xhz%6kC-e%3Wv)Ap(M#zg89;T(8v3-9oZ;Sj{>K0vd_ zjd5K}N_$kvAuceUr4E7vYA}lkbOF(Y>e8=s)%YTOkiQ@FwB(}JA4)~Ex32b5QAkb< zREJU!5Qv)pjbW8q|9%~bt(^qQ72Boa7LRSdHsxEixYpQ=V@;P(L1PAYiU+p_cqJRb znIcLD;7Ad}DW11GO|%@{>a<5&5o~Rf_2C|F_nK*#>5&=wMjKZAy1z3ZmmA)Fdd zrgOUuj^u|o(Qr5LSl^|91?4qIi5AasNg}SBz=Vs}1+sOB?>k6PEY#$J51J#RGpAn= zu&q=rw&W{fG+GH1yH%PxxnWcRKtiA}qy?kj<=(YIOteyHSMPyXLL=oV!iTYF=RNY0 za%b5~8|N=4yRqyjhu|?4$I^sEVQk5iPy=B}=@-euz9#BtcIYQ1Qvj# zltmy4RLYl%eEk2d8}7ai;42p!NspiU2S*`uSwhdJ6$yaOsO*<2%CHjwwhDjUS%=o6 z-QcWl#=0zfjfiW@vwa{}lVfw=+B3_V&f8WxK@h1LFbrGwF@U-Wm&3(^q@(%Orn7Ou zr5ySn9~T4lYH`Numz*ha%H^rkvCSs@eZwwT9&(Tx)^8XMMUDS#&x z=gd0O)84NtRMDl@TW0hD#4p{@rdQ)Uqubf`)x3*8Z+#gTBQPWuCg>j|8pgM0X>b1VCnbT-6}274rh`6TWS9Y6tHCcwH?ZJnyIa6g1x7 zZ2rv&g2Q0mW3vz_@E5s(fzL}GI1>Iox~)CBOcayiiCNI-z>Gaf975^6x^a~&uES=B z@2o|=dSkC<#)W^hN5g0slZot6`OJKVcxU%{IelgKvFRFHTd@;e_l^zF!SWF$^IPbB zF85~$IkZ_^c-nper0)Bz!4?l^J$ItWR^}MPp5;h6;@qd!1ekQ`yzypa34j?BaobUS zhFw*TLp+5d)nseWa-r{zlinVzYsLxP5TGu}0BB z@m(b?85r1WfggwjE1J9#LIFyJx~}H8%<6|rr@T$KC$z&Vv%=8V->2yQ!ORe9SJNe(ULK` zh&2UAZiA=-Y@OHn`kK@#uW<_B>rlG`u==)TDe;MqH!aq(r8qzn3rz~vgY%da6FL`|$BVH(Z z6YJm03c`PJf+|W((;hc8MTe|<;BDkE(*>l$tA1f|Oe}qALopqsC=)8_-~`nzn>BNGr?m_q#t)R?;l{f{u+=+IUZn zL1EXfCvvz#nO+OGK>fH^+*Kj+%j4kIi0w4@`}J^t7Gme@;js3b7YD#sHku3I{W#R+ zw{nH#9DO)A1>ghz8S_W`P3?cgCvj^i`wjoB;Q6@Jq(s)65K)Qk4|_O+^=+bm+fw%R zDYWPHbg@4&ewNzBv)q)xL&c@Qy|?`?<9*c_)DFW>5*OVZ&~C3JwuEkUYNGxo^R)r- zlfh#p^-iX+)OUoC)LtvZ|940ryU^DrX?1yqWbiy084S2)vtJmEg)3?v!e%?nBDLx( zL>`ArQdx-HI@6GZ2%Fc$fb??HB$E42NJ~MdfU_!U8Bk}+C;6X{c51iwY&VYo`}OYd zbnw=>U;*E04Jn1NG>E!4Mmr&eOP{xeq@+-4)9DR*rCVO~tYIc-h0`2>hy6S$3(3V} zB>A=mh{}Su)lJsGon;C~X}3)#`GK@Ai{6S(cLA1olFWLuRMde2RS@w#XZxilr-_jlcQuaD8cbYJS{9y*ymyj>G`C$9v|ZXYX|Y z-DME$aafN6K+{-ZC&VYe2iDZ={56{BT4*<^ZXUeYdhWC~|DMRUz_r>@w{Qj5b92NS zHL0b`br5Sj+s%z(HY7_E^KvUTAqvN(>=El;z4s{w@@+_rL4HG>2qmCIpw^Tm=}(r6 zE0wLP?yBtfQcd(JaetM@s;s<@*5C->ft5bY*l?B=X>P_J^yqha@%gLjtxu`SEb-_Y zyvlT9#7xa(;yt)F^d@j6n@HB)4E@`DQB`WrYggLy%*()M7DRxee^D~6f!c?}lal4N z$-jT0K}{odSS_V6eyQ7q+e4~K7k{ViEArrS)yXHHd(z~5Jfubr&w#RrpJhn_4Rlwy zl_Bnk;~sOA^Zt$$%zaS1MX_p6EsN?BxLh#iH#O(}VD~Eh>4!Y?vlGbR!nA#+urvzE z4mfJhNHs{j8PHj~^aof7XYgQ5maTo(>vrs4OFeT$Df(up{vF5PPh<>BZP$`p@L>=2 znba#(u3Vbe_b>t*=fE)@z&ZW^E$rNqiZCT>?DA+*3aE}q`gUd^?98VyN+O`elxL<~ zFt?AV0#>WM$u}yEoAnmX@NVAh`@mG@4qbA9L(S>T2qay(Dp0hLcxnZpjH6si&{2*M zIS+nLjGqMPo$9xJ@;{WZm;~WnHUzOWK|G?Ip9w%&D<{)6pIw7EJ=LRUINULqB5uT@ z1HA~QusRCfgclwIu*IhYDX6U#(|SJE(|J+Gc+9eVV_k`@kX`7Tff5l;Xp6<{zyq}5 z;0aPmOIo57pTQY-PiCdeY1HLPMb1r;Ht zld)hwsSUqi-xwe*!hD?K97=KK9`8mc@cNi<2+2HN+gk zB(mur)^MJtKyLaRZ^jN@Su`)B?yC?aH0YG~*?p%yWi=5cwYLeN(F38kY5+j!Fz3hT zy{T@4)dY;8JjNgG8jissq=gr>C2p*YKL-rOEvX#*kl6x5=4}NwTd0^Z+mlQdplSPw|#oQW!gOE?MH14V_ z%OhGX5C8(1|K`Khvd*m~#Pj3V0dOd|HmH(ws# zhl(K-L~@d*>C5|LuCtBu5NpoQ7|KpS(e&xs@rQ3=uLEgHA?LS+n(m~klx5_y4CME(5v zE@RCEuB3vG^z7Zi+IN=BQQUWSq$NtLoA}7I`-*3q> zM$u;ArJY!49Mo84p&bH8%XZpo*ryr^GGw>YzEi(Lz&v6DDj5>nefx`1?Mcwy+&7#P zX>2Jkc_<45$6eGsK{Wb1KV0jA3Y9~krCK~6E(;LS8ELAp)~Z zYE;)WBmEB*AJx-l_#~}vCbBXqjn;Qf!{8Dp0RG(`U3paOJu00`Z(TUt6q{cO*n*BV z=QvzKEei9qF!_O?t;llLj5QaQV~$sm{6_n93)M*r5B=iIv|_rWynP%S3EU&#slssN!=0XfS$?vK5&7m*+`#j)i+5T{JNxh?4z~IxHZ!b z8z}Wj3>rheRi^&;T-S!k9_k(46a#s>^v%y(Z0;RC+}eNJ=8cCSluIyr-r=*sb`#J^ zR+HA8qH8b+6;+#1V-$jm6eJ!z<%S?nSER!UC-h4a3zszC-?|vawjuB$2~369Nw=T7 z?K@G#+_u!_ofXwnRB-*PLTM{PkncMW!(TLqpnBbARa7y`;W$|0gNQ5ehJ19p_~2W| zkQ|&Lpc6JU_EB@iy;``6vM+| zlKvw}0woDw7n?K%YSd~gDbP(qGqUTqYfH+1!YwI4HGB_*7;0uYjC<~lqP38z! zK0ezgr=Rf1`4=%o${k6#nJ!HVu9{~=MIFnndL-?7O~4G&z%DA}Bq4$ZO3e(*6C#jVLMn0F`xAhvyJz9Fb;eKZXaopUqBupduh3t z&zrq0t2T6qq%~ua5_IG)sK&S{T+^KBrt0{jO%2EPfr|=(?G1=uY{Hs5XN_>M6fwok z$@jF>Nfu958AVn}!8o-$5&gpJAjZ@k5?sdMzGQCahp9d-*YR6KAAc8Zp8${u?< z3{ES5TZaTp>l8FqsYBaw+;B4w(B|mW&)4QdL0sJ$_CuZ9kjB$gXmBB0mL946nju;u zN^|~Qci}*~mkluINk6(QkA~bc!Qwp8jbnSuu#6I=4^n-ouMP$ujWwAdAFQ~%J_Lvs zJbyVn*pk*)x`wNcyMUwZyF!AK_8&anon4ntLdQekPF6L1D)!C8c-@vC zXh&q-B>*|lRdQ8WBzcn^B4!wI5vq%gthI)MG0&n~Y-`{*M=I_^g*eRPu^m(k(2_-@ zzy+F|q5;@1GsT?t&Ne5gR)w*W_g-v3vb)*d?cbhm>=^?J`R9d`j&fTHIpSp?Z0}>^ zMA8USl2xBVuy(#4(RYCggs1i@33vV&iv0FrwY1;te6@1g?`kmRyodqq#VloBDT5(I zkYq1#f)bfc4v??R!?vW)a3~JvnA&^ooWkVdqXT$1;2bc<3iZKO1k(XT2fQiCqjw;+ zY8}oGA+P0^v7Du5gH-E$MyR_bfwLqjAS^Y1QMtl1BVwp`Xjo~ee1p1L=n0hXiN99! z<{X|d$Hyp7%I6#J+xI8BH#7WrP70n0ZLT&kQH+iFEfa13Y}B_YWp|s(pI>mu zw}>P3bp29@fe1?N6JqGKECzP7T#VYw|AC)L%eU~Kz?J=fU{+Nq$~0dQs3`z5EBk+^ zW3P3k?GHJSdQR1k;D?BNBncSei@3wuVdFQAB)k*5K0TTGyTt7~Gn?J$Msb#=% zY9!n;PVs6c+M7}v9MLla0&|VBNRA_@2?0C9V3CI#1hfbmCj}xud@04papc$Q$K(6r zb8RXAn@TY^NpA_2ZzKfw*GfwP_44Ml@sH*h#!**(*Km7NCKzk=zcj})#>BlgVFiP< z0JP$`Y>L;p6>!NVNBSVCgv}q#aetKnUp8`c!Qi756gk_8%tlXyce*BmU>E^<;26`Y zAu&gFFsJrzVNCOo-MUF0W5Izf|Gi>C=nVn)!bC*HrmKebk-Y`Q4|ZKiMcL?Bia%v- z^ve!h{Mz$nqFhGFiu%8F?9Vi4zGf!}kZmi)aWZ_my9#4>)Sse-&s)nK`=dCv4sD6a zpSBng<0797V{25%aLgQSljxN;`xk+ReHarvLG#m@hp#fBWPxan>1`FsJIzhn=5R5N zgS?G-2$gEiyeNFB2vZWrtmQ@q`|7x3N~USP6ydP}$5_CPs4`_N54Z`YGRydkn7kCh zKNambHWuF1+E6#seOSD-);Mj6v{8aM9L2ZV--}Q3AV`yX}J6duHlP4Mj6$tnpr#R+DLv>cp{UQ zB*+v)llb-Xm1! zH6ol;1~#;UIiT3e$ye=Xu| zlV*|egw<@@82}vavg1j8V&Q#Lv&4#QL5zIbXYGsII#74blsnb075}{`d&3Fq@N z`U>ZB1tSP?d%edA5Ere2VZDo7zZ(|Bkd3I-W=E6tZHJ@3(%xl{)>MHl08)O@E;KO18ZMd zR-$5~BY>A2$wy+HKO0XvFc4X#K51f4Mc2gXL_P>454h>?r-UGDzp6db+aZY;F%;f5 z=5Or#9-ty6fv6fq4kQMdQ_gCRY9p2xHV3UArvb64TgH!!lBThzPc(C-smEvst4tc0 zNDfSa1`yr@Nk{H2uA;NY<~J=20eo#hNt0jeMz$QL&n%>nC2(uUX1elgCwb7sDf?z8u3nZh1+Kg(f{}Z0$ zo+-yQoop|;TD^!85~Csi=Op5xw1w3w)LZs%j8@mBX}#>`=owWS8AFPZmQ~aj-jU@) z6VM3IFHvYFQm9GYErvb+SPS*`@+i9XNX7y*tR}CTh50v>ypv06-|cf_!k$%BlMqQM zL;zQUpis1>dfW!g7Xtb7penCbYoqvd7$8f0dUOSKhF+1-MYlfyt{5a+)Dvk$NQ&+Y z+%+#Izb%D)3u)P8gUsEx=XwNTN!Z7T*-28~1`BFs3jF#g$e=4V#9rS-KLUf{EW?ZY z1yTwfB?FQ-zj7iK9tOTjzEKpo7mhsN9N;i$NC5MDPF%pYEX=Sd^2sECR0siIbWv&I zwS3NqkZlaewu|}NyGY(mzD%&+bIZWyG?rZ3+Dg+jV;G59FM1S3N3Bb2-`XceAh)p8 z8rd}^V(q$tEFtyxB8+U|g64Z>m4B&a@oFly@_IXbfBi`M;E@x&-*_%3(FlTK2EaMk zRHuMY|3D8_m!ETqy}Ti~AKZ@iAPs;{nAs^y{=tH7`$9q2NmomR?d0NivELa6oh1cup98dQ0tIQBJb)mj_Jk9@Xm+H zf@cv1le3a?e&u3i7B_(D+2pZ>eFBbkmDc;+r>5-Ha|H1dvF9r{es`B3p`B}%SDQsy z9IsSssK=Afy*SDKK6NUmx`mYE!yf7c^JR@thcX^iUW@V2ARmrs&0#LjGZEsIlhX*b z;1&Q5aM^~xQ2VF65&f|t8WapPmVpMWCshO!^&)tVmc)Y7`TA<3AnG7!^9*pl0Y#ue zdvXJXE;Vr1tlyTPj7&%Ipxn5CI#a*&JP;dE-Eb8U_xF2%;+jAdB`Q3FQ)0CerAHYn zG%83*0eZ>y@xfEjk86oetz!X27)xhUNsdR2sNHoJMg>tkX({iTu)a!D=NNl@gP$LA z`^V*j;drEkxpc>Xtq9fQT?>$T)6qqE=OPceU(;=`JR-=U!1*J91}&S11Yu!ZvFrp* ziv8k3P-;EreHE_Q4_-r|lE|)6+kCU6PKHx&EL5d)pq|Sd+B%d(oVQhn7cFkT;yUND zqRMfJRMZlK%0e>M`U!|3v2 zE1H5z%odivlSP_x?O*Uf`7ZGHoowgcRL7QH2;>*Wn-c?=Ev0ks)wNdq4%t)e%y3X; zY%Tn!R~D409PR{cDZkX1B7X_SYa&|}2_tWov?nfZ8`(wH0(qC;zJX5R(5uu|;{vfn zMM#$h%s|qSbXr zuO&_INLl3&qk;uWkNFw{r&=`T_R1kjf$Z(c&yH`*f>-x7BLRdhXve)NnWeHr{=hE; zZuDQ1xyKBrc4Aa{a-&K6FMI~pPsd1EqxZ?OAM}9kV)?w0VU(m0x-)}xn0`^k+s^YP-{*R919OhD*@tY~3h`B^AjJNMm8PWoI zC@2pF-U9j3zMyY{yoiXy3Qd{*#*230+om-We#t`@CMSS{vZEt+E0$!NF(8lavahAT z&3Ml6J;txlnsv8Dxi`)Dnfi0>E>4=@u6|#Me+r=s|0hC>>*(&-Gc(&2#h3fHoDjMj zXYP`(Eq-@X(AH&M*>oVPOmVgN>Og(FD1vTJ*q>fTpxFZg{EBVN!O4|F(7u0M8XkCy7&;sJ#8h>~W`e~cW_ zNNWlOIl)NrwQqIintSqfTBC`ix0%9GpJ~2sJ)r@H7+Ys#@)1o`4^iC2{CppW@%Z@I z_9RWL(+=(N^av86A!Ndo9G~t?or2#R&4m4Dh{1Bwni-4Pi&bsFAy2BY;2*}d$V{jJXV^i zGHx59wSfDKagJb1>!LF^E?+G>5ifmi57~GUD^rct=GQpxJK^cPj^m+Of^5-q4h<52 zG#+x&(|v-TU#XG!Xo%3+Ef9mnmk)}r)Z+jp!aU?S$B~*wBnN&Q`*f4@}4D)dyH- zclqR2YIj0C4?Sq9!L|+l<;6)yhc%&SCRw|mymAzLinQlS+%!YLdH*i&@_XReq<%*b|=-~U8 zY=>aKK4?Oa!F8`F!DoKW$g0fE>LHQ*i+PQQV}|}St=5h1cuURZ^=4Xs#4|oa>i7LW zeq`;CrT@))s{TK`rz+GVfQ6Bh?Z2sck9EgmkJ=EsSJnT)t7xI1C-mj{*Id*D*@M5C zy_odzP51x(hEP_bi$-54{1eqMQls2J;`kff*b|YYb8xTo#NPwQSJEqq6a?n@u_G@WII6@~v$jxPF4sOPqOyy*UVO%R!FL(y}%*kIA+ zvEHW~MjvHF-WyWdRpEY5`)^{r;se5a9o$C~C5Gg^kHWI|5GK;zFxGD(4dl`U{#xv* zI!PGdzdlP$w73nZOUt$y!x+J4Gt9+g%{!x5&ria|PN<}%ZgD`#mK0WKl#b@`6e-Ae z=Mvbc!CnJ0obWLz8oXCJp%?!bXW#qv_V9Oga(6?dn7^owj7m5XA`S3tC#aV3oVjUc z;mkH0sGfR(vFHd+5^+E*J)orfEpyJ^t~m!bUGU(gsQF@50G62-f=Z zcb6*7A9|$sMWpaW+4n9sSFu1Q5OP3+WHasN5wrY+3F=xTjPPdK)%hJxm7^9t;(2( z%@d*>;O=j(3zYY^cpp{zHI`csBQcuxzIg6a6(bqe8Ez>hwra-dGvnta*IgKy85~^d;);3bLAMZ>Tj`YM;x;~SbRC4d*_unaxpG5| zH@(cjmaMRPckMj2}Icvjqyecjj*zm&oNbIu@#7Cm1E15n`eP@7e!dS4* zxt46yqdl*rSZ2Pe$Y@PLIKS`_s{26r=Ap6S1bAec9M9!Yql6vjdGKZn@1(SWVmEH= z1H!f&qwp}tp(h)G7Z;OP8-Ccc%LKuE3aThLaLijO-IiK^LU$vRxE>8)^y_oHDqh#W z@8$B_ZmCtI;sB^vv1&3-;z|Ik{#xf^sc(yqS1me7S-m0)R#Zd1ikBqTXt%WYdDk6I z_Nuw{0_UF$Z>sK|sIzRHiyX4q%)=u=)4yGt_x0JQ-FdF`DLc_Pnt-ad+?dCogH4&d zgS9ifKZ~ooFY1)fHP;;vQN!6qqWF#_(RH3=>_$R!S$7owxPYPjB@FQ4p~jb%!O9&T z=WZNUj_+^MQz=}h{&;UUG{v}U7(P6@z~z7|QD!Ca z!H~ooSE|5P`4PhuOr2uDxCc2mXwphGl{*5F(Ug+Oj~5=dzK=&1p66Ob=nvo>?oebY{$ecMesSK2F_Rx4?o%8?y@B=3o4$D$ zQVKbH%G&XWkm3qtv-D!l>*mElw`a^7TJ`?TvkkCCP*UamO#UfVx>8|BBwDn{^ubl@ zGReqgWu#kg7K{dYrb4!2Ker4Ugq(HVkDdj#lSnYf0jF`N8jdI8xDCvRBK#@6kZk`| zD$NOUv+$A}&cb%S2Fp^}|Lb!oLw}W6rR>O~%f;xu0AETt0}Yij`dJLOz2*o_=tO&5 z&lAv!bZrE@0S0dVRg3mX>$up)2QdfNs_YQSL)A%uE!1h+C_^k@ugnX*U{8-yZW3G( zpiLrtMV{}=L6Uo|{rC7vd$;L?hdmSwO{Fok-R#b>J6GBiQ6WLGw}PJRgM%R^Krw8@ z^aaKrc(c0W>HgKXhQggR6~~bgE2UGrl?Sk?ae6t%;d1bs{fza-4)OKC*cLyHt7BNq zS50Re4!FhH57!{D3MiJ-xznlN5Gj;Ygrk|-T)WE#C*@_085(`waov{X<(!2!FVnG^ z5O3@Bsz30NLn}vO8R<-4;!wAg>4jPA;VE;x;&sZ7ypl5C7Pa3xqT}9RNT<7O53BCo4h?7s(j-J76mx{q;8VbB@<{O(sOr4#K*KtDODrxT zdMgjx!vYGffUa8~SJkss^|~UC`1H)&8}Dq}NvXCTLbFP6IcWi1QsSe#8?=gag)O1E z9EMXz_gJ?|8Xk0SF*i+6TQ%9{vdbI3^nyXKKJa5j)tBWAeXq_iffvSr4+d~=(u*&= zNyp;FDcHlGPj31C6~595tH=x244=F4CyUU0M#*fun@O+jG|lk`wRxh$;wVs-czkv$coG1^&SHzfO@Czl)W zioE{0CDFMF%4Zn|<{s4a7-m?U67r$(didVOrX0Dd4e(8RHIGDApMt-~parVxTK-i8 zzUMZD<&LV@_E)lEgAP}%jSSbp-vbJagVAM|A6H+S!9b8M#r~VpEe~LcsIc%VJf|s& z3%tDmdE!+ivAhg5|6DJ+Yy;kFRWI-#Y@KtACh@nYr#;=%wr$(CZQHirY1??)=Cp0w znzn7*JHO5D=HA@>|C^kuq$;UX&pDrG#bbEV4py7$t95;RUEu|uyrMBdj{Oq6M$la@ z`p*r2r1Yi_*u_zqt67av2r+J@5^0{0Va|$^iLN={SPOhrd+TD0-Plm|fqv8PsI0U0 zlE@*+`Eo;uUV8@4G|^Ci;Ld`RNBE7O&}(mrx)rlfjbY2pO2wTkQrVxmP+vFF^~%77 zd&kJNj9)6ZV~5b2(#^TSaz~8W*{d~&cP@I%=As4ib}(h(Eysnv684QwLh*B?>8}^P zED}UPn@**tcq;$G4(HZWvt(FV=x$*t?_36ulx1iQ+s4T8@6&exIDgS&*O5|!VtQ(q zq%cK9*g31`xi!~9$frME=)no4W#Z@OUqPWm6^fI^ecl`T$y;tTlbj)9dNNsI&2_7( zeBKq}L&<25ep*+gJ7{XqI2wZP9W9oPw%3($z^C?}i45IqY_wM{$-kn`enM4SM)JgY z7$id@SoY3#LH!g5j0cZtfBBB}Sli6efP|-5M-IN0mz8*4I@?Np?YHMAnpdPA+ay(W z#KpUw#t%2dT`Y!Mwo(vBTIud`gC2$CuxyJPz%P5CrbF+A|(scu=s41YIZ(b^n-%r z54df7nYD$T)Nlz)D<`QFidH#g1p!S%bw7SobTU{apeo(SPY{)+HRe_*5WBsXI@;jh z@EM||$%h+{{W6#)$2KJU%KglOo#8ftFF}sIGyWz1^X_T$_wn^W(zbkEm^{Advk5w6 zoj|(Ne*Dby?wJ2f)S>PH@OUcLFx(w7;W152!m4MgfUaS{&1=9=+=NTafHr>Hy@OtX zOA ztOXq?-ju&q6i(CYo>=gq0m)pCC0d853^!qRX_lF)z3u1Ai5R@~ebLNTpJ@ol$h&;3 zVv}PoFUBM5U&vx+13Qv(FnAoC`Cip$FP?S)E-jZXuznoC<9 zfL2E)JI#_n6LIDX)*V~DO-wFM^Bo`BSN&SK>#FAFdSzIT#jgvmn_*rhBjS~KTYMrm zH?en7SH<^O|HmsHSlUGksU_REQkOBM@YG1lpSHBWspj{!I7Zr{hK#9&OIlUv`!=ob zk6RUUQPgEH^_dhdvT~SjC^#u_sEld|_zhsh%*)(HfStA5MuJVNYC;ZBqaw!8nVu2h zKSYoMhpE01u&=`6D?2T3w*(~Ll-j%^QU8!+XR$OQ+YZM)NC+iA_-$x}%|%%!>S3^B z+u)Vy{i^`=YUzM#A*TBW{M>_SX=YD*M59RhWvY4Jl zX*C#AZ3t5pJs5ut_jlA}`@b-;HtZ;{lSIAdm8{6tU%~OZ2+I`uJ|q_f2QE58a8rSS zu7cp@As7t*aNNBHUul5w=@9Pr)5XWQSB@o*D|I54G%weX0 zKy?^S+CRhs8L5|;e4AmRXi~nY72V#6*kL=vr`z|O(IlTv@z28ZrMcf<_oo1bJK(!I zj4r^RqenHCw{k^qf`A-I;s@LulIu$FSS_Qq8}BL%i#bL}k`WujMa2$Ig-Gc4U+ zL$6ity1v5cbHy~lE3IL?zE=&-IO3vAQFbove)V33&)X+PpBsR8=J#2K96Zxa#VXqI z025|srykCo7E*Qf?f&U#Y%+PUsX;j*9P|Trw*qk|u?-%N$O>ZE)(-*Org1~l%n@KF zy1MRvBO?m8Dda9s1C_t-W~tNNoey$RR+uUo=%HtQG|f{K<>1B&dsw|aU1uk9Y)`L@1n8ntV`Y>zC}7$u;q9gbe6RE(Ufyt=y` zdI@V%+DNO@KgN6)!H)MI#%z0635Z6ZuF|z^t1`Q|Roj{;rs@kZkvSq$8cQ>;)yoXQ z*H*A)6zJ5Rm@aba(k+@KJ&#@s2m0#rU{mBzh?|uV$p~rlb)(fZI7R(JWjYy%O~g;M5#z3~ zV0?GK+ivb~)?~p+YgkQqRNJ|PPpr*n_I6pa0A3g^rkVe+y=AK<8Vfjl6bW}22B#sc zIq_2wR8QIoT|M7G^wQ;|rM{FtFlj7~8YO2Eku3tBZ}ay-y_g|W15nJXZWnZ+j8|c& zNhYyp;lC27GYrO+m%*)MrT2ypzp!FCGdszsj?`&Eg=-+Yk5Nxl8{=`bksFa3{*>1g zrEZjbr3f1Woww2hZno`fnlTFbm%Qv_)*8wI77`tX7f0& z3!l0f>AH^LmlnDD{bMy7lr_qaFT+cb@>mNNaHgsOfml+{L0T-IeDXaHU^w00M&3A= zAuu%YA)dwV8#sI6f$a!fp*LDT@d@?rOUVQwz!gIav%{jR&M+HYQwCs`t5APobz#`W zi~q~bZ(1A^9HlgMUx#0os+r08JtH{Ohn{Uca|@PK4;_4B2IxKj1^lRBMr(pJ!jSMz zCS3cSJB&+!Hff7}fvmY+4>8FOt;=+*1n1W6JLN7_t+CP(y*Y^ulD;i3ESM&rIx`LH z6xbbjnmVL>V8%b(HR0&4t0X62k;0r|Y{<01Sxec`V_>TER8>yb3bRD@V|3q{k@XyoEtRD$1vE4Me*(M3Z=_ zXd&^uh$z^r;1a$@n(FCT3D)axh`4>7&0A{5f#!zbBS0?|qJglU9n*ICKXg_)Ra;y> za?)x%j1CT46Pc6N(OZBq@|Ke{${3bVVbId;<0|`@!KMqz{7gGV%8mHOX%lV0oEfl1 z=jw)$B(1~J$_4ujZU0xp;_qQnf#j&=%yoC7jQNz{7nYS{&U*J?GR+U^DOv4~!_}w^ zyN+>sXaI*~(FFccADz|A@fLi{luP-@oGVO^D-z~ud*A@)a<7SbSA6<{T4>kZYKJgh za786YSXGXH2Qh-JocTVPIuta$1I@M)f>X1m9@kfp-!#N+_ps}ng-wBbETaY;vW6@l zE$m^XAa~wEDlMG6)lmD`?+Z+JacFKB*TJTFVE}&9tVOpj_B~OR8_GQy6%VEcJ%2mA zF*4%QLLcIN~&n^F}l24xwuC zQQhf3Lg&_y1w;xwR(=>aY=!s_xLlZ4Zs)JWLZNhWqHq``2|r)Gb#v|Tf80+lC7R0_ zTmZU|c2wP%7+QPUN8T47QSq-L6kvKLKE%^&&ieg8A7l|EH-PN1Di;~U?!|lZ z@BDUZ@={B2beWdH@QyKs@&=9I-pvbKM*;P|evbiiL!wag&R09E54T@Tdq3oyLsbg6 z^AyW~9z%g5oEf1uy<-NV8K1A#_F=JcG2V5u&akgnH3J?_}SnU%&VhqLgHZ-54M z{H)YOMWOyaLKFSuam&wascconC+i`RD{|-r(Ec_YZNKUfO6OypK2EUyt(4(cy?JB^ z<#jwW;)BhcaB~yf7#JC?bCdJ-mOR+xigEqEjXKyIK?8`U5bIJ*KP(U@ofuidg=)r1 zKPT9a=J0cg=7AOtO~bz!WVIvsdVtXZ2+~WH@ElS__ce(`eIQ1$(i24U&ms4aOz>AD zdp&Wup*69S`1yeAIfRvzQ>okJGko#*unS3y(Z(+jbQ2Zm-~*@BacH}CB$YD=MrzSz z8i!5-&QR8h#^mNi`f2bO&z~ESpb2@HMHkE~ZYyXY-A2UW(Uo;Qik>ZD-T>W-(+$wX zWMa48Rq6yj|738V8`{C5>_L0w~=bPu`kVf?%9<0u?u^NWaai1(@~Ab zgAa{7Bk3egxt{sZ(6l(L?!HeBMv*?Qm`mTpCoz4i1w|wm&X-4Wk{C?QcJa=Z?HEOF?yZ88aaxF{h3AnD{JB5ogo|Ce?f`dx%ravdtu1t~ zx$y~d`_vW|@WvSd%{+JdWID^cWO3znSw|9VNHHn)m35}i&kLIM*N>I|h9@#b*w+at zIJoO{C984G%?Z6Q0(Mv7!`OpuY)C?HZkZ4mxO17Z32Y^)V$p^_KI|O&i*)KFjVN2p zm2J-bSjhE2o)^w~*_ogZi_)P*rp8+{tKH{h;jewMufR^M?HC?xaTqWX9nUVX*WJOV zE=T+4z(gIBQxfrkjz%!JfQ@)k-g#V0n^M#6=dwQK5M#mQO1osiC|^uXUZr1)Yb>H8 zQ;Eu;7VwWdVgl;|OsKOF{Xi zVC)aAE)Xq~?HV57_Hz(|n_hG?*~88oP;6pEf(DE1&8|^@<(}`SJvz`EY|<!MsawR3Es%BN4Zm7K#^)%V$bARI<^>GsE8Ul+=p+v8Q`{Y=@p9pD&Vh@TyXAl zxLpV~5B2oxaCr?Z?@D`mFB6=IJ`pvveB+SC*go(X^({-ud5t8uWJHTQOQ%7%cIP!> z{y@;G{ZDaW;n`5H=L|yy$<_Qcfg|#iXINY9QvJcg6CNHcFZvuN4N1p_lEbLXyJACT zv~|mf4L&_G7l4n^lgEOdM*Ml&rL)4R-96&wu>kB2M=7)KK8>l?u%*Yq(-|4jsVu9F zWzrUH>F?p;albR_pRkilb+)VgZokmwzc9LxDg2YY)UvsQk(30@K{0Jg-vKX<-kge+ zW&1irdvH&o{nq%WkB5z?5e2dcVeRvm?8Sz=G_`m<)PVkuSeOLLz_iG0FH~;y1EXf| z0HHe4f$O4XBZlBG;Md=zmB)DN? zG7EA^%~WP93q9T#zpzO^DXYJJ|Me6@XnbaK&nr|PR-{| zTNZ0M1`FLGQ_9#qpyU?@OfZE(1(1i;EAQezn$$b!aU#Dr5J&6L``*0TjT}}l?EbT* zmJ)~<9VVV6CDMRgDe9ufZ3n)J?&G1;@&C2Z5G=X}lirX_DK6GnWeK&ZHj*v%bCp}% zS$C0rk4zIQyll1>;1;0dfX?u;ZE`S_h&@I8C^zSX-BJbS03(M3vtJt|KiK<9P?2Sp-^95sBOBJvXUM~17#5!eHG^CQa+CQZ zHN|J-<-a>3%z)mkwyNlJFbcU;bu`V;eKP6^xTZ%YEN=rspTZm7ynRxeSY}IVf&%|?7Ph3hKzI!eqyfwDHMWp z=Tkg?UMirNyO;2K|K68}jJw9=nTdpWOx$1pRDnSoe=5AL)jw!qWPXpQ$Tg1l19?pc zx~i=j_8+bX;Q1j}0lD1&NB7GHLkTQ$hnWWDWCo_Q!{7r9i3I02A*bP2CLK+CW9e@` zzk4^Q((#uxOr6Sd@Hf}CB)dKh6Dr@%rqbp6#33>!R-y?b& zKW|5Ra<%}xax(&7o^KN#kCi1!3RIIE{vY@MXQrD0gK8~l?%rVcb>vzB@Xju`)-xR} zOXUeTK9(sxE%s6aGSC4D9;!)zPeHu4+b5eIZ}x;h6uf^>e)CS5>#jDi1N~pWjpB!K zHJObx$iGUOLpMD$2CrM+q3X@u$Xj<5!xzM9gM!J^+ND~bZYcz5Fm|=+x%~=`^GG@Xeix66w(`mf-=@7h*fBX z8Kby(;5Bm6VEW|x-+jG3oX3@J59iHiCprif$K9eTOEan0BJUasP$64~Q8gR+aJyer z3@hIADo9Vs?9rR-Kdpjnh(tuq56Gi}doDvp+$%ML7#(;7fx8N#)mFF=OLAw`0D=YT zL|D9@xH{@%mr*44chI}Nv=tu;Ksm1E{wGTsySJ@O!Cl+ECDhSpPHjT^D6)D>|Es+$ z?Rj|y*75*k(KM6fsBKuQ3-d7@kZ)&UX{X@S#^`IAq{XXQHJ?rdS|6n$F40uy=}1JK z#5F_wZQxMtT)MYsV7FHjjd0HCH9W@9(o;qMyL393x;x9wUlAAv)}`BXF%F#Qa5!*Q zN|sisRh%2r{5|#IWu~}MpP9zQ$m%d{-R8S+Xy-OIINor+`Kn)H8^9Z*AV24ZEh3{_ zeU)FIG(Yz8il85iOmHknQJ*WAP=4cBPPf$w`A4tHZI( z@Gqb&L$v&8Vi+-0H(TaEY1Jh_Dr*=nK+Q>0SftojWAm*%a%3I^0?%7j*WHDEiUk|Z zMV?Ie^jn_-{k@z10K|~VhPvlbxU9#~o1M$_aHwAOYe&>AE=UC2de`N;2}zAAPU+oN zjtCEi@QUJUo^H+(oAC0KR1*7=eKfJ}MUbzpl5a6)-7$-EtLGB3FB}QlXCjj!Acv*6 zSk`>eB9(3Y8lBsH_ba&8X_NZR`e^CWc_|)gx2#ROw(-F^-S)K{w!piNXvNh$X_Z|9 z0%n!i;+5`ezs|SH>`PPd?2df{Zey^WzNGW-O|e1n;rU!vklFfOzxO1GnCn9`w3)&P zq@FkKa)^Gsy)aqfK32%zEjNl)vTU?^85ev(@FKcV28(;+hO-?V zl_~o716s#}XSaj2=_T}z+#s3Efb@aUWv{+1RoD1hNnb`pfYupl7Gy9GxMKrD3ZQf5 zE0YfYMO^pG*-Rm+_sq-QdEuDqihEoij4)`gfH6lgF@X8zGewLcJO>gn7IFN?dt{)v z#dsG4o;WG4_RvwM8LCiQo^sGz!!PD!M5Qzync;5r)m-NoN)@<#`V$mbES4b%ccg3< zZ>)3mKbeTIZ3jFYw2Qsoc;{f$t5#5|%~W3-P`qctUJ2^kdz-PeTXf;?ILB7uEkf`Ufpb=nK@f1wcR#~r-5T3Yp2w!o*MIAQd86B@ z0Jy5DY4G^m!@?2Rh4?*W=n=T|q_qgsOv?ek#sZ62YVEuctnxanY{U`t^tq zdUex5Y6qJpWwqKsbunM?{OOAHJdb>XSNitOypp^=Y({b`8)sC{eF)4~QTrz}QG+D- za-t53`%FT$`Qe!;p(wKdbuJWK$VoNWjw6_EQ*o+{BY2Hj5`Zx5hQRO6NB3)`brz%;tGg4^^ zIfG}{nAslRNT4_L&z5I5?jLE`HUKEN{>JEv3L+<->b)|z%kYg_J_SxDh~Frt0S-=3 zpm+mhMVXjf#g6l4YV^rBrd;B&-1lQ8U9tK%gdW0U=g;xaiWW+4{~1XB6fuFD3!ek6 z5p;QT?&H0>8yGwib;QkaJDc~+1-_*}|0tz^*b_bQyMdVE-+=Df-x9El`1SXBz^#Vy9U^oD-U>YLOqU|XR zT0;@7#qm0O6o*sI3kw7#hIHd{W3;31VjIo!qO9;z6sO%NU)skE_AY?EU)*D5 zuI@2{e@+8WWFHHn>{8$i#&I)~U9~4b$H#5Zhk#F*uORG4h3f#^T?lbJLlE@MOxUh;6Gy@pE}kf% zz`bllGw{+GA~FWMq~?)nG&3oJ(r8dbhV&Uc4L6BHY>K<3!SA}2@=dCjL)gZu#Qgvw zy``1{arAKBO(uY|rMY~i2Za8HFoVNa=5;=0KLYlgfyYrNiro?h? z`kIwmQVnX4eY4SO=cQ((15R|ysvwk*UgQ%@_4vE3HebLBSfNBw+vVbQs(E=^dtBJy z(iP~QAO^3Gu6^3& zo-ZJfQR82f?5hKw3tCzd2_g(Ln%&Q`+PZcWLsjxVpHX|Bx5@#8CYCFH2Jbh1^1gwR zZMRpQuHvu)Pet?83NnqZ^t)N($5(Q*(O=Q#@>hSA$Ry;-N4FC8c<^r1BVbzgf_00C zk6=zJMA&i(MG8aQ%|u89%X~ZWhMx`}LPr4=1Do=s&NH+!ZT?{!W)`+x zhVa2;keR<^mW0e3MD{f1mBLIBYR1Sxixtyj3tyy6!<##D082Y`r3)3fBOaB{o!tx7eyZP9s8!D+|!LkBS)5 z&X88N9<_Za&D`6Wv0}W+@^3KQ;)4n$#x+^7>v#R!Q)pa>NiKk2GDQ3}D~kYUQGet% z(_Lhf%w3_a2T$os+Sdno)zNj(t-KLux={|STT1rT*WiVex7+mDxbV71XOBODtXi?6g#<9ls`zO2hMy_EspkKCB zH!Rrm;k=P0j=$Dks=PT4*XN?xUjst%N)dxt-Lho4p2i#ZS)ChUHvxt3XjJ{qvqdsP zj#57|`{#I^31|gqpP4XiE~VO%`yVl~+&|){@Xob_6o1fS%M5u1EU%-@xTiS0@9$JT?C_ku6X5`F!EnXe-wNf8xcee^G`J@3jZ`g(dG5aGL` z|8JgfU}rE4)&DdgQ3A0;V5Y%X{u#vGJYeQQhJccuFd+aiA2$_D>o6w!fhV|0$JOY3 zaz3bH@}$;6+YA2n03XghVxN_{fFIXuy}Sfr?1ZoY4#vD7^?(j;38DG?ZdibE;ndzH z26tlxbci6#lW?Bi5qC-SntIXH((~^I^UWy>#H`FBpLLH;)1_HFa|s=;$b)K=yP+>Q zxGal6Z4p3X=ehDgZj1Tr%s&}*(DPVP<9}q-eX(sG%ZOLnu8Y2jT!j@aBL+}oGP-51 zvin?$KZi4RYiH?E{?5U#n2bpZmP%q?1 z69Bg*NVmKmU`Rx-^KV1m_n{|vr`6AShWQ>EA+lsVX6?)#Jq|Ga6l~h)=qUR16mj~w z6)lLPtCaG=&5vD4{7|Fei^v$z+C;m_zz_2ZPE%tNAnUp{2gqlP9a&Yw!QyZ+97U%v zlr1_d_Qtx~B(hdw4CYGiXV=mgGSo?$7@(Fw5URJv`TbijEO`56Gf3?CR}ls&Wb9ENigAv}VoJ7s7nZFT+` z;J44ekHaetn8r=}!L7pHmA<0WIK70JLc-_d;j*`b&R-kprrAm~IsB0K zp8C!1N29Y{;S74`pco1)Yo|hH#sgQPwvv0Ljby`|4AHmy3pnyIw8;8nlrmhkoQyam zF>9Ld`!(?-iCk_5lu}mK#?nkklukY(Qj6g{!T>2UA1QF67M>uH#L;@s2W5V@8<8M? z&kWx?O(pC5LuhO1*mobom^uG&EL#N|Wx<*n)5@zmQAEq4Q>z}XJn8~b(`4HlHWfPI zLnC9MQ|!Fu^TnKgR2q}+e`c!U*SV^O&O+B>bN;es4bOU0k&NtB+!iydi~?0zd|9Ye zKR|?geo|;j6#h!&u<6guZ~2VAbSbG}*C{Bqq|EZV^`mgEcUg*E9pvmOvnb(e@!TNa z$Lv|WHIVVU6zZeIaMbI}y6J9A+t0lFV7773XIOYVTxWtgFUOlgTRmsWB>yu=TWg)0f_FrT#3xG9@fXau)X z`&ttTX~-NP2A;vYi9pna&v-6U1p^o(-coQl0c{&W&I&KW#W%!GBlHGW`VocV!b6rmCa2OJIJj{+ zX}=tJJz~FH|9!rCNl34;YR3==bNYP0JS}=;TZL7wp{jrMv|v_EPahsF>-Ve5`pQRV ztV3zrJrb#+3Q^`9uo3fCjpHQH4fvD#*(2_^zT^Cok(dy@Nww31XVlQ2l*~0=Pa}68 z15Oampr5+@=VyZk>L7GRr52bolR;3$yW-}LEESTJvK0oUr3L+s7LSSqr z)sXic{(95egz!bz6?TXyw`D`RZr6e|5bZ3|n?dK7n}=iW>o)qpOB(C5d4SOB`cN^j z&>@34NcXp+HiOly4fFEgocgYAd`g1CAvHcH&Lzbu0nLsI%)E=jN^8RRB28R?tI@Crxx{E`)KqkzjywLZSzV7V<;?n%bN||OJo$kj>69y8 ze{Y)3oFFKG<(FXq?11NV z;@r(iCaRowc2Y?4o+Lo>q$`U2Tzn%gxZ3Qy#}Zk7;pal_6zuJivnxvr(h0<=jDhSN zT8%5(M`c~&vaMZL!K(kEYtvL-fU$h>kTe7h5x)NGANiUzz0Nq*`r&9rL=Yq41Y+k9&wJt}n~Etkg+7Q8WrDmp-jW;FhkMOgpg*lRc9 z$pE7R;W7>d%&l4aa2uEA_oMTxrY7`a%jr}KOtzphhFB;|tcJFB+0HDKc>N;yfr{4L zGD$Nr=`{ojTp)f8juNX(^ddunmYkHFKqrx6D1BBmaJrGMCgqhY{thlCKV@ILvYCya zTi&8fHSaLr79XIebxoF1gvR!Thj4x~hd>XM8(J{JQ@aFN#kq&?;}U>~gskrLZSUJr zN&BLHV>mf&>lB#ul_NDs>*k16ST_vxDYbUQa&WfRX&5WEbB13<8}#`jG?PU?<{x0_ zyP4ha$w7K^-9!a9#O^i0EZb$@@H0;UA4#>EIlQ~Z;{srAw zk2%E$W6G9fZ?GY^U0rm0=|foSk>q3E@9|xAbrflLptl~IflEbol^CJSFwC3aHk|`T z+gI6$2s7xPLLqnBzhie~{>%-hoRTgwLsfU*GH=BMrmoAC*eh(cZz(nU{c@^46)k4D zfkW9^Hv-TtUU-gSQp+barJavjHnL)_$X$XmZZ0nr791fgAsClDcGU8ULbM0=NA3Y%K>_%z6jS3ka*9R#`Md z-8#VXBJi)N1sVA||LQQ94uWZMKJXM}&RiDwl90oU_8-Mcq?Jx?3KE)I zBoZVl(PjKkW-GQ4p_}WYt}lU!;nIu(h2U_1Cqu`ioc!|2k=Q2QkUwEpcTl*#%kJb} zddy$O_7<6J=Dig;R^3Kf#dP@v+fNF)4;KNu8CD|NhBe>OA(g<3$mAq~DX6Fl$7_~e z?**y)N~L8=3HO8DSSezIQfjpmX=EIjy=uUzj9%CLpYT1bQE8sbLl!Ms8GEiE$CiN= z`jsJSwF};CxV0v{f_|X8De2k%ad7B%y*imy2-M099#ULkos!`o@uiL5a; z;9_Yi05L;hcmXX09ao1Vxg9-#GK|H`cf`=!AOgU}Um4zLZ|KicBF_#E?+*vhSErTF zdzt0auX9OBjL@ye{lbO2IbXHXoRSfb*K(A&Cq3U)|D@dRF%PKQm9c;i9Di&9YKrd4 z9hE2p^tfza4E{sCt_Y6+YMKt`>x+q!5r!xUvQ>UYc|e9kYv7)qX5sbS1Rsg=KxhMLVNpL9f=EHEFjmejSrX%L2HtUggS-~@=geR+z!&y$^#(5mv zLfqAOE8s?BSr(N8ugbe|77sN*g6|c-@4ELcIO? zY=(h)+XkJ^pyOC3EXyqNTu1OV-I#^5 zmC*lBt0MHe_XdxaWdXL>OzO2963Gi}{BZjLD1GJ>1>Dw2d{bpVwO9jrx3@&uC+~v%->g`th9V*#-nm70X8bT zv0&u&%2^DN`A&~ZK&53~Vv@GRi|dgA==G8!mv76oGplLjsq2ztNrM2qcb3VeGmhYSTml~G=KzIHC~0XP%22zo0H{oMOU^76|Xo)&xrvYLa$?_km=fgKaL>bd zX7Xt23LRei6^W3EM-X=;pf0VU+UiTrS3V`FLx`iTDw#!1&LgS4l;LXysHGxi;Exn1xP_Td^T-Q%X)h2#O%$7a;vb4x=QJX+=^U!*q zTTXLzx7-hQQcaL4GBSyD|2#Ag!V)w8 z{zs?!ocCkr5h())^@_PUQ%}O6!%xQ!xE#)H z9E?sZB8(rkp_R_Y4KKfgZa-<4CPl5P7)r6Nl6621d?1B{D~jjj#9Vtl>X=&D%R72+ zaS2mntSn=fU9kim>JBXH7XTzU@xP{13EwNve%frP_8}n~E>yime1f>c) zw!OC*0XB}cj1Uf>Qtyf(%Rabg&VFMg4kMdcC>qZhKbTQJ@RZ@u`RM;-HjM3RiXI#& zzh7RYQxnTB)k(yi9S;sLv2ic^T}+V_y4i*2qchXdjb5+!45582UXK6$%YtE=1yLIL z$n5$a2AXJbo;d_q9mx>e&WLJr(k+xGQqB~+$37ILj(v5o z%WTv!kR^h}uEl9-WERWUg~W?$Z##?rWm0@Ocxy45zkgtKNF{D-ZMaPwD@=cIATjGH zE!>aQK=5{2(4e4>*<@tL@3zT4X~u?n%m&=5Fdjt;MsyIBtRRtuX7yb6Tr0WCL>X4z z0PHj=FXOLI`eTur_!;w1{dC~z`-Hv{a108lu&Lz?M$cS8Rl$Sa@Wb6A-)4m4Ln79x z;20N6mNHGpr>GdtFxKClXi0|Yd!$m?L~A1o#n9hXqutI7)YtX?V?{`8Jxt~yHN2b! zYp@Tdd=ER*l0oQG^bDb9O=vxYbZiPU_Ua zc-Vp`dMVYoSIv*o?A!<`$*NwdvU4&?5)GA_&VYK(ypM{b{$41QFk$<*af9`cj7gJA+Dzt zM@cJ=x&RuRx5Z$CY{XXir!Qdb@aR{2kfkTAnRiAAosJ4SmlQf+b&>?aV3g}-KwWWG ziwhb~8AQdlTo*Jd!{H2lbutUJ32+|uaNwT!1-`9I2ZAhbY=bB>3W_^(*ge>y(CVL_ z89 zI>HH7QEtmYrh8=a=zOsUtM$GHVb0Mgr$+=B9sovgg!e}QZWXKPWBIwws><5&2 z&^cxVxx}W%BFIz2Wa5`m4--1lXY}pBP(L#B-}1x4hmJ9&)D|qddySAU*-);*^bLlO+$dSQIvX;RnNZdsA_f=K}#m=cZ<&%@&n_w!n zx9+Kf6oU@hh|8_8HUE%i{Dv*BIhU}n85~WH1NXA;AStpMb;vDfr5wa*0rd=1U!))8t!j$AhV+gpAB(-B*ry(={6q|A+RVhD98-w@( z4E?nRly@6YF00Uo1njL&7;%)jEK2_U`n4WM^YZJRtL1y+^R@-e^dL-UlvDi=nW^aI z@vij2CoQ69+WPzJFx;f8@Q6Dgl#xqm?#l%zoe0wj5KwYDK#j*FvXAqLd`}?xy*Ell z$Rxah|BU)fBGGDI=L|!sm8{~!tGj^^@5BJ{*Q13puf)dHW{5t9d)PH4*NbZTkt3;# zf027&`HuDgIoEosIDYp9jA=Vntsxcm-FG%UqOww0?}{%W$1(fM1_Au^>@CG-%7jvm(oe_(0@i=d?so-O4DxFP*0jga5u+b<>a9U`V6pp5`s6< z$WOZVMYrP&x`;;%UT5Z}YXIlY)TqBoeIKderC?FPio*yeTH(s7+s(?P)XW}4ROlA7 zS+w?`SBD8-nimEIXvyYaB{01e)}N8*3!L)B;!mIa5~*28fU z?$9?7F9pS8JKYLEN`#jV!qbtOqUNOkR+)yLup5h$J_lkI;Ej$Zw8Ub)>bd82+yw*K za}~Nnv0kMJ4jg-<#hKlEuD_rVRI*Ee!G$pVKqyQYIN(ho%pA}m6^0c4#`AKg9)g@l z*R^*GoCTPl3c~}KVF=sZJ)9ZX?kR_2!}XIk`q({;3-Zph{3~)dArkpy`S7CQ>FFi# zaqooL2*8HMQofmvi<7^XxGzdgxZB70sxXOr`sK6gf7HW&?*Qh5%USRe-7_z7xH19b z-}J)lgZt8QQ^EU}vzcD6CnxbS@=+O zNZWf6hYP(>)g#HE6Dvt2#UU%4L1xukh&BW-3Xd$|K2b?JKy^S%7?@y}7|h~4h{zWO z8|i5mj~PtmqJ)fhM?)=ecw&IS@XhJ#$MvywOufnUnp*L|gfAjZH5^$Z>akNpE_SzO z6mHk@31SRb!C?A3`cL+$L~7p`vtYsVfv>Hb{Ll4C)Z4-?nGsh4hcEucE*T472I}S} z@0tkzn)0Erk(ciGuElyuocEI+!h$GV<%nBYoQfvE{M;w2A+E7!coOewAlhI)7r0^CH-F;0g1xmJG{0?y5!Js^MJUQexY+GI(x#D zjdcj{$4~F!O~g`4h!M!25)JE9ETCw&#r-21N2EyA*pvEV?xO3J(e!T%Q=V4)QdpH@ zxwy?UnP_HV{U5l=gfad)w>@RIw05GIkvx2{qh9ik>i#kJ@-i7dT|v!_(!f*$s<<2R z!6_SFFkg-7)pJ=+6x|q$aMo9CweU_9UBClKf5Q5J+(`oI?jxjmdAu3fc8^yaVoO5w z)%Qdv&FZ76hBT{jTic?jjax_?9fQXGz@owm4m3bmiy6-nV7GmMeFEuqK$Q(63c8uA zT9(KLV6L2C;j$!TX@Hgt#0$NgV8~8O2QvPmU>p*I1VOe(#T#bLl7RY5=OJVKUv+&4 zIF;}Jzda5~$;>zjWuHClk-a05?CfMjw44w^$v$QzBzx~WneU33c$@S27B8=! zGpIL+n3VCD>1;a@_eCR+bD^(z)J|(Qn)x!P+y+%vR}e>GjnI4u!jMLIG{uC#-EA!J z)`iw4;Nrz@hZ90H^G030ncOV6u5ib ze#pq^7BJzbD$L?^CsbuNxS#MouBECPYb;py5V@5ATES*BHaS;(#Cltly%v7)1xIMg zbUh=<)+N)cBD=Ex!v1ULbxV;Y^(&?paeCOKHIs0A#nj0ly_ZG~bK$#%pY1=hZkFb} z*S^N9t?|BI*OYIapdn)@h4z51FT6-(`4!EexiD_+<5xaT*)rypKPKX*t>%&!Cg157 zJl;%K?#klfau%|MDfsM4jpkB(_6nE5eBU@qgHNXvF)b~+yLO@M1s2=Y@8>yUsFwln zjGuQv4OEB}OLuS(@WVwa6!kO5OB5x>X1O#T=Y21IN*htvN-?`^KxhqQ)oz~nD4@x| z;&4)M1#3zcgb}?x!v^b}9iNrGt5b;~$RU>$YS_%>d3Ay>r1Q1fL~{+M_Ty}N_G0QG zRP<-%ZVdP2+{RYEC@=XH@D!aZA1NDvv=|(uLbCPEp;*9vZ3B3=hM;-m*7HpS$7u)Wj&ftSWi;;<2C-7-v16ifRl>Z>MW*A!&ugqd-M(Q| zQ8l#1GU31Y!HnH6cv4VR(6=rudkebxb;f47yEa0!WaM@Vc7732t;_5biF;Sq%x=u) z#Z;BGFk-Ap2ve$U6>KxL@m!cRzW3&?UXeD#v`c#_CcHR$o}O-nEbMOM=T}y;&Of1& z+_Z0ebDn4i_hPckio?!dyj$rU`Q2n_Jwvyro~qXq6*DH?Mlry@L_?d=CZ_|DEBRTP z_pZ#VR!(RQVp{)Fw$GJz!vpv5amz&|--f5spO)Kt81`0|p@jDa$5&}_ay9BxZrlw$ z;PNS!?H=P?soKQH2&QarjW*D^g)4KfQFISg?^!KS`MgMd77115+}}($Ou}h!D+d>K zZ&OkFmqoQ>9yAGEYK@#mGE()Z^3Re5|9a1VO+Cgl0Pb~-TVU2$_gwRynckne|0>BQkh|#$@{bJbkX=Z7RIg+7RFP$Y8kWcj9o|nJ%~|hj})@=H}vx2 z2G1Hd;3h=ZmgW0AFFUdo`ffz7l;ylBHJUa}3uua-_vYQdn_72ZExY|GY%+Pcbt-qI zNqC>)<%4VGk8weHwY0RbJ3-GEEqD_xreNJ<^6YV1XY(LAF7hokoremr%K`?Q zk1k{>PM-oSWr7V`hawy~G6t;H%5^4tVhj)qxL0@9GMm%g!wOU;Cd&-GK3+zfh%nOV zjm<5ys7`cDs^ndrI%O7K%aB3?vQ=SU(zQLuS@kt-ol@xJ%U_A^vlbmE*AMOpYmLh* zOA=1`A1-F?pKnF`l_(hPzpLB47=K~B$Rq#lLEh%YJ5Sk%4@O_dDi%alyPm9C$r1~# zPSe1}Rs%9~Ts8w6$#Ztfd9p=VUfn7mV>?2ye40uw&y3 z4!Si1tt#qMh(nHA!Q>G45JhODFP7pKJsGa5Z%*i^qwc%oW*edMY)_5_Ajb;^&wgh1 zu2u8=`s1U3cA|@fjsDhv1b0qqeCG8DaMNV)#9PnuZc)@l7Nmt#N6UpQmLO{hGT(sO zA-};d#a%1$_VwLl%|C=ZOJ2LYaH_$`PbJIidM&t&)@_e`@29@;eo7JI|7HfEs$+n_ ziG;D8Qt7`?;#>Cxb+W(LR{K#jDAZAe_9OOvs<2UriZa}blPw3)fUjb*uE9FhbaD?k zI_ZgTyk*RfWtY8KPSE*UH&fpJ>Y&Xd^|+4eEk3T3W|s*(g`y+BJXZG`)id<(cFzZL z*QRK>t{h&pZ#tuezQU?;*^n6$^|7+H4)^1GbwzDlRV=~Q&S%+d!kjs5v?+D=Wq^MD z`n*EuwqG)(;7XeH&2)1Wd0FQrqq{fBIuAc%Qte*9c~WXLKn)4KgFLxksP`Rb z8D3O{UzNIQ81tjqV`fqUw_MAV`hDd2Oi+z@e*e@}bmqo`q@w0KD|Yz;^pBlW?LS}X zwSAjO-X0mARFO}a zJmD*o*N1{fHGb*HT5vUc)JAKs%FK9IDYh)y-3}L8n>k1fg2${3J@C_5AA6FlZ9O-D zG*}XmiJ7{t+57N@HYUnEUQ0MCA2sBi?R%)>9!_)Ux6KzOrn`YRE&!qNPvStd|G)3# znhQX$$kF)78S-=Zrc4kE?tR3VD)Z|l(Rtd8;-5FHz*d>QOf{SdW|4*u=H`_54@2Ce zatcl6UYt)XrTj>%eCktvR-T2pd6Ipa(%`SVPFp%><@YmIvuq^!4tGoUd|t9Y;cNI+ zChhkv3IDXH&hm42xYJfi?9k-)_FV@HXV`q!+fJ4Deyi8_gkRsg_vrw)K8ir`UQtbo zwt2K{SNwf|r;DI7LC}~yHZzd+w&j=3q-;lp##L0bzTC{j?f}(#v40&e9~=J3RR*7( zya*d{cLE`=IaKx=znqxF6QjE}NnUQ%fi~jb`p@mSU(>#lp8V;Gq{@Q{H$na}SG{l6 zlJuM{*IQWU5}ha|WG_iWaGxNd`_X35cLsNa9!_;PKnUe0>6O$(z*$QyEX+~@zsVH^b`(o`Fp1dq>=|jkzfB=}f@z>7A2Ot?^DJc9Ej@UQKiG*d zetIxh;Hu;7)(&fR2rvFqi@y{_{${ADTrF_*p=B~hAGwKD;Tio%M%;PHmbCiDvdep_ z=4RByuk;u~Zy;}ccj&B4R%3pwGf;mZZ2@!r$m*Ra zr4z3aFg@K7Als|5vq#p`cK>l}9E{ri%-CzU+KE)9YPJ3k-@!LkMiwN~3eRNk$@9^$ z)^Bkx%8Frn0!sYiLvV__<22k3D`%G3)$33R6{8XsF}%4a(#+f>UmPZkf6#ECgt0yG zIG@ooKc8FodREn;%)=oKVt=dTW{AYTmn(7eh%o|DJ!b!u7F;qdS2`bvbqyfZv-9%})fT6zj+oUnfL z9+}{dkP7>-=6!G2wNl^nqn-(q>K~Ju_6v8hpo`Jng09D=R$~gz4plE1KD{f(QK+O@ zxG8ab^15=zJa=pXBaU`7xu|VCIdUm>s=W1qsu0HsGin+kAKkF?U#TjY_cdVTyw80H zgrb;MZd@wz4jBEoo0V14v-d$a9c7TaYObVh5&i0ZwPl@fZW5|j-5iN*79ns2k)_;= zIpf@XaJB8i@-A#}A`Lw>cqVV(iD~i#s*KLjGe%LU+g?E~atX)vK3H^f89N(O(p0877=Xmq)%l35j@4`LCmVAXESRPP&^$(&M_W4fm= z$@zWLj=e48c@~Fxk-|7BwvH1P)$B@Fu(p|veJE84l6Z4= zW`whO!|GGT=Pz5hnABiGC?f;oO4PnHufG>nKDq*jI(=GbU7F8E@WIuv2<_HcIz~SR z83~82;{x}3+nvne307Pp*dL`Apeq8XoXYv8=0#5h|F8FgVdQWGPs(|^MHBId>QU&< z$FpNeTVi^h@%oZ>HPS_~eZal+iC^?x#v^4S+BV`0$YgVH^P1HDQgC11l-<&w_rqNt z4rYl3W*Q$iwyo&&rw^!Hc;ZE1_w9RQ8&1)r{`vqtpO1UM+HisUk|Y&!8MsM8z^z*_Rr4~v+U)g95!vn z2F)eomO&%Di++!lxle1JX3>0aCqs}@{$8WsT$v*=uU<&rl>fANK6^C6gtMeGRet z$>Yw&UoDd{&_p#~?^raa5gFgz(0Q0d7r9mGfqY3Xk1I+VEI&N{Aw}$Yc3utt({!29 zd8FYg^~&Hg`a)VfpCn(wvi--&q2jTQTb4@UZ&f+BmIgJYyWeiuRAe8(jkOro2j5gK zM%bDA9o!K2ea5o3Q68ks%Ii+RFvx}sy*OP##!S=lc7OL$Uik~HyhhrHHC-Fg9Y=cl z?iRxMt2SKaw(%&(@BtgmSn<0jlvP6e^^FBihhYD)n8xLZki^M(U}K@E z1_V_xXEny-5@_7f5uL{V3dzzNK9sc8t1d1su-)0K*nrEtWs{j7H9FM9g?4VGd&v9T zlc6P-xtJ%yFlk39cZF_TCQYi}+S{*tJoW5Gjth?8`%vO;S(ulU^$pp3DyJ6(xpDd> z5NW+Ku1WuA?J5r&7sD%Tmm;*M{Kj~r$8!`0Itdad4c}+qL~c+9>Lm++-Y*+|`{fm| zPrY_oAzj<6FpiRgkG8qaifw)v8wOp19KJgr#7@40C**^`=f*0wuZ>b9DJ=z1p5S|Babf36x{Js5Pu83f z3GGF~P8SU#@e;~s6)#o*;^FV!$Yqb&tKU1`>ae7K~LFcMm3PBpQ6j&tQzYw%bj>MN#g4*!l zcOWLbMIT5M|FZ$aR8?FB`a(esLxW-Hs_0tK4mkw`PUP=UpwUDDKH#_UKr2-*8bI1q zRXfcfVOnxj)!7cvNeW;=R2S$01rmlo)(#S2L&CujFws~f1VZ$HI7A_;)Y?H0$$3$K zCe6Tb-~~gY!RG&xAo$oGkbo!(`o9H$**|k=*#9sY8IYv5-3@Dra3J6qr{xTJb#9&E<5eNi{5-1Fg!2oIa zuM#K>0Y{M-O~n4Y9#KC84Z$Eti2#O#{G|lYOQHk~L8FKj_+Q0<$1o^K1Yr;e9H{6c zJOIOCfU+Y2p;$PHV&bzKP$W@+K>!^jJR*j{99<6$!9sy=J&))hV*jKV@c&Qv0bv;Q zFHf)#_+P>pBx#OeXcU52{>0`IR0c%ijl0qV4q+ulrBT1q_ zQABL{&x~XVIaV1g2WgM0)qZ;vjDP<0=hhu zR51ntKU&qlc_ft%U|3*7kjUbI1rZoh#XxubYe6guh9KD`z=F`fWl?}Ii6dAn(1S@a z6c7fm&5;U50Vi$XW5*E;4S^y4+MWOdL!t!W0aZvM3x%Ozc>E-Ymw5I7Uj#{BbaV3p p1MU*XhE8|vz)&dUpQi#@dwThL+5x}E3x#1|Fp!|2ik>Ry{{RS2Yvcd` delta 689124 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

dmT!jd6I2I#5=bLW-Lm z*_(bbMeSh&3(_Oj6r(N>MAL>if|dVmne(#YwOg9#cBToKLPxtsp6fa zwG$2zj*HH$HRq#^WtHIEV6XFcqFfkyiFV&A6+Ga$qxx3Gp@e|$PsTC6?>dXV?1WkI zc(KUO;%;3v=IElWwh}|=)jSxFe4)zoh#@B#Z<+dU(C<*Q{XIZtwO&cW@i)3lLUrz~ zVJ;V2i3*JpkK?_PKzpS9cs^Q?WPWC4X61D$zs4k&hOizvTJviOsJ;jyG#5f1_q`P} zh8Zx-sFYJVD4O0nhHpx(_zN&S1`9PipUHQ$c`Lp}IM_qm8;N{SS!*O$$O* z;*g<*Ppu710_jo0;Fcw~-Ui{6R4!dMRHdwJGeQMtQDRY| zRAdO9T0(JzMm}9PyE;=qsZ@gCSM!MN)G!U-c~zL~Ra}iAIxB`sM`hk3p5nH=q-if` zDnPwCYWXRw)ZUDQXz4QH`<}5Rjvnt9O)lCO@?l51uJb@o%wg9(N3-3KkT62%#r80R zp_$@Sypser%@hP7ME8@;yDGWp8v3tEUC8tz1#~*U2vwsTN>o|PaDT#TRS{ttiP8rh z-Bl<0nuE3F4gIFa!4x0f4VfqT*;v~;2>`}ekaApq`-sAbPA#!Hh`b0Yh*b1Khw4)^ zCVmrjXBIlhcnEym0QH0BCmV6m?3>j68`ukPlImh^8q*83`s(TRFRU%3V}^YWF%zP5C<>q% z_*wFM>EFG-VQ-aDWtH@jd{{`z@VV)Hm2S%2p=kB(F|M88L|u?}S4FlJEaIZ|sp7qb z#Q0N0)|qMc2jVTsz%R~LlQK>P;zPqA@TWoB5DQs+eu7)(-Y$!(k*}(QzA!&={{Yr7 zD|oD74!bb*M86no>;hfb8E>$W*M!E%eo;%I z%b8}#)yLI(rj)gzlL;7qfKe{Ko-Mu7A%RO5k@uW$4vyB&$xox8ZCFFtWf+&~g!F1X zpV)~I3kSbflh@IK5YUr?kn9h~!zgC(C)f|S5zUMI_V|m2CZQXKBV@zd9zw zm*vFX^kJH5By_(fnJ4@r>v&{2DJAjYbcNm4oP1`GuuW%P(VZ}Q(aq6!9-o&~F3#{o z*Tw(q{pcxgKPpr~>zR~bomv2#W-fVRpK7pcBYfEW@!}-;MXblFClvKvq~*#-YMSjT zYAz!8$o_2-zrg!Zr6x!^^xd4?0ajplwS=6l8c!$p zMMZsb&Zxf-D+{J|6R)4$h@Rm)1I&b_H6~@b+zMgRWqkl=fIZ`CA>4>}s;)$V#oe;; z-v#`7A=STkR&RZUFU98o2kk<})En%tDX&|D>-6=)N{aAXn`f@+@{36z3?%v?`6m3w ztjA~TU>9qdEhYT0IN3Uuy7D99g<#Bol7E>%acn3SEw9x!6?r%N-QjH~U{4xp^5<5Y zeWrohW(s+~YCj_zh4(13Jtyhgep784VdPuh4A7rxI4=&!xCJ-P!mutyD(9`4!Cg@D` zBtjfFHRd=u^uq~|c*KW#ZiRq&`-cDRuZi4B^hdAzjG;9%V|W9ZW1F35wu$13#ErMF zSLlOvjhF18S4~aMIEo(ErtC-uo1>ZDQm`~~bgT+nEJ8Ot_&doGUGT!^yf{%0?LuH1 zHyVe*WXOtnwB55g6E zu+dL$QDVkj@UtRsg%?~ED|4$XUw6NI*$^Ddtl#c24RG5|bxx!Pi22f@M^ar>MgIMK zT4myaE=5(y(6iOpmk7#n@Roc~H*epz;6kzA(JY}W(*^u%B18Y!D2RQ7kl6`{g8K9G zOO|4Gd?5xPVnqoO0>9PnnGVPg0B@cbQ`e)1eaBencR`~ZYHCLPV0h3#@Ar=M0>AXM z72HHxh3QIb9`oJUX8QAMwX*pWdO}7Vvd*W)m2dNN>{|WvjcfBrH z=ifE)?K%Z0+@?_omnM9N`1LnI!rwed2a#NQVEW z_$Gv2`ceH(8oJO~0bm>k-wFFavc55g8URv2xWtXprBVz{M{+RNr4;dU7rzI!5%&d* z-f$B5{SB5c{gYf*J&1ABvxC^4832>Z)&a=YFaMBb9U|F^qh6XLj(`I*lk%8BNr)TN zQ$ZWJKH>%VK6dT|Jij_G@wa?S*P&k3whDct;ibVzFrvVPXwxaw0@ZqGL$a_HA%)1( z!9m}75R#9H%P;A-Gy`y$z9bD{Zq?Z19d=^*AUt*ke0lg=t&BJ6C=U)AUyG<&%69-F?-IL>C%pWm} zlJ|o6?KB(8mM~CEnC~*l9+|^6WX^NNH-sL)l>_P}?~O5=aaGm!=YkO>Acy~{fjsrq zP6z^9l6DAx*s$3`ULa^y!UhKUpb~)Cx1%3j;;JC}=?pu*rzEN!A&``{pBcpQ8M=uI z1f`+en)6nnHXra@&Nfeocr(lw_C2d>k@(+L|94WM?ft-0rNYmL30D>IyU`20liXrZ zHTG8fW2G@v&-%Y3LvHuey1E3uNtW1NK@;@hyleMNoqcH$J7J+mcq z3MDf~tXEe0YGe31!^Ji-{{Zs_H6YVQ@PNH0KXG`$K zalhfQr-+}B2I-EKQ>k@JX+hTPdYpTNRPN1-y+Q+3`0=ZJwnWMu$PJJq?L+Nw4wj-- ztK3bIs2@}h-$EW7+fhHT9~eXIwz)(rlA4ly#mW&WA8gK7P&ayP{CEZA6(cp8VwqW zw*ls31E^=1DysMvl0zRbXG{LRBij>O@mHcX)X9%Lf*=kzXL8e$%)>86QWIT*MtATb z^mlY2rFYqLw<^yTA;KjS31%fQXW_VY%*K-)A)+r||G$EiAuN}qz_0|P4l3(2!_DWmzT^)pG2o=w3R7>-S-T}2e>!@-`wT|e3VCUDA&?pA14y=&c9-RFd>E{1j zS^}(#ZGBXnC)E%y59T~tNO|f07k84$ktfHH7Z2e{`mTGGD{vvOTe%MS?Ku$Aq}3B& zHpeBBFTs;kHtZ8s2=|TA!F4%^zHjAGF{E?66ZvRkcjJ?f-#_{I@)Kl?{r%umoNhq8 zBD~}HDqVj-0h&rTMsYVEJz3D8s1GcolG1{l3ONz|1m6}qaGN6cx}5E)pfG6yI%1n5 zn*X=pK5J8LAx@c%gcZ%DF0ib8Wg*_bgAcAxf>0ibevS8N7@3-tJ)XqT2I110_b*pD zSShCzu17bd)d9;d^CS&to!u~?^(#9d%cX49H6NNsg#ljlvjv+xYf?{Q!NiCdBK+4( zJ<9Lzg+kHjAY68p-cj%gsJ0{kyxkkF4YOrr$PsUqnk)&DLI$?(u6Fe^Er=FUjsG%q zr?1Dm)j9Vj(Igv26$j(!CD@de|1y=auSZ8Zg=Oboec6Iu>kG<GxnmnrWr<7}W4mKi{*iXxSn$r;^(DE&xGp+(xukNeHjF;1IIQ@ibPVJ2 zA$dJnI3yi<2{nF0J(Wn?=b;+`bclQzT{jOwD|=?|%li<1{tzE!@%oTqVA(JZO_&I7 zHWe>j4^3=C;MIa6=ty#ZB)JqO&40Cewdxzm+E$8T^NA;+6xwVKmf^ijPkZdn{GciZ z^LnR5X8|o->Z|@bs9GhQH{j*L9z_e*&X5A9r4^^+zf=-9g^AwdPp6A#MvwI zNT>SY0FpWZ;6Hrp$e0_*nO#Y7T({R|9TMV`c!;(oc8fUlg!QB76t`!;)`;xqO?(|} z%i?Yi#LOjGV_4}e@1i}cvExH|G!t4ZXI&Mm(kdjgvogwSg@ZMz`r zOxS~Oz~XC)<3s(5+?KWhe5wg5cWt(8Hvb930bqvv(LE$TI@-zG#0$Ov=I zAg`lIWBZTY9$Fj>HB2d7;$2I%ZZLif1-7cKv#u`*#q#w;SGggJ$gXWxJBuGR!9zM6 z=kjc@@BPxFhtEIli`REkjGB#bm)6N?_i~UdeNbE&f;rxbz|K`_`0caz``ovC6nk@> z`d6HY;%eciJ6hcXV0A%ld4_m~xEbMmCZ0V*GB2cHT(7;%!1gVzd<@2eMV=qwmb5;I zBm2dG>i0YU^Ti*DH@CYDO4-fk^{+EXy+JB$kT&_S#nHd%(IdY5K5Lal_dny7MRz}I z6){6@qllI>%nuuvBhC*SmCwQ;XzRk)HK@nd2c8*K6EQUS1O2Wni^$Lo{yJJSF*ta; zk}w{u*d8&W1`%Qg5mE*bq6X=|+lIa}vvq~Lg~;K8N2!xbvkk?l#gHd-#jr}m@L)Z% z!91xVfbdX+8nBz3@Er@Wn`T5fLLn|KAg+tBJ=B8*@KFR(6}Ro@rw=fG22;KpwNr=Gd~@}dDb;Lx2#M<_6?&Q}HRYV>Y^e*gG9nfEz7ja}dT`#2Icwpc zt&8LwwDI~L1m6SSr528E1 zy37^RV-MTmUWV<)L)&f3`CxrFgUjL3e`&Qs0)E7D2`~avyK5EF5kGbxgDV1QgZKXH zj(mG(Sn$i1{tJm{(!<}X)1VMkI&LL+T;PkCDer~qex7&SOwe(P7Vwx#*i)wp7fg*3 zNe7dCT3bnexY4N!ZJdR zaZh=R5o=Ggg_{yko{3>eJw)#YpHtaPcIADCqB4==xt+ zvxBJ*_mB2tByNvmopqgchm!t9K~sZMC0#{*=11rsgV6uARVMLI!(Q~zD;-suhfGw4 zRL2j;{VzsM0K;D#_`pIq<`6MTOF}Y7j;8)i`ayf){rg^v$(YdIn5oSndmc7ELOf#W z0bg?R%^`~IA&RXbg~1rvftY3#X)0*xeILRUb;1-p9=2aRY)3q7pEoIPk)zVhBQX;i zkFpM{iE%>*bY<76K@v!UnlVZ>rgZhvibnE9K2+IR3+VpV`N~A^l3N#-$9!9Z*)i-G zBrwbj>Z;g!+O$a$YP4Mgcm5i8YHMamE78yt%8pHhRov!IwLcJv53c`Vp39!gvL(=O zhxsB{r)Mba=%pjb-PmvDI)2k*A4Z_mDTFFlgVu6kltB8f&mS7|G^#M5hQO&g7rhYDdqM`N2&JyrZ~a}jvQ z2L;uDCdav?wisw!(mmI*ObNc#7i<;n&3N70dK5B*a~t`5PU05ydVJlMprqRvXnH_* z2xf#)dI)^vjP(as%2xp<0mTA%Xfg0mtgrxH(^MnO2<24CD)dNYN_7)Myw!ZlxVn?4 zPMcPH^W-7bxJ*4^ijAfEn%Py!!&>In9`)so5W{(2GF{%9&0y7ft54mu=Jo@Tk@p(SZGp( zL?HtbCE_{iLk!u9ca=Bm>%8}95OIo=Qk~rHV;jrSW1GmJ^g@o;^GEAd%wuZi5OGh8 zR&ZwN>__A(caD^2m}s|+pAdcXg;Q%z5?LIyHa+Ayr@uLaR#V!BSjV$&U6g0s^i9Ia z;2CP2_*#Y$2CcoO%D=ILeerJyJxTd-pZvzu5hE2_bDJW2lp?o0fjQHwNi)Vje*Kp#DRpJoCiuOrryZjF1MPv_;tk9#rY~n+Uc`IQfx9V9 zVq|UK7Q;Z^(9*Jt$WwHs;tf-F+DC^!DbFHnj)|gpIjL@g>S#HseuE5U3;9jqObMui zmBC(iSh5%#n|{~f7a^W{Z@u66muobJ6r*=WbVl<;aXx>LOY{(M{$s6omv)WXIg3=X zMd|qZAK_YD3w7w12g%VUW@G4Iv$EDL%`MG+e*DjhYdFq^q)c@e5>*%T=-i8L8>GZ* z+%6jwW-Vhab{JXbFD+|*(G3P*Htm3%cZ5)o`q9pcgs&qKEy|xS$kQOPEQjzS=355@=y7u#GMg_Qkh$wqm`sLpJqe38ehY) zN~(!1gLknyC}ET2pUF}}=9Bn!rlCJt$O1v@EWIrLAT+nH3G; z#z*QaitEp9Zyp4yrGIi1O>y~P?}Hg-eYBx!GV0sje;^-bCYec_a!b32^eNBxO6)(l z@E`07|G2HVwX*vJsiXw9wn+en6_uoA9q4W3Sf0|y(LC}Ak6hav#?pqd9Z%mp7B zpH3I(6vA45PrOu`JZA6d^b_PFeWeZsvX(KE{f&^Z_LK3~O)z(LI%G#C^<(5y-LbMl zrj<|(^EW84W#Dy~h64adl3I_vhrJ=n z{0{t{*&2~J5Cms1$KHTUF9ML3rvWW;-q!bIZ*_b}8YCA|qz`C{qssbDvQQfEI2DNX zXml2&{B=lo16m?eJy`b|^%k>iXD_&X-GXxh(gosy8##6t;n}x8AcY6=wdk(ie8;mL zcRpHzy=8_!R#&@d0^zqbnUcf(wKCCL+IdTDT?o5zuY*s~aRPu)77!~Cb$u=y?-1zD zbVU2E_NsRY6zj3)FtGbGyx>2!-L}OdP0%krA-qCgdTi`(P$|YcFvVMa9cJSmW=0t< zQ;k{J0#gE@UMDB>Ub@({@^vAH% zYmbw0S!o-06(5vVL=z_)Qa&$VGxEQDq_E&`=~Ko`I?d`*$%?OJ{-(`$G>B@V%a77C z8RQ=5O(>5`?908I7!etAqoS4fv)fFZmgTffs~Z^V@CI;>>XXkUdd!;bVrUyo!h#-T zu27QyI*5f`?bMn~dkz$Om`$e+6fW_~>SGK(d7)|M>s%<-T8X6w$xed+vD5+Ci-mJp zFD}+O6soh8K6Njuv$a02k6zgqZdQ$rJi+wjW9hitD_fyue%VO3LQj`i{0qf;yJ?mD zi+}QdS^zvu>iJ+?)XCb>y%JxITj9&UJQMm&uT=X^lp9n>qv@%3{xz$(sEf5DWJSIn zF&;|tLND)W)((FCkGx!vTMIW;vF3C^PW<#64~J}fT)vl6tS7a++hc{NwkvK~@q!e# zJb2d4@`uote_qa3-v*8IyIt3%=y`9S*ZoHR82}u;YN>nlXxGe^BT62Dbm?=i>G0_g^$GgPmkDv<**!cwHr3fS8H zeN&AUVne@4!Ro{f;YEUw$@T;x@Vq)i`5?RPv*JNq+dXlya#bk&T~-B3f<;%w!8D*_ zfDBtO;FkrrRBr#!jv7knVFtyP8VbyB?)%w1uHQ< zKol5AU<%!#e%4C-H{QEHj36wM&|S9J1R1>GfAo{VXL*K*P5i*mTvq5WB#!;01-#h; z=5u7EEKiw%LSoFv*SW@jMz2AM;I-JiLJo08Sp<(eST>I7$v*|aT zpm|xB8;r~Z9{nY+34oo&{(UpG{Y@JqNAlH4>Bx|ren;B2`=8Gmm zLxSC})3vMcqZ39xeCspz5qN|s&{44AJ7|GBIbB!Eo9;9YfPgv=F+3p(=YRFx+wKzH zzE?w1Ort?nzEOii*tZ+>=Ifmyt-%>=IE0LKKxBoxf3kjd-qcP zGzy9`jtUkBwmY3?UM?nne8PZz|CqD#TM~Yro5FbbOMHDwqo4L{l_?ik8_PW&`bcTv zw~K!HAUSVCdlJ?fGz_DORxP1c?b>0L+E2OcJkG$mu%?K4LCqGITF006Qx_jx=bp=Z zdUrM#6Vlnq=eHUt7lSy9mZ#1+OA*QCBz&91Tn^i9mG5k~Ltmb2{ngtcYr#qq!R6?T zzPt^f$nX!3x0Xf)$y!)ZPYNy5tjP~&IY=*>Ci!nm!YgW*2Xza4}Vik^@ zzz^N>Y1Wp`a8A@u*7wzq*7wve*N@jv)h_|{WA!ujgY^?GlP-%cqb}1f11{?>Q!f23 zV=gnC6zD3917YbjA+*LVJZkBbM=XQW; zCHXVckH+zgUB!ff?oR|Z#{-%6AlLk+o7F(u+!dyodt*y5$-^UOT;{FTp&N9yr7eb=m+Nli6S| zzv?1{P)6v1;I|8+q4rn0(Wa?t^lb+{7d^LCM?`*Ya}KDmolDIFh2I z49@r&u5J4c&#atCyyN(zl==NW26AXN~S>^9pE3!P} zqqSW>V_e$Pcu43O3y%)Rr{t`J12))P!k9Q2jm>OQl zxR~Q~Mj_Km#=p-}qX?(w})yD+92q6HQP{t?nB{m-ubOUF-GrV}tT9YKiKIkQ0cI z2d$}X%w-N=^dIz&$M7hs=dI?`=E;21xQyF>s;wB?5Q2SaJkH$+{VA}7Eq_Wue5~^v zLpI;i)w0-vY2@HQ*ymMNT4q&V8g^7051exw3wd4)jJ^M51mK8AI7hyX{7KN7o7bW@ z#|m@RRomoV<8vCvJ7GAnw(_fQYFe?Z59`+~7qZg$M`q<;Keud_!3vm@(v}S7 zlJ64f(q6y77C<@8HaE{WzsQ?bo^F=w!v9(zzG#*qE6>cQ?~GqDJ$<12lI>i4`lhT% zzxjrZG&`*{0Cc=LPEhWut-)pTrkjPEwVEa6PtW zJN|Q=b9^gyauP|@w$%sr6$UZ1gI+MS~47rdMoXvRqBr82}&t# zfzuGk0gZ?vJm2J*3G4KNrt@oHb8eA*VHvp@(!yrWuW*rA9C)Mx!FK;Gk-!V=XY32^ zduJozq@WOZQ=TZe-mvCQfTlqMi$;9rY^f8%E_jc}VNa<~1s+3U43=t_wDagzTX{wu z5QHhlvW=rqw&^zG4VYSCIRZ2>iNEyJn?^v3fHCJY!{2`MYO!W&MvZ;;I%kA{9{sx8 z9%K2^rvmkc{1aO2;fvoaB$nNco<2pDRBKM{Z+$-k7I`(pHL)t$4pMK%BrmO)XgCgp zQuIL~5#B^cz208tAVwFs>VlC1Q8?X54N8{+(cC#qn`O(EE7MWKg2dOA&&K-x!f+)Z zjVqZ8@1XbM`wVi(1=rczQ2pvpim~HDLtxzS1qWQ|iWo!KJec+=bfv$Ibuj+tFoPCE z=hBmqn(fse+KuG6&La08SLkXn|EvY{l}#P7t=T=krBG_9`qKNwGO1-0FU9M!ZOlIP zneFJ&*k#f#)m?_J6i^nJ6=3zhD3pE!PQpAM$AYTRhS#l!Ic?Z&*vIqpaqe)a(_Di_ z5_>VY6}%LhcPE~)f%wV^t*d*u@$%b>I%tBA94z)rJb&%j#2p26-RZy^c6d64blHyOGB=$=G9 zF;YrRw8hvHutriLL}JXlyuaYvV9sE&V8vi~VA^23sss@p7uUKpNs>EKywOBm{tF>f zD9YsZI5*ZY&lZRfb&#V8hu6$jdcIw_IFJm1?n=p2-E_Y7s)Wa8kp!mCRCo=;Rggy9 zT?W38V8Od}(yW54nP5DOk#Sdmp8IHi9b|G8E;A$|#41=53cRhXpV9pwBn)+g$45fNiY)((nZ= zJBIZLcY^H<-v`VKNKn-y%ce;`HFy@S5Xz(R6;>C=Lj87Hzc^){gg&}%PXZhzE#(m< zyZleGOrj{9cudFw&2mb>I26TMTwIpkh?Z%qBKCmJJP^{5y)GXd6SWH z1^j~U2(qm+kA!8+1?tivB#Vw$*D+^T^`A!9g1jv_F;|VRpKS!!0G`VLg-Ho3qoZX|z1You2sY(#K` zbR=~|A$S%$GA=WDQd%K2Az(FJxID9q_+v+J(oRwaWhnW0LUA$`0gV~F4RMEF#K|>v zK7|Wn9TC5FrVgXd8190dh=YiWh&_WNgEfO&pF^KjpM4EVL7pI%=BM%ZV3vGe#)%YY zr!d|%0gS6M`}Aq^G=$OqpQYLyFJLq7Seq~*jj64pH)G+WYavO&I{^Kd6<8(r1H`)V zIlplkh+^Sb;}$no`O{Dzk4pFb7%#jR+9-V9yI!hr$37uvZlFC6v9fX8&?* zs&>hk5c?UW!ilP2K@s@J)d8$`be0U^jPl*|IUP{_1gLhgZ}G&p>Yfa+U1~=;9q^ko ziB7)1D!@m~ZuxC>0jV-Ms|XE~z4Cwa99=2%)_okAR%5UVmDt*2-wUs5=B$vwDr))4 z$Joy6#%r1Cn5vn?+aNA2BPs_T`A(#|(#luBF6z#~+a^3wKerC|k~Ji&F0(qb(V)%% zTtQQDTsPPnie+-I9-}+aSRPhjhHHdt<+~AmgSO4zvEU|nzyWgeyDrY=Q-h>$tIY^_ zWnDRV+xk30^8T{%itUQoN$pwV-AdGA)QTdwkX5TuYrtd4S<6|X&EoiSF8JV*OT!Pj zYHC^MC(9DS&$!8n>I1xo<&x7tGHdSTv(HcFVMt5I->Pv!vW=9`(Ap5bX|MzSQs?E< zrRr1{{G#dtfN5Ls>GB!!nf3V_u&A^$u>^aXbmo6gptWq1!nUov3`@w0sTL-_vq|(X zibJ}9oWQ}BNAc(>>TB@Qma{t%co&DkfrYCx-##xkUm{N;?{}?AD{0+kTWp=A{u5_rBUL_dNUHudx zjt}7L7w52`K5xQH+6V0}oYkaN&9#NK#?{_)W0aFnY<5A1OpA~cfvHRir4rmrQ}-GG z?0~c&ek@Z!DQEDo+Dia~CI3Z`Gc(&Ozi^Fxp|-1bv37Q5M|)2jA$fosY#r*VJd>!- zFmo;B!4p}=VS;QzrHfkNQ=;4;f_0qYL4kUm2rgxc(OGs~+!6-jE#;o3cc<&7N2gDx zSHJLd*1=UZ&uSktBE`=qa3#6&H7Wyoe9RFziA>;aWzLdE$I~wP1mJd3ZRO6?n}Yc- zaww{4dAIgQpP|PZMK;Qw1-GE1{#eO;O}R?&4sAY)U-ry7o|C2b1D?EUg_@TI$$Z6B z*9BhYp5`j$yBRi_N-mL&UAm{xpBvGheRl}D`tCu{RzA)dZ`ZEB{Zvl`)wx1n3nX~?y9TUxJy zGz*rS9*IiKped%~*LSV32AkFk;_x@)9=1)2e2nkF%^DbdiS_=~pj;na-E*=5+}IsuD~OO0cVGmV3d z6K={i+@N6ZK@hdKImk#?HN3}d%B|mR%x#8SUGY$#Ml+bh%fp&CSPLv&)wNlm9rW|5 z?0RVrdar+P-m!XB(?DZgd0l5+L#Pv^;^FpmeVwppMUggtNNZ?UC+`|>njim=Xa~N6 zbvAH)w$}>wkZ{3m02H*TtlKT?`Q){AzPdjZU)S#83^OMfGIkpHl!6u~rsD^AfI8NH zBnJymaTFuvj}gN4?is?pSJ+x}Ok z2Wua`(9}=Uo!lPGfv7zHFP?*We_L1}WjI};Is<*Pa`j(hPOT{;70t5JMXhS>C_C}C zxbey`!D$&)z^loaWZS<^11p$5N+Z3DhoK)WtC+{oVJcqVA%7cxvDXMobF~Z?9`zp# zauK@G+58yG*U~F>DKET=(O9k5~woEhRcR4R_Tt+8nqHmbd(beH6(08 z>1v(6CDabfyLf7J&8cZcZ4iHj zm5gbul(>FBD_(}Rfz<8EQg^93w)fyW)1Rv@iPJErkUim3ap^ez8t;^Utn(=lnl-pf zgI4D)#qQMWTlgAMOR-DTN@hyUzfY88>g$UPmbWA)s@ardmwL}>%puK{?`zTZmbRK& z0kBn#N&{r21BQZG#-Xa8j+fjv;&+aH^rZ{xm2ODt58v$^){54n=Haxc);o^%=e$){ z*CZWWxaXkfUW#YS*A3SUy(MbsOQPkI?|WK1p4IQPCvk8Kaa9e9I(C_gI&{20q0y@7 zOYAgI7OG;gw$2E8=hkeisg^PHF*G5UfljJoDvjyK^*hW3(^=EGT^XGYs>*_@Aim~% z{K=PiWK7^&WZs_DZ?vY24kdIl1N1tZWw|0G@?e zIx7=P&U%oIqm7QuPa9VoTN@u6G$W_-87{q(awM&%<(B22JA2FH%O3RzWMk+}EoH8f zXUEGf^#ohT`^z@<{8kUM=cR&LUQPGOcWr0ZXR<5#%k1?BR?N%rmX(WT^$V7E^T=~C zd@lN*5nj}@`HOEZNB2f+qb=GlK*IAMm% zn#;(^_xbW-UBmwajX-k0*K2Kd&aB%Kvcv1P*X^q7tJ`1K5Ah>)$Lmhjovpi2cd71b z-SxU#b;I>+eRO?Xy{bKCiw|@<453z0qcsJRQlWsJGX9>iv?JS6_eQ zSPeK>-)_4^b$$I@``Y>i^>dwF^^5D5*7ww}s$W~bp?*`{E$c;^(iU64)h5*MsNY>L z`&pJ%^#?-!tmI?XAEJJxO?0fF9$)>@Q0?|j^(O$MuT+1!9{eWR$JuAS39TBa+f|Wi zOR2vMYXI-K;jm+m^?bvzhLhm)g8$oarr~_UMLB*2@il5MHQba&l6rry4MQ@9 zRyC4Fbz^KJk>ZHCMximqp4FJ%I1{{A@L?NgHO_7fifi1Cc$b75`x^Iy z=Lr5|V}Ik3#^X*xy~xH>jc0!wFF4a1FEw5Te7*6Ob9Uo!kge;Z_azvOIL;Ou)HR$5 zCIwR+&R|9`%SnPc!93^eU}4Z`=?U6{o}i!l4w62ivJ0f*f?!QB7;F#D4K4^Sc6owJ z{Yk-|;3}#+f@^~tf}1FY_}1W#;O^kw-~qsg!uV+LMDTR*TyP+GIXHg^xo${4UGPTm zc5tLg*%Z^HY2urbo6?#xo3fj7gFRG!Qta+(%5N&F%%IY;$&A=3ZfgSnt|`z|*VNq9 z*)*?dp_^-3B5rP4*0iE&boZ=-UuX{YR40dCsUw6E!4(_zWaYC6_*vgu6I z`KF6?vzx9oU2D48G}M1gn$^v*%^YB%Ii)$B%FO1Oh-Wp=ZZ2pp25fZ=G>gr?x>LXOS=BZgZ%M7TN|swi za!W=_R!dGxUQ3}%*J5n3w|H9oEj2B{miC}Oc(i41@N~<9mc_x5mZdE{Evs7AwrptG z)Uvf@N6YS(y)6f9!!3t`t6GkZEA2$f>6UXX11*bI?p<4JTUXoswnc5-zT|(ljk`}ZF}3U zw!XIgZT)RW+KyMQb$7R&a<6PV+jar)rM9bW*V}Hj4Y#xH(d}`7b)6<_xno<$&W=4D`#KH=&vhKG%%HgAnB;%;cbx1v({aAzV#k$^Yt(w_xJj*) zjv=~=(n+KlM{NvKvb<6;Zg$WT##RP8)t#}OT<|j0@0|km!8=nZH+H5=t3y;ixVt)M z23JA(Xo+>s>YVL55!~Hb;5s2uq;-|fVpme9wI!!h?DR=qe`i%^LuV_!*IxQQRs(aL z`8|Ij%paIrgk^@9KM^G}$}&XFs#rCd!cJvl$y8RuCXi{Yp5;kAo5W5h32Yks0MW9U z?88LQevADUF(|AG8xd4ym4zg!=Bu71$*MP0Z;+HY2;}~_)HoMOjq}9S5HYSk?(ax- z-1Bj-lVx#7;|9qO;;zNrB4?mAr9??jbdY~I5>KX(1mYu8iJt_Cn>3TZCpF}&WHnh% z){uWDJ>-|kpHVJVE@M8cT%r7XW{L87<@3x^<%`O1FkgRE zzNCDaS+3lr+|7JNxmWpPW|i`F*{uA7@{i27m3Ne*%vP0FrDeXW`e)S$vt6xHr!%M352+twZmJ(vXET3L ze^Q;#{7GG)E@DR2C2Aw9RGZZ+BcRZ>w*zJ?dNP5q3osiJHbfAH_xK*_WaWQ4g>$M`c7k#_o=q6V-pk_D4M% zwU!->`g+vY6|qq-M)fMDMZFTWOQDV09o45WM7M4KoavLE=E#5BOrOulnpeC?dPd_DPWLAFR`(9~ZuegI0ZWl(o%@h= zm-}e$g4x7**zXaR-Oc_0QoqK&MpW!!_NOpYe!+kKf<&|b#Qqb^ zmw#qYlNk0adzQqqzh-|8v*tJKZ%7<_iTw|lJHKOp2Xp5Z`$xhl7zIOg3iu;>g-W3& zydqW+O9Tb4;7OuFPzWSRFp@;*!h13aSvH?*P1F_QN0E@w3a%yo_e0Hr@Cj3t(($SQ+E|zFO^nG z!z-lHDrqmSjM8;cx+;2PTsV%aqjYUF6hdpH;eawP4kXzvkbIFL)sy7DPS;F5Igm#V zvd^7|!S3<6FM0fs7Mv$fFtkz%WhRAIOX<0ZDP6KmQG!fKkl%k;NZ*D)-?pbD8RQ|N zB3Tfk$R{8~lY9tM@I4AKq!7YXVk9OQP5PFGI8p&2o>Y=5q9NeAKzU%W5G`qkpd-(c z1w>CiOBNFY`2vJQ@+AmKAg!J!)5(hv?jzrXkV3u#ynjD=1;Pxn3ql(CF@y)mPavd| z*C0Gd-Xw>ieaC+wWP)ToLmnn)$-lyE`4xmL^6wBnPW}@@Hn~CGhPK}(?~q5x2!ux& zmWd*{ObkfId}bO*#wS2BYDfV{#w1e6q%bqcQ_KU*1Ed5bWhOC#tn?5Q$jT~WW@?!R zVqtsLr6^Y_du zQq8Pk){t6eBeRjzft=k(>Y4q_e$vGBGjEV)<_PnTq?P#@^E1-U{G2&XI*@-q1u`O& zbVbjMo=KjL&W_F|^P(S#&LPi4=SJs}XQT6@^T~qf!stTsT=bmiIb>n9GulNy6WtKq zNIo0g6y1MBJ_q;q8uXs>{%p8=#I*%rJHRf0K7jo)^viGr;5eyvZFlW*^||)D`dvp{ z$6cpfXI&RumjGXNU3cArFf6iSv=}Gq#3V6Q%n-B095GKU6pf-?^oV}3MhuGW;#_fo zxL8~&_K2&*wGcLlo5Zc+4so}*S3Dpd5|4@}#M6J`Io&OBK)fstiZ{gD5Fc?X-7#*B z?v|T(C%eA+|DDn3&`zB$nDdS+mn&oQ;^&5M{Z9=ZcjsQ ze*k~EJsr9ILFD!f;H^86=|=Vu|$KY~2}DDwPc!1FAb z%_tcq`6P0C9&&p=b03oe{GZCCk|&Yd3z6HOLT)btZm%VCn0lt36eFLPAfFqN&rQhZ zX5jPB6D#ut<_pBedZ~&~#%Ocsx*j94a>waJO>|!n*qX0Cl;n$tMG< z-9s8aq~$*dge-xHKrMqv>)?Yx$a;SWSr8#BB4kO>-!Th9vK%Ht$bNV~(1A4pWq?(Y zfdEzo+7gjKcV8!h2keVTr~y0UgFK@YVV z_s}ESL}iJ$732xbeQ%c}1H6CprTI(em3NURj_M7{@7`{J<=&Mce)g{MtflqP>)!R! zp1XG!-D!7s<33Km_XwrazR|sQy3ORniK3=>+0rOB@cTIw@%mSdN8}L^?;ec}toc*4rEhkj?hyeAh&4#kPMtS zwE|jN~r&FM|4ZYvgroj^^lm;>@bP^?Gzl2VtpdA8s2R)fW z?FlN=LMK#0HUT}Uf-;Tje`+^?tSet%-b;0K`4)OUg`TM>?=L?xf7zK7e>B=-vb@AI zUDP%U*-cP)$VS1kS$A=@t!rt_uOR=Rz>SrVHC>lh|hd zLJ8j2Hlwyzr2R#0f3A?-6=`EZTQM(96B?6=a|`AlJtZ`8Uio3jLN=DahMpSo&!w^` zl+M4vznJnhJw1f{6p~|*hR!R>fAp80EAnsfZ^F2Is)$15e52=!sEqI*^`D^p=|Am1 zcb6Rl;2-c`rhxnifb$UK7CnQ6zqkD(p*cwBM1@j1jTD-He{^2a9Vt5BDl(;$N%S-l zo->ny_Lurtbew3PE1VVHia-sSQZwe@He34xJzxJ3mCnm!2U)IR^cwXNmCFQ|YJt zP+1c?MMO^!RrZAVhuYxO{)jwFgmhWvhE5gH^65OOe>_@wB6Nl*%&Q?kK-N(-j^~T$ zIiuT^Ba}wpd==Ldw}z1a-GBN2X#WLYfULkTvao+gF@x{UV}FU*h?IjEe;F}{lvNl{ z!uVGZE0FRA#;+o7M#}FH*CFLB;!TLB;ak_fjPYM1mcAQx6x+jKF8tCHdj_!y)4Y!O z8BEzifAJ{hV)5I+%uf(MhLq_TUx~N~%Zx($LZn>B`0o)nAmtpEwvXbGofO}B3F*H< zEPco97^WXa{3)dW2gWxb#`2jjVtfjwzk_8;b?rs`Af~~RiHKM6+u$Qon>+F9zalQf zHsc5=Y7jq(X|Qc<22!SCd@-iKiSfV3_z>a+f0(8b=_e7}k@8;{KZ0?*of5_v!AUL*U3F1D)$X5jC2*H^}K8<)Y;_o1S z4e>)*8gc@uM=agha*Sg;$qx~K5>rZXlr5t;>*eo%<18ajA;u9SPb2<2xpy}ZU&B7$ zKzt2*`hVGb8~CcOD&hN_bI-krl%}_sQktfiB1Ota2;oCWZf?HrM@kWCO76Y+FAxza zB1Mddh{#YxWRO7wh9V-R48tHIMMR2}0wRMcB14g(lp-<=@*q-7F^z}_mvG1hB7aTb zM%vp1Zlu*s;6~cs1XlV}&_DHXBfZfCZlq6|z>V}w6S$H7X#zLWOHJTL`l<=sNRKsv z8|k+ua3j6f1a71co4}3qWD~fN{%is_(yL8ir4K4CJ=sVfHh~-I!zQrM4y&a@RCgQC zwDCZjb-?Kf-5tzoW1IP#05hBHUVqT{L;nfP`f0BNGwwvfwH>ogqQ@~STLJh2*z6Q% zJxdN_$zd!J?DX~QQ4S+(W4WxEn)?8`%r*PZo(;-R!XHkl%kc3}o5(ESoLtGdth#z)aS6B?g)@CP4b z?K5jBJ?S(1vMFnJ$=%TGgFf~YAA7X#Fu8b?j~ZS4-&YCU85$39k#{*Axntoo;=W68 z%=$kI4*l#iC!F6x<1Ic;2=2qsZ-Y5O`5r>@O|aQbSS@|jZqv8U5`V?ljegE=4tuxF z9^tg$IrM|GnOaJbWT$q_K7!x+IOF+Pv3)(j#vXjw_dBpz6FA8@Q{i->F2>Pem-n&D z`{sgKu^r}`!2b*1y^YAqA=a3Pd*Z$q@DfpDhRa$auv6CL4 z_F?|J6bA~`=Ih^u|0sB_;5=mds^x-LWAijGUe78PTH95xSZHn6B*j9jRWZdve_xkf%>^AiAd^p9^3h}AX^+FV z;9K-Rc1rHIbvIG$SoG>x?bX23jNMq|pY?xIH2+kw^Q_^}OD}tvmQvSR^=-0N{#Ne$zxX!lFtopAnzK95q@KL=4)RO|A6Q=32tlSA&$#9Kb3*f~W1J4*Xz zz+vV(mF^MYyr|fzG#qT$ja7NjUxhC4zpj%0uL<1){rPA+iMDJcuObzMG@iF|&0n z`Wvxltd^C1p^L6Rs=@6^E5_1_kdB4hMX?j2Y>2Y2Q+61+%iXC;Yp!*Pv74*dx@0)m zPg|VFz+Dwvmvro$If{jrb~#Tf7J4W2PRgoPgB1&3Y_q?u*t&#mcjGNDQTyHW-Vka( zOYLtM4mFN{!-hX2{}W{XOzxkVvpZ?s8}N6+-$|)AD7BN-ucKmnC%x*!bJj3+KKkS_ z`k^1Vw`r-i%k51YAH&)zMj?w)sG?MrO1cs7S146QsjpC~N_#`-*PwSo@1#^0)*+T!lVyCL*lJ4W!`AfX(H(2|1L(|67^u~C9x0}+&9$o$H-!Q%_XnQmGH}ujv zEdRY?dmS3qAvqY!@ojq{k}pu#c8(i6oeP32=Z=m)#z4s_%5jPxq zrYHL2^h{5BCQi@vq-WyvOiy|y&Rl4uXX4EFM#VyFFD2=vDb#+Qx;io9*IDIyC>@B< zCp`>*N9zql{Q4fzL+cXyt3vNIK1RFtAin|59>bxfp9gQEy?dCso0z#T(lZtG%!|ms zh~#J_Uu6DPFn`~4KdbANV*5=b-}E0)4tTm^yBYkZ|2a6%LDxgqLw_9lVv6m{hJz&^!-iAf^B(?+O8WaK zAI}f?edVHXOx<7Djxuf4|hSSFzp6^M85E@HHs5Pq*|?Of3!6avE(7XgiIz2DF`j z_HWmDq*(0NURtHSB(L1MUq9^ME1Vy2&U~2F?@cXhFHmf~>2Xy5-zauEgNwjl)Dg58 zK_^GC#Rxis6$|}Kp?j%47Ncgp>3%{rgHK`M7pd!%w#E7*^lIw;qv3e+8RTk>F)TSt zE2h(mv-H(3Rnqq(m9&59*(@^l*A!cSZ>EK%?3ch>bR2#8I$r)p#?G87v!Hh=mR{0c z{WUcfc=$Ou&uK0m@`{d&`#AF1ls#f-v}L2=q+<6$G-PX8p`U}UhpvbIIP}M%e+JF| ztK;QmdW#-iV?sfG9#dgwg0{4l0regaUG<*)3 zEXL>!@Cs^q1ADrf{-=lEFg?tCd4vARV!pgV|779eZ_qzktO+X=3$1rTsru?3^$ht=Ioky=@SGx*l5R<_^lvpzIFXatO{#a1Jr!4q^FA^v@yee2KEp zx^<%Ml4AQ=@4ZGPGm(7W!(UMuot4gh?L*&jzn(VpTZUQsR=Zqr8f{POZ0Y-;a_)xn z5}dpBTrF>oyniX*J_~k`Tx+m$+;hmU^}j5w+sUXcB6ktFTQ%4J7GwH3^*-tjw(miuIHdx4U})cs@S5elWj2aCsp1(=+4Afm7fLw z4dweSOZ!&M|XYi|TaKdo9 z!O7w6<1T-u(s26nUT?A9_VsQgx=W1@1fCH388oa$!*99Yc-YX)@n7>k(#*Tbmkf=D z#X8^RO;-25#rWR;;O%dRV*7s}b2p_HQ7WsY%+h-Ut#_W*>wb@acmH<&PYM1#^a%94 zpZBJ_;JjZs?jYWqW-AUXH#Gd0&3m+Jmc3GIzn_`4n_0Y(b~VtJjo8zRvfI$#t3~&$ z*RXIg7QSZgjwtmRN)=%9I{Kt1oOR|6RPX5At>97ENx%8(!8?#lGg##VyuqdKR2<;_ zCGdATH`6V}fiJRu*K@bv{}yBS60IAhGuJhH^fg@v0$85L{X^h0=;@`ofnO;0?^hXT zF7J%zc=tcgo9{Z_H(xY28_)yHy#a68NZJP|^@4fRy#5{P+AJ1+mm7?2#%6b;+U$N! zY5L(9E!shUj_1DO$J|#0wBKBFC-X$$2p+EQhG1Dqlzz&8yQ@+9^T?d@ZYK<_{Cjz4 zzYG2&@b3a|HE;1AeFWb#{r@B3e1q04#-451vzT#A^WMQ<68S%|M?Aqh^>?_%;=agz zh4<^Xxi@gleW3pwo_0=Yy}5P12In8)d`&s>cCVbtitV@In3a~D%U)>w>YCoe_YNEr z{{FxmrC9-grcm!w*f7O#S{!hW;QPVF;JYcih_ZXJ@I@?~frjVNFar%UxK;QDcOWy& z?VM_m6NpneieQDI-Kii6}rC%F6la-wn6E%8hT!TH3!WopmR~nO0d#V_KSbwo+qk$ zeBV_0v6n^=;GhK|^fNk8=CM)WE&OYrb!BnRj@&26XH8NiI|peJoP!|R&d$DhR> zAsnX@=PrjGjZ?Az0;^vK&M?jDUG^`%^P!#qbI_T^S&A2;jmIUnVkPGD|RwDjT|uV7iohyA?QtD zHt$C#dB500?jBkcF*fMBkye47tMvRM?^gPMc2MkL^CqJ7w>`}1om1!##TM^nPESr^ zCy_Zxsi%;6i!<0$$ei&`Ys%R}jdk?Qo|Y0F5p4c7HmC8n^(V#lT6&Uq5E(%|FJ(g? z;qBlMr@@zK-4xpO1;*$LlzL9F?=jWmKgAiC8)n~QoR&HB`yQj;F1ylp-)6<~Zm6q& z#3D4Xf7uUl-dhcR2>CKbd>IzLsjG*56~7IzK4dW?(wWyS;BA3F3Fn^`%lntw+`tKT zknu+4%Z&RIXQUiXabZRg<&=AvQai9`1~u;B%siJf^C9>zA^AGK`aR@X$LtY- zp2GhL_=KMGMdxx#U7!@_Qr7nAtnC8>dX}3Rct(2fBJ*XC-deapy|HlyG57y}#BIhg z?r{F(aa6;1T>TotPFH(-q&rLGE9uXv*j9+14D@`()qQZhq4BP-qir{uvkmRt#Om!? z*qtq$pSeeM#dg1{w7H2wzPHL-EqL-+YGkC`hxCTf;#Sc9z0$V1ZTJK98SZfQ8yXuP zP>%nga(oX^dxg2#e0%yI_>BHcxXQvoXEtkPTI0yAy;eVQS^{cGI^km>O^b&u62MkQ|%g&V+ z;LO$;Yd^ugR-N9<`9H+%oY@`f%}p%1`^}vvr?m)o+E1B#umA@AZb~EEjsJ$b!4=R8>Dx?mPm6{SqxqO> zuur=UBKdvAb_1L%+{=xB;#Rzh8}cmf==NaqCiAxjzuqxE%o=!w(^RFuo8+D~{?DrT zg8zO!iz4#^oE7|iA*eF;NJj7qrzwXTXHa8%)&cWQ+8O>y_?g~mN7s#C8cc3)a%a=$ zA*}5JCxm>6yVFeWPDAE~U(3on9VapK4ha4pt?NkZc5-&|X^;7TS92rkQ_cQ0s@dm5 z^JCQ2kGdW+97=uH+#zGz*Xg%Eag)E!&wVnSb=26vX>D*|pmG9dp_kBaT6R2=FCh5> z))ur(u=IUX+kTz<;RkrHyv_-#hn5ONurP;GXVJ40J!iR1kH5eV$!%E2pXRjPG;Yqek5am4@># zaQ*?#zg&O6)Rn{jn8k@`6TA7Z&~Od;Yn-O0uv52#^FwM$BJ)F5uqe3?A=%l`NanB$ z{~VmdUEgW_w-(NDSMMn9RqPB$@}S=S`MATe53-M+(|-wnBP-8nrMw5_P?u_ZV*f z_A(X|;ruO}-*U&hiM{v;n19b;pJ$JD;ke%Uxt)~y2DnmflRe@S?6Xp%Tgy#aA@=m3 ze=d^S!y9Ggn9(`N+CJOd_36K9k(0n=or%bN7XI&luJ;ofoxaatZ8~}uV%0#b+E34a z%>1Q*y=)$Dtm}AVornB+S7lyuWj%BsWGsgBZt`1wH*r2ljofcLAN2f0Pg$jSS10pU zLQlr&$zQ_RNvS@*9n782;1#-4|EtcRKn=YylQuH50+Zpqf()nSz%)32x*iujQ}hkR zUFE)ipfoM&$h%UQRLNgBJ?QMs8O^+YxJu&o8It!UT3AVL(BSYG;p)(>(7}y$V`79qw^BE@AJl8W&TOA z(-Te?WR4@##oQpdwao5XrLpQ2WcuQ_ufX|#vHLWA{`-0i6nAbUf%= zK#u->B=7*YRp#%Nrx>+5Z2JtY{sgV&cF`FPX9%3paE6+{RIpUIJ3T)8?9{a8?ysH z5}Eei&9JVSgSf@r&6$nAP&<*pU98^vMsrYU=cmw3?lF2&&sW!Z3%JIO@uT|h5@l7_ znYf;w`57a{os7)8PwD^J;mCP^)k*0-;_KmlT5EUzQSff1oksT$mj0U=!M-MUt)+Je z8U^x%VtX8=Dir(ID|Q3mTz5Ki^V95%KezPOLN#2~+`tG*Rf7Aoe_aNrySfV;_kCGM z)~A0_tyJ2XssHz!GeNPh-ggph8mE4rV!Mke1?RA0_kv<+h2qt|Z)huj&=X=* z?+>9T2c5epo9EMeziz%|>IuHp*ttP(&MCVYTmU}f*`RcavMYW1cel~-!yewCX9G{e zYV9Sg+N!jD3QK&Bt=QjxEZBi|97j3!E^_tX9{00P^RH6%Z-T>}d4hZE%IWNIzNxFO z^S5fP^G|}0D(%d1^!|2+qkkuIRNh_$u2k%M8kuJu{>`4VP;ejL*9HF&x|i>}=n>j} z8%fGKQObT3`u%8oTfNl&H)_A)$et^Pt5>9)PS_dLnd0c_eVr435KgIckKmB=A$`YD zd3zZ63B}eQ75jW>s6bnl^MI}@&a3ED`jYb-U5%kPAUPBbEtLHL^jYvvZSCPL*l^zd zph)K0dV{3@XOC@Pwa@B`q1e7=H|sj%d zMa6+k=zoX4n}4Hz7xahW{{W6?aQ`8&MsbUtn*Je8R_wro$_YFOr-s}b=m>Pg&?@O( zfO7%P1vuB?Tvv|ooYKB?hSpr)3vgagj=#Oq{`Q8Z>{ZHtUPaqg<@igGDN&B&D($$2 zMt(8!i{X5O+;13~-0tLdr}mFg@5c;{C8G_7Q%`O^^^T;}NTma>(+{s>VGk_nVQ6ei zgOdhlDD+T6llxIPA4Shw=y?nMUC`eJ$NQIwN1UW+A*yjLo3Em?`mpX4Lt~Y5OfGSggiYHpl6)@=-E&04^#WY)b$7I z`U5f>k=Y1M8y(u{?10`uS-j4N*ZH^M?c3nv$v)%B&qF^C{V4RK(5y~ARww@w$}WL! zfNsG4RoK4@`Y`li$~H6CW-7MLI=LRqO69+Q4-NMjAAtW6%6j&>7IwmHvILH=VNSv@xAF27HXH4?S`8#IfPW*zjZMOz2GHA2jPZeYhWg zozJ4}StMEK(^%)-Bh-Eb&0W#ll~%9<`&fZ}jGd3Mb8Fb|UPr&TmYOw_x_*S@kC4nm za~}3EUjob*r<6V{Me`Qqw;<1s;F=wQ`R+IKeH=35u$)~fja@0gx*h0j<`*{n3mX0f z4%&QZbG}ZEU#FHgk$Dphe~*U0hh}Fs449n}|8eji-z4-*GHU{De3<#W5zqVs^|DsD zX02#MzLC2A75=|MuYq2J47-ny-N*Mf^xK!twwCDvsU&6P~ zhw<(6kJ^7@KVv;%f5rZaHG*%SSMlxh1m8YS@zwKc`$hZ5R*n6V{gU-DzIr~Aubz+M ztLLNLdG6m?pLD~jQW;46NxjFF z5y=;SQtt`iJ!#@QQSmDMTK@Z&yy*og7NI=%;S(M4iTlMP_KGL#m+&7DFL*x1z+Nxi|1S2t8<$h@1-t={mk{y=mH{!Br}70a7F&OA zU&rqx(`xgb*5g)K&<5VEuD`aI?D7T00UejJ^93vc&X?cw1v>#dw;S{YLjeH;mtXY- zPXR8Muk{6f0p6D`_60Zrh_`3<1quOwzgVt)-Lb5I<97m9x^tJ)-fHIroqJ_9xzFin zWjI;RgI3V#;(XBR;B7LA>(saG-Gncm#oJ#W@J2LJ&`dx<7?KF8H+MrwyH9AX6&+NX6(y&)0&lk(U@_` zTKm7TW%_>{)${LFwp%?dD|*a>lLBWvIPby5HnhSefvX-Zaxuryv2+hIJjfKt637wg zCeX{s#_~ORVGdA4(mR+Ey%%z*NN#{}n&*59i?ltnB0PK*wJ`|zH=TcabQ zHTsvwV5L}<=6|36eU=scbnw%{`CRaGmJ|F!@C%kNI5jxca)W;p{2R+3To7Dp>Hn3t z&pFBID<-Eet52@wv;qBX-v-L}wE^V~k8FuFL=Hp_M~+2KM$SaeM=nM#MXpAjXnHgw zni} zEAzkJbEg6HhLl26ulg6iMg?MeW%2Nv5v9qSeID$SZ=I; ztRPkri^Yb?Z@!0rSeQZi>dTdr~ZfrqpNo;v+Rcvj4Y(s2wY@3wc72BJa zDfY<|+aEg=ITJhDXI<=sNS^LDBz7*=7;BcCD{(6xc(=5*o_PCshj^!W=Xlq6k9b~u zU_8|4QoJlWE?yBImOmptLiNUL;-lhY;}aqc@k#Ni@fq>i(e%FK1SbSPW3>x@R%S>0;OB#%x9*WS@+B)6{BrQi)_pQZ zp0PRxzY?5fJrJB7oNYZAoD-aDWe2|@v*rWA<-s-9qrtVopIZGbjcm95<~;3r!5SW& z6rCEK5uF`>oflmwkK(1IE266<9Vo!*p=_bI;%VN2vNELg*&^$nmNN45BuDif6OAW@ ze@1xT8AJ456plVCVor3moDtGRzi3z8Wu04fM-RwaDNrW=MOU*@4E>+eJMM9Rrj;hW zqyKu?>T%Gr?*IWWb-mOl;IzqaTh9M3I-V%M8d({CStGDss7T_{=Cb8PQ+J;z3xA{mj(k<3U-)Qz;{HbgR`?IKyx zV6>w^woqN7-38}HvdSwWS&?bc{?USHNwlEn7LklavP#-VhYD1xWF)8elxRv|WF#j# z=GJn5B0WA@A01y(Mh)Fck4LAJ9xtB|=@y+Hot3{PIybr?av{1Tx?FU2=y$ZFLv)qu zEZ-en8{HtVS*UHd*|MwWmgwG|Tgux<@}v7BgQAC`N27=Oo{S7C8xsjfPee}(ln8aM z>_oIN+AMITG%J5iWOB@k1q9khBBdFTA+ZjBxl3amVx1yG`ea0g=dO!&&Ry4QW@LEj zzDQPXL#(Sn589U*%Zt{>^1L=AVgq9#fij^gN)D8?j|~$TQF5ScLnJF!6B`w)kIUTmSjQp$CUt%$7_SZDgPXIX4xbU|!? zi|NnU_T2Na?Xle|8EYur6FVSqShbX9#g6qp6gw6>iPcWeuCX%$=ilisv5T=wv8%C5 zk+X59XQx}eC!QY9h-bz#%67%GdNtkZOC=ZMIq`1soZNuE80~AE84|>+E;X} z$bP2}R&>d2=yl}IK3LIRd@!Is$gkXr{uKrKtD;2xvmzENs~Fn*3VD?ksfv-Uc@^Dz zUX2AbujD|*n2PZgV`AIY3(5{v)W?PijHsAWwjnyJbY{i$=z_jyv?pZsd|&X9pu8al zdjxyQsj5$~zm*m&42G<`gW+I*v8czCl*sds%%uvijc7>YK&to6YL`5UXzvt8WihU;Q4? zTzd!qj)&9TBf|mPOaCKiD>J+}Qr^9rRi0bkzr3Klq&!wWw6vzYvOE=k-d#Sjd`$WH zg3aaiBeb%FmU|EpIGuE*e>WrFeeCDzzekwotw+(mv85(y1&F=^W`A=}~$t zl2mZi4GXGh8L5FcM(TZxR69oME=H>TyPQ4s|K?e6^WV@td<3vP=vca?bbIOU z(gt8l>4DP2rN>H7mYyj+FX_e7O9iJ(uPVRHDNBD(kWqR}Q_q@mu_hj@kQNLH4zYZ! zR&Cprd&2{LUc0mf?HI@R)2>X~ai6p!WzE4y!g@#lut3RwK?6#Ec)n$ojx@hZ#|Vr! z{L*@XDOUT^A*I9R8B&@kt&?=L;31{sO7&kCru`L*w2#|i%U%CTX^lL+6`K=sDz|b{ zVqeqEbl_n_54ft|r0uK@C00p;oNf-694k3la;D^b z$;FaOLR~C>xmxO!rkAWJ%_z;Jr@MLkLQk=-Pq2@?ZTFSkA;9j?j@_YsuuOJ`4EBY4 z*ca~oFO;;cEUOFc<=>!wU>snVjAt$;gDE}n%UWVPC!H(e4egzy)@EsEr3c#Xk)(FX z81MH@a752vqucWC#J^R({syh}y%VNL-t;zQXWdqRe(oJ@c`tVUHMw`Q-6~liu%ylJ zYm$O zXRq$F_St>*+J2`x^wm9QOL3on9vn`Ej`t=$ZC;j{tQf4ATFJ7mTw#VO8hHEpB5UCI zcrrybT#D?AbgX5{KFzgo-(3`3HFRoYFx5RtTri^UW_5d*@IEz98r%7rjyAu@F+uA!5vVG|*n zhO`E@!e`>2D*4(L=lqi{roezlL{tw}0iy&Xha41+!S?mBfV;b!W|(aOgBRzdIzbyT zMAISCp}bq2hPvSjX_VQloZg)FefE+5TFrd-L!T}R0+{AuHV9htEaNCqP*ytP8<8)V ztqg(r+~S1k%!t{z1u5*+wjsKdu(K2DYnof0WF4HszD(R&Q_vv{?WdTY?2P5B=|@!Y z9DfLlfB{2lsG&l7R~?Ufg=-}%2_!{grYf__9G8gF%hRQiwy%KQLSVr$U}}A@Z8gd4 zmK-r8bv*kmL#Z3sr2nHyIG`I8RG^|$6Njp3h0l-YEGy;iOF*wsE;F9ZaTn9qGI%G& zjPBxkOG3#~!&1?b%g?|d-H^AKodM-~*4u*%23}kmx>!d*@`s^5L#kepId7Gnp=^nPIq zq>k)Va!b6dfi@qHC;l-_?8S_JdwrX5rSNC1e{Fm%&ez7DT+^iKlG?ZeV~9a`yW&NC zjVfi%!n+?UiM1!wb)$#zOaO|O3a9?l*qDaL^mmfA{5E$>H$OeUkN=g3!dj-PmiuAz zB@y+W#TWt+4R?<1rRaX2g~d&6FM4XhV9nH~vZ!YZ3lV6`U}w0Q+pg+i?pFy$IO-+r zMl(fEtVM)Ib35Cp>;S#V;)goTVM=+B4>1TgpQuEWEzY|jM;!|QW#b6GQx89~{vN+c)Fa#-h2l$hSW%@qR$p@osnCL`|5=Ce><%~x~5d2wC27EKmYVI217ic&cz>{ zO3Y^NqOl*5TkBnLyCI7fZk>&bls2QFk4HbD%5koe{;**=h9Zm>CliARhNpn&jpKEP z%ZD6yuXt*3#Ch3xAT;O3nJj1;mkqy*6(N z;_%?Npje_!-_?RNEzP*j{Fsk&4V;X2CA}b;z%=+Qrhj!W6pnPJa29y&JinUpS2k6f zgpwfq-I0Ep#dN~6G33$}Jt!_Yi8?d-pAYUF2^8$*p5?1b7fG4R@M`|>+iZs`-(@D1 z%ljk8CDD{*3zsDBCh-W@A>;|eJ-UU2Br$c}6iuH#Sbm(OMY1Tk*aKe32kV^NUI`|U zXKn0}r)hd$g=-3i3D(E2^D|I5s+%T;=tY7(41yEx z7jS)i0oDeI2Z01b@UR~}pg1_$KiTxrAVPZil`bywIk`PEIu&USyWigiyAkpB_LSr9 zd2YoopoWG#wo|e-XJ^qql~*MDNtj8oQhIu%7)eUnzWa=vTF~Pwkh0cwbDH^ zqmVA5b@bV)tD987++pw(gV;vp<}QP355Oa)ehYiy6KtVTx-rSvn``gVW5Cj)s#f`d zmjl?b+!@V&%`kg>ft!6-J}R~fZ$G@F8o7MM-G}yycFiG~`v2^v>@i~6zF|x=)t8dd zOxF~vN;C>%kEkBoeqiM^dEEprD{i8!xgDE5^W7yk4G?T%y^gIJb(fweZk9wO0q1wc z?L3OR6Asax>YIGmUnTHdu8uC>GfdswPdj^(^Ru-b4Vum$Zr83lp9NQju1WMs`sC~& z+msd!3;&l=1&a_j%A({yY#akFwT`@Mj;cmF{zPeHR||hpDXGou&KH%+!pwX4q+EAZ z6VH7H_!7Kt6%uDMBX=&h0q@�aXu^_}&fOsM5^CG{YEQN4nv-dR>t!e{Vlq$bfw} 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

Kg1@er4cOSio^C#jiG`M2l;`W0I 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%0Dl`$ha$N=H0l!t3qZjxP`tp6S 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