From 16fa8d7cc8c92f5ab879e4cf9c6c0bbb3567860f Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 24 May 2018 01:37:55 -0700 Subject: systemc: Import tests from the Accellera systemc distribution. Change-Id: Iad76b398949a55d768a34d027a2d8e3739953da6 Reviewed-on: https://gem5-review.googlesource.com/10845 Reviewed-by: Giacomo Travaglini Maintainer: Gabe Black --- .../action_selection/action_selection.cpp | 245 +++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 src/systemc/tests/systemc/utils/sc_report/action_selection/action_selection.cpp (limited to 'src/systemc/tests/systemc/utils/sc_report/action_selection/action_selection.cpp') diff --git a/src/systemc/tests/systemc/utils/sc_report/action_selection/action_selection.cpp b/src/systemc/tests/systemc/utils/sc_report/action_selection/action_selection.cpp new file mode 100644 index 000000000..75951037b --- /dev/null +++ b/src/systemc/tests/systemc/utils/sc_report/action_selection/action_selection.cpp @@ -0,0 +1,245 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you 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. + + *****************************************************************************/ + +/***************************************************************************** + + sc_report -- test error reporting, sepcifically which actions are selected + + An important part of the sc_report functionality is to translate + an reported tupel (id,severity) into a set of actions. This test + is dedicated to this functionality. It uses user-defined actions and + user-defined handler. + + Original Author: Ulli Holtmann, Synopsys, Inc., Jan 2003 + + *****************************************************************************/ + +/***************************************************************************** + + MODIFICATION LOG - modifiers, enter your name, affiliation, date and + changes you are making here. + + Name, Affiliation, Date: + Description of Modification: + + *****************************************************************************/ + +#include + + +/* + Allocate user-defined action: + + Allocate as many user-defined actions as possible. + Note: We need to have at least usr1..usr6 action which are used in + subsequent tests. + +*/ + +const unsigned num_usr_actions = 6; +sc_actions usr_actions[num_usr_actions]; + +sc_actions& usr1 = usr_actions[0]; +sc_actions& usr2 = usr_actions[1]; +sc_actions& usr3 = usr_actions[2]; +sc_actions& usr4 = usr_actions[3]; +sc_actions& usr5 = usr_actions[4]; +sc_actions& usr6 = usr_actions[5]; + +const char* id1 = "ID1"; +const char* id2 = "ID2"; +const char* id3 = "ID3"; +const char* id4 = "ID4"; + + +void allocate_user_actions( ) +{ + sc_actions usr; + for (unsigned int n=0; n<1000; n++) { + usr = sc_report_handler::get_new_action_id(); + if ( usr == SC_UNSPECIFIED ) { + cout << "We got " << n << " user-defined actions\n"; + break; + } + // make sure we don't get the same usr action again and that it + // is really new + sc_assert (usr!=SC_UNSPECIFIED && usr!=SC_DO_NOTHING && usr!=SC_THROW && + usr!=SC_LOG && usr!=SC_DISPLAY && usr!=SC_CACHE_REPORT && + usr!=SC_STOP && usr!=SC_ABORT ); + if ( n < num_usr_actions ) { + // save for later use + usr_actions[n] = usr; + for (unsigned int i=0; i "; + for (int n=0; n<32; n++) { + sc_actions action = actions & 1<") << endl; +} + + +/* + Test selection schema id x severity : + + ID + Severity 1 2 3 + + info usr2 usr1 usr5* + warning usr3 usr1 usr3 + error usr4 usr1 usr1* + fatal usr5 usr1 usr5 + + usr1..usr5 are user-defined actions + + ID 1 selects by severity rule which has lowest priority, + ID 2 selects by ID rule, + ID 3 selects by individual severity x ID rules (highest priority) + +*/ +void set_rules() +{ + // set rule 1: by severity + sc_report_handler::set_actions( SC_INFO, usr2 ); + sc_report_handler::set_actions( SC_WARNING, usr3 ); + sc_report_handler::set_actions( SC_ERROR, usr4 ); + sc_report_handler::set_actions( SC_FATAL, usr5 ); + + // set rule 2: by id + sc_report_handler::set_actions( id2, usr1 ); + + // set rule 3: by (id,severity) + sc_report_handler::set_actions ( id3, SC_INFO, usr5 ); + sc_report_handler::set_actions ( id3, SC_ERROR, usr1 ); +} +void query_rules( const char* id ) +{ + sc_report_handler::report( SC_INFO, id, "extra_msg_for_info", "no_specific_file", 0); + sc_report_handler::report( SC_WARNING, id, "extra_msg_for_warning","no_specific_file", 1); + sc_report_handler::report( SC_ERROR, id, "extra_msg_for_error", "no_specific_file", 2); + sc_report_handler::report( SC_FATAL, id, "extra_msg_for_fatal", "no_specific_file", 3); + cout << endl; +} +void query_rules() +{ + query_rules( id1 ); + query_rules( id2 ); + query_rules( id3 ); +} + + +int sc_main(int,char**) +{ + allocate_user_actions(); + sc_report_handler::set_handler( &dump_all_handler ); + + // disable automatic stop + sc_report_handler::stop_after( SC_ERROR, 0 ); + sc_report_handler::stop_after( SC_FATAL, 0 ); + + // Don't emit error|fatal for ID4 because this would + // terminate the simulation. + cout << "Default settings for ID4\n"; + query_rules( id4 ); + + // check default setting of rules + cout << "Specific settings for ID1..ID3\n"; + set_rules(); + query_rules(); + + // temporarily suppress usr4: + // - check which actions are emitted + // - check that suppress() restores old state + // - check return value of suppress(.) + cout << "temporarily suppress usr4\n"; + sc_start( 1,SC_NS ); + sc_report_handler::suppress( usr3 ); + sc_assert( sc_report_handler::suppress( usr4 ) == usr3 ); + query_rules( id1 ); + sc_assert( sc_report_handler::suppress() == usr4 ); + query_rules( id1 ); + + // temporarily force usr1: same checking as with suppress + cout << "temporarily force usr1\n"; + sc_start( 1,SC_NS ); + sc_report_handler::force( usr2 ); + sc_assert( sc_report_handler::force( usr1 ) == usr2 ); + query_rules( id1 ); + sc_assert( sc_report_handler::force() == usr1 ); + query_rules( id1 ); + + // temporarily force usr1: same checking as with suppress + cout << "temporarily suppress {usr3,usr4} and force {usr1,usr3}\n"; + sc_start( 1,SC_NS ); + sc_report_handler::force ( usr1|usr3 ); + sc_report_handler::suppress( usr3|usr4 ); + query_rules( id1 ); + sc_report_handler::force(); + sc_report_handler::suppress(); + query_rules( id1 ); + + return 0; +} -- cgit v1.2.3