blob: f6e86e1692164800fbb197b6e5e8c55ae2a83c6e [file] [log] [blame]
//
//----------------------------------------------------------------------
// Copyright 2018 Cadence Design Systems, Inc.
// Copyright 2018 NVIDIA Corporation
// All Rights Reserved Worldwide
//
// Licensed under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in
// writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See
// the License for the specific language governing
// permissions and limitations under the License.
//----------------------------------------------------------------------
// @uvm-ieee 1800.2-2017 auto F.6.1
virtual class uvm_run_test_callback extends uvm_callback;
// @uvm-ieee 1800.2-2017 auto F.6.2.1
// @uvm-ieee 1800.2-2017 auto F.7.1.1
extern function new( string name="uvm_run_test_callback");
// @uvm-ieee 1800.2-2017 auto F.6.2.2
virtual function void pre_run_test();
endfunction
// @uvm-ieee 1800.2-2017 auto F.6.2.3
virtual function void post_run_test();
endfunction
// @uvm-ieee 1800.2-2017 auto F.6.2.4
virtual function void pre_abort();
endfunction
// @uvm-ieee 1800.2-2017 auto F.6.2.5
extern static function bit add( uvm_run_test_callback cb );
// @uvm-ieee 1800.2-2017 auto F.6.2.6
extern static function bit delete( uvm_run_test_callback cb );
//
// Implementation details.
//
// These functions executes pre_run_test, post_run_test, and pre_abort routines for all registered
// callbacks. These are not user functions. Only uvm_root should call these.
extern static function void m_do_pre_run_test();
extern static function void m_do_post_run_test();
extern static function void m_do_pre_abort();
local static uvm_run_test_callback m_registered_cbs[$];
endclass : uvm_run_test_callback
function uvm_run_test_callback::new( string name="uvm_run_test_callback");
super.new( name );
endfunction
// Adds cb to the list of callbacks to be processed. The method returns 1 if cb is not already in the list of
// callbacks; otherwise, a 0 is returned. If cb is null, 0 is returned.
function bit uvm_run_test_callback::add( uvm_run_test_callback cb );
bit found;
int unsigned i;
if ( cb == null ) begin
return 0;
end
found = 0;
i = 0;
while ( ! found && ( i < m_registered_cbs.size() ) ) begin
if ( m_registered_cbs[ i ] == cb ) begin
found = 1;
end
++i;
end
if ( ! found ) begin
m_registered_cbs.push_back( cb );
end
return ! found;
endfunction
// Removes cb from the list of callbacks to be processed. The method returns 1 if cb is in the list of callbacks;
// otherwise, a 0 is returned. If cb is null, 0 is returned.
function bit uvm_run_test_callback::delete( uvm_run_test_callback cb );
int cb_idxs[$];
if ( cb == null ) begin
return 0;
end
cb_idxs = m_registered_cbs.find_index( item ) with ( item == cb );
foreach ( cb_idxs[ i ] ) begin
m_registered_cbs.delete( i );
end
return ( cb_idxs.size() > 0 );
endfunction
function void uvm_run_test_callback::m_do_pre_run_test();
foreach ( m_registered_cbs[ i ] ) begin
m_registered_cbs[ i ].pre_run_test();
end
endfunction
function void uvm_run_test_callback::m_do_post_run_test();
foreach ( m_registered_cbs[ i ] ) begin
m_registered_cbs[ i ].post_run_test();
end
endfunction
function void uvm_run_test_callback::m_do_pre_abort();
foreach ( m_registered_cbs[ i ] ) begin
m_registered_cbs[ i ].pre_abort();
end
endfunction