summaryrefslogtreecommitdiff
path: root/src/systemc/tests/systemc/utils/sc_report/cached/cached.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/tests/systemc/utils/sc_report/cached/cached.cpp')
-rw-r--r--src/systemc/tests/systemc/utils/sc_report/cached/cached.cpp227
1 files changed, 227 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/utils/sc_report/cached/cached.cpp b/src/systemc/tests/systemc/utils/sc_report/cached/cached.cpp
new file mode 100644
index 000000000..8bddd9001
--- /dev/null
+++ b/src/systemc/tests/systemc/utils/sc_report/cached/cached.cpp
@@ -0,0 +1,227 @@
+/*****************************************************************************
+
+ 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 -- caching of report in process context
+
+ 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>
+
+
+/*
+
+ id1 has actions: display, cache
+ id2 has actions: display
+
+ Issue report in this order in the following contextes:
+
+ retrieve report from thread1 -> no report
+ retrieve report from method1 -> no report
+ retrieve report from global -> no report
+
+ info/id1/a -> thread1
+ warning/id1/b -> method1
+ info/id1/c -> global
+ warning/id1/d -> thread2
+ info/id1/e -> method2
+
+ info/id2/f -> thread1
+ warning/id2/g -> method1
+ info/id2/h -> global
+ warning/id2/i -> thread2
+ info/id2/j -> method2
+
+ retrieve report from thread1 -> info/id1/a
+ retrieve report from method1 -> warning/id1/b
+ retrieve report from global -> info/id1/c
+ retrieve report from thread2 -> no report
+ retrieve report from method2 -> no report
+*/
+
+
+static const char* severity2str[] = {
+ "INFO", "WARNING", "ERROR", "FATAL", "UNKNOWN_SEVERITY"
+};
+
+void dump_cached_report(const char* ctx)
+{
+ sc_report* report = sc_report_handler::get_cached_report();
+ cout << sc_time_stamp()
+ << " from context '" << ctx << "' ";
+ if (report) {
+ cout << report->get_msg_type()
+ << " " << severity2str[ report->get_severity() ] << endl
+ << " msg=" << report->get_msg()
+ << " file=" << report->get_file_name()
+ << " line " << report->get_line_number()
+ << " time=" << report->get_time();
+ const char* name = report->get_process_name();
+ cout << " process=" << (name ? name : "<none>") << endl;
+ } else {
+ cout << "<no cached report>\n";
+ }
+ sc_report_handler::clear_cached_report();
+}
+
+SC_MODULE( M )
+{
+ sc_in<bool> emit; // 1: emit, 0: dump cahced report
+ sc_in<const char*> id;
+ sc_in<bool> ofs;
+ sc_event t1, t2, m1, m2;
+
+ SC_CTOR( M ) {
+ SC_THREAD( thread1 );
+ sensitive << t1;
+ dont_initialize();
+
+ SC_THREAD( thread2 );
+ sensitive << t2;
+ dont_initialize();
+
+ SC_METHOD( method1 );
+ sensitive << m1;
+ dont_initialize();
+
+ SC_METHOD( method2 );
+ sensitive << m2;
+ dont_initialize();
+ }
+ void thread1() {
+ while(1) {
+ if (emit)
+ sc_report_handler::report(SC_INFO, id.read(), "aa"+ofs, "file_t1", 110+ofs);
+ else
+ dump_cached_report("t1");
+ wait();
+ }
+ }
+ void method1() {
+ if (emit)
+ sc_report_handler::report(SC_WARNING, id.read(), "bb"+ofs, "file_m1", 210+ofs);
+ else
+ dump_cached_report("m1");
+ }
+ void thread2() {
+ while(1) {
+ if (emit)
+ sc_report_handler::report(SC_WARNING, id.read(), "dd"+ofs, "file_t2", 120+ofs);
+ else
+ dump_cached_report("t2");
+ wait();
+ }
+ }
+ void method2() {
+ if (emit)
+ sc_report_handler::report(SC_INFO, id.read(), "ee"+ofs, "file_m2", 220+ofs);
+ else
+ dump_cached_report("m2");
+ }
+};
+
+
+int sc_main(int,char**)
+{
+ sc_report_handler::set_actions( "ID1", SC_DISPLAY | SC_CACHE_REPORT );
+ sc_report_handler::set_actions( "ID2", SC_DISPLAY );
+
+ sc_signal<bool> emit;
+ sc_signal<const char*> ID;
+ sc_signal<bool> ofs;
+ M uut("M");
+ uut( emit,ID,ofs );
+
+ emit = 0;
+ ID="ID3";
+ ofs=0;
+ sc_start( 1,SC_NS );
+
+ // dump initial cached reports
+ cout << "Initial status:\n";
+ uut.t1.notify();
+ uut.m1.notify();
+ uut.t2.notify();
+ uut.m2.notify();
+ dump_cached_report("global");
+ sc_start( 1, SC_NS );
+
+ // emit report ID1 everywhere
+ emit = 1;
+ ID="ID1";
+ sc_start( 1,SC_NS );
+ cout << "\n\nEmit ID1\n";
+ uut.t1.notify();
+ uut.m1.notify();
+ sc_start( 1, SC_NS );
+ sc_report_handler::report(SC_INFO, ID.read(), "cc", "file_g", 300);
+ uut.t2.notify();
+ uut.m2.notify();
+ sc_start( 1, SC_NS );
+
+ // emit report ID2 everywhere
+ cout << "\n\nEmit ID2\n";
+ emit = 1;
+ ID="ID2";
+ ofs=1;
+ sc_start( 1,SC_NS );
+ uut.t1.notify();
+ uut.m1.notify();
+ sc_start( 1, SC_NS );
+ sc_report_handler::report(SC_INFO, ID.read(), "c", "file_g", 310);
+ uut.t2.notify();
+ uut.m2.notify();
+ sc_start( 1, SC_NS );
+
+ // dump cached reports: should be all ID1
+ emit = 0;
+ sc_start( 1,SC_NS );
+ cout << "\n\nStatus:\n";
+ uut.t1.notify();
+ uut.t2.notify();
+ uut.m1.notify();
+ uut.m2.notify();
+ dump_cached_report("global");
+ sc_start( 1, SC_NS );
+
+ // dump cached reports again
+ // (should be all empty because dump clears cached report)
+ cout << "\n\nStatus:\n";
+ uut.t1.notify();
+ uut.t2.notify();
+ uut.m1.notify();
+ uut.m2.notify();
+ dump_cached_report("global");
+ sc_start( 1, SC_NS );
+
+ return 0;
+}