// ========== Copyright Header Begin ==========================================
// OpenSPARC T2 Processor File: logger.hpp
// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; version 2 of the License.
// This program 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
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// For the avoidance of doubt, and except that if any non-GPL license
// choice is available it will apply instead, Sun elects to use only
// the General Public License version 2 (GPLv2) at this time for any
// software where a choice of GPL license versions is made
// available with the language indicating that GPLv2 or any later version
// may be used, or where a choice of which version of the GPL is applied is
// otherwise unspecified.
// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
// CA 95054 USA or visit www.sun.com if you need additional information or
// ========== Copyright Header End ============================================
#define WHERE_S __FILE__,__LINE__, ""
#define TIME "@(" << sc_time_stamp() << ")\t"
#define WHERE __FILE__,__LINE__, name()
#define WHERE_S __FILE__,__LINE__, ""
#define TIME "@(" << sc_time_stamp() << " from: " << inst << ")\t"
#define WHERE __FILE__,__LINE__, ""
#define LOG_ALWAYS (logger::instance()->log_always(WHERE))
#define LOG_ERROR (logger::instance()->log_error(WHERE))
#define LOG_WARNING (logger::instance()->log_warning(WHERE))
#define LOG_NORMAL (logger::instance()->log_normal(WHERE))
#define LOG_VERBOSE (logger::instance()->log_verbose(WHERE))
#define LOG_INFO (logger::instance()->log_info(WHERE))
#define LOG_DEBUG (logger::instance()->log_debug(WHERE))
#define LOG_ALWAYS_S (logger::instance()->log_always(WHERE_S))
#define LOG_ERROR_S (logger::instance()->log_error(WHERE_S))
#define LOG_WARNING_S (logger::instance()->log_warning(WHERE_S))
#define LOG_NORMAL_S (logger::instance()->log_normal(WHERE_S))
#define LOG_VERBOSE_S (logger::instance()->log_verbose(WHERE_S))
#define LOG_INFO_S (logger::instance()->log_info(WHERE_S))
#define LOG_DEBUG_S (logger::instance()->log_debug(WHERE_S))
enum LogLevel {NEVER, ALWAYS, ERROR, WARNING, NORMAL, VERBOSE, INFO, DEBUG, ALL};
static logger* instance(LogLevel log_l = ALL) {
inst = new logger(log_l);
inline logger& log_always (string file, int line, string inst) {
if (disp_level >= log_stat) {
(*disp_stream) << "\n-------------------------------------------------------------------------------\n";
(*disp_stream) << TIME << "@(" << file << ":" << line << "):\n";
if (log_level >= log_stat) {
(*log_stream) << "\n-------------------------------------------------------------------------------\n";
(*log_stream) << TIME << "@(" << file << ":" << line << "):\n";
inline logger& log_error (string file, int line, string inst) {
if (disp_level >= log_stat) {
(*disp_stream) << "\n-------------------------------------------------------------------------------\n";
(*disp_stream) << TIME << "ERROR@(" << file << ":" << line << "):\n";
if (log_level >= log_stat) {
(*log_stream) << "\n-------------------------------------------------------------------------------\n";
(*log_stream) << TIME << "ERROR@(" << file << ":" << line << "):\n";
inline logger& log_warning (string file, int line, string inst) {
if (disp_level >= log_stat) {
(*disp_stream) << "\n-------------------------------------------------------------------------------\n";
(*disp_stream) << TIME << "WARNING@(" << file << ":" << line << "):\n";
if (log_level >= log_stat) {
(*log_stream) << "\n-------------------------------------------------------------------------------\n";
(*log_stream) << TIME << "WARNING@(" << file << ":" << line << "):\n";
inline logger& log_normal (string file, int line, string inst) {
if (disp_level >= log_stat) {
(*disp_stream) << "\n-------------------------------------------------------------------------------\n";
(*disp_stream) << TIME << "@(" << file << ":" << line << "):\n";
if (log_level >= log_stat) {
(*log_stream) << "\n-------------------------------------------------------------------------------\n";
(*log_stream) << TIME << "@(" << file << ":" << line << "):\n";
inline logger& log_info (string file, int line, string inst) {
if (disp_level >= log_stat) {
(*disp_stream) << "\n-------------------------------------------------------------------------------\n";
(*disp_stream) << TIME << "INFO@(" << file << ":" << line << "):\n";
if (log_level >= log_stat) {
(*log_stream) << "\n-------------------------------------------------------------------------------\n";
(*log_stream) << TIME << "INFO@(" << file << ":" << line << "):\n";
inline logger& log_verbose (string file, int line, string inst) {
if (disp_level >= log_stat) {
(*disp_stream) << "\n-------------------------------------------------------------------------------\n";
(*disp_stream) << TIME << "VERBOSE@(" << file << ":" << line << "):\n";
if (log_level >= log_stat) {
(*log_stream) << "\n-------------------------------------------------------------------------------\n";
(*log_stream) << TIME << "VERBOSE@(" << file << ":" << line << "):\n";
inline logger& log_debug (string file, int line, string inst) {
if (disp_level >= log_stat) {
(*disp_stream) << "\n-------------------------------------------------------------------------------\n";
(*disp_stream) << TIME << "DEBUG@(" << file << ":" << line << "):\n";
if (log_level >= log_stat) {
(*log_stream) << "\n-------------------------------------------------------------------------------\n";
(*log_stream) << TIME << "DEBUG@(" << file << ":" << line << "):\n";
logger& operator<<(const string __s) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(const int __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(int8 __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(int16 __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(int32 __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(int64 __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(const unsigned int __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(uint8 __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(uint16 __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(uint32 __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(uint64 __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger& operator<<(double __i) {
if (disp_level >= log_stat)
if (log_level >= log_stat)
logger(LogLevel log_l = ALL, LogLevel disp_l = NORMAL, const char* log_file = "simulation.log") {
log_stream = new ofstream(log_file, ios::out);
#endif // INC_Logger_hpp__