diff options
Diffstat (limited to 'src/systemc/tests/systemc/utils/sc_report/log_file/log_file.cpp')
-rw-r--r-- | src/systemc/tests/systemc/utils/sc_report/log_file/log_file.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/utils/sc_report/log_file/log_file.cpp b/src/systemc/tests/systemc/utils/sc_report/log_file/log_file.cpp new file mode 100644 index 000000000..7df9cb497 --- /dev/null +++ b/src/systemc/tests/systemc/utils/sc_report/log_file/log_file.cpp @@ -0,0 +1,126 @@ +/***************************************************************************** + + 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 log file + + That that messages are printed into the log file. + + 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 <systemc.h> + +SC_MODULE( M ) +{ + sc_event trigger_t, trigger_m; + SC_CTOR( M ) { + SC_THREAD( thread1 ); + sensitive << trigger_t; + dont_initialize(); + + SC_METHOD( method1 ); + sensitive << trigger_m; + dont_initialize(); + } + void method1() { + sc_report_handler::report( SC_INFO, "ID1", "after log is opened", "method", 101); + sc_report_handler::report( SC_WARNING, "ID2", "after log is opened", "method", 102); + sc_report_handler::report( SC_ERROR, "ID1", "after log is opened", "method", 103); + sc_report_handler::report( SC_FATAL, "ID2", "after log is opened", "method", 104); + } + void thread1() { + while(1) { + sc_report_handler::report( SC_INFO, "ID2", "after log is opened", "thread", 201); + sc_report_handler::report( SC_WARNING, "ID1", "after log is opened", "thread", 202); + sc_report_handler::report( SC_ERROR, "ID2", "after log is opened", "thread", 203); + sc_report_handler::report( SC_FATAL, "ID1", "after log is opened", "thread", 204); + wait(); + } + } +}; + +int sc_main(int,char**) +{ + const char fname[] = "./sc_report.log"; + M uut("uut"); + + // do not abort when on error, fatal + sc_report_handler::stop_after( SC_ERROR, 0 ); + sc_report_handler::stop_after( SC_FATAL, 0 ); + sc_report_handler::suppress( SC_STOP | SC_ABORT ); + sc_report_handler::set_actions( "ID1", SC_LOG | SC_DISPLAY ); + sc_report_handler::set_actions( "ID2", SC_LOG | SC_DISPLAY ); + + // produces messages before the log file is opened + sc_report_handler::report( SC_INFO, "ID1", "before log is opened", "no_file", 0); + sc_report_handler::report( SC_WARNING, "ID1", "before log is opened", "no_file", 0); + + // open log file + sc_report_handler::set_log_file_name( fname ); + sc_assert( strcmp(fname,sc_report_handler::get_log_file_name()) == 0 ); + + // emit report from global context at t=0 + sc_report_handler::report( SC_INFO, "ID1", "after log is opened", "file1", 1); + sc_report_handler::report( SC_WARNING, "ID2", "after log is opened", "file2", 2); + sc_report_handler::report( SC_ERROR, "ID1", "after log is opened", "file3", 3); + sc_report_handler::report( SC_FATAL, "ID2", "after log is opened", "file4", 4); + + // emit report from global context at 10ns, method at 20ns, thread at 30ns + uut.trigger_m.notify( 20, SC_NS ); + uut.trigger_t.notify( 30, SC_NS ); + sc_start( 10,SC_NS ); + sc_report_handler::report( SC_ERROR, "ID1", "after log is opened", "file3", 5); + sc_start( 100, SC_NS ); + + // close log file and more messages + sc_report_close_default_log(); + + sc_report_handler::report( SC_INFO, "ID1", "after log is closed", "no_file", 0); + sc_report_handler::report( SC_WARNING, "ID1", "after log is closed", "no_file", 0); + + // open file again and dump into cout so we cover it by regression + cout << "\n\nDump the logfile\n"; + FILE* log = fopen( fname,"r" ); + if ( !log ) { + SC_REPORT_FATAL( "Can not open the sc_report log file: ", fname ); + return 1; + } + while ( 1 ) { + int c = fgetc(log); + if (c==EOF) + break; + cout << static_cast<char>(c); + } + fclose( log) ; + + return 0; +} |