sc_report.cpp revision 12027
112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_report.cpp -- Run-time logging and reporting facilities 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Interface design by SystemC Verification Working Group. 2512027Sjungma@eit.uni-kl.de Implementation by Alex Riesen, Synopsys Inc. 2612027Sjungma@eit.uni-kl.de Original implementation by Martin Janssen, Synopsys Inc. 2712027Sjungma@eit.uni-kl.de Reference implementation by Cadence Design Systems, Inc., 2002-09-23: 2812027Sjungma@eit.uni-kl.de Norris Ip, Dean Shea, John Rose, Jasvinder Singh, William Paulsen, 2912027Sjungma@eit.uni-kl.de John Pierce, Rachida Kebichi, Ted Elkind, David Bailey. 3012027Sjungma@eit.uni-kl.de 3112027Sjungma@eit.uni-kl.de CHANGE LOG AT END OF FILE 3212027Sjungma@eit.uni-kl.de *****************************************************************************/ 3312027Sjungma@eit.uni-kl.de 3412027Sjungma@eit.uni-kl.de 3512027Sjungma@eit.uni-kl.de#include <stdlib.h> 3612027Sjungma@eit.uni-kl.de#include <string.h> 3712027Sjungma@eit.uni-kl.de 3812027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_process.h" 3912027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext_int.h" 4012027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_stop_here.h" 4112027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_report.h" 4212027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_utils_ids.h" 4312027Sjungma@eit.uni-kl.de#include <algorithm> // std::swap 4412027Sjungma@eit.uni-kl.de 4512027Sjungma@eit.uni-kl.denamespace sc_core { 4612027Sjungma@eit.uni-kl.de 4712027Sjungma@eit.uni-kl.de 4812027Sjungma@eit.uni-kl.destatic void sc_deprecated_report_ids(const char* method) 4912027Sjungma@eit.uni-kl.de{ 5012027Sjungma@eit.uni-kl.de static bool warn_report_ids_deprecated=true; 5112027Sjungma@eit.uni-kl.de if ( warn_report_ids_deprecated ) 5212027Sjungma@eit.uni-kl.de { 5312027Sjungma@eit.uni-kl.de std::string message; 5412027Sjungma@eit.uni-kl.de message = "integer report ids are deprecated, use string values: "; 5512027Sjungma@eit.uni-kl.de message += method; 5612027Sjungma@eit.uni-kl.de warn_report_ids_deprecated=false; 5712027Sjungma@eit.uni-kl.de SC_REPORT_INFO(SC_ID_IEEE_1666_DEPRECATION_, message.c_str()); 5812027Sjungma@eit.uni-kl.de } 5912027Sjungma@eit.uni-kl.de} 6012027Sjungma@eit.uni-kl.de 6112027Sjungma@eit.uni-kl.destatic char empty_str[] = ""; 6212027Sjungma@eit.uni-kl.destatic inline char * empty_dup(const char * p) 6312027Sjungma@eit.uni-kl.de{ 6412027Sjungma@eit.uni-kl.de if ( p && *p ) 6512027Sjungma@eit.uni-kl.de { 6612027Sjungma@eit.uni-kl.de char* result; 6712027Sjungma@eit.uni-kl.de result = (char*)malloc(strlen(p)+1); 6812027Sjungma@eit.uni-kl.de strcpy(result, p); 6912027Sjungma@eit.uni-kl.de return result; 7012027Sjungma@eit.uni-kl.de } 7112027Sjungma@eit.uni-kl.de else 7212027Sjungma@eit.uni-kl.de { 7312027Sjungma@eit.uni-kl.de return empty_str; 7412027Sjungma@eit.uni-kl.de } 7512027Sjungma@eit.uni-kl.de} 7612027Sjungma@eit.uni-kl.de 7712027Sjungma@eit.uni-kl.desc_report::sc_report() 7812027Sjungma@eit.uni-kl.de: severity(SC_INFO), 7912027Sjungma@eit.uni-kl.de md(0), 8012027Sjungma@eit.uni-kl.de msg(empty_dup(0)), 8112027Sjungma@eit.uni-kl.de file(empty_dup(0)), 8212027Sjungma@eit.uni-kl.de line(0), 8312027Sjungma@eit.uni-kl.de timestamp(new sc_time(sc_time_stamp())), 8412027Sjungma@eit.uni-kl.de process(0), 8512027Sjungma@eit.uni-kl.de m_verbosity_level(SC_MEDIUM), 8612027Sjungma@eit.uni-kl.de m_what(empty_dup(0)) 8712027Sjungma@eit.uni-kl.de{ 8812027Sjungma@eit.uni-kl.de} 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.desc_report::sc_report(sc_severity severity_, 9112027Sjungma@eit.uni-kl.de const sc_msg_def* md_, 9212027Sjungma@eit.uni-kl.de const char* msg_, 9312027Sjungma@eit.uni-kl.de const char* file_, 9412027Sjungma@eit.uni-kl.de int line_, 9512027Sjungma@eit.uni-kl.de int verbosity_level) 9612027Sjungma@eit.uni-kl.de: severity(severity_), 9712027Sjungma@eit.uni-kl.de md(md_), 9812027Sjungma@eit.uni-kl.de msg(empty_dup(msg_)), 9912027Sjungma@eit.uni-kl.de file(empty_dup(file_)), 10012027Sjungma@eit.uni-kl.de line(line_), 10112027Sjungma@eit.uni-kl.de timestamp(new sc_time(sc_time_stamp())), 10212027Sjungma@eit.uni-kl.de process(sc_get_current_process_b()), 10312027Sjungma@eit.uni-kl.de m_verbosity_level(verbosity_level), 10412027Sjungma@eit.uni-kl.de m_what( empty_dup( sc_report_compose_message(*this).c_str() ) ) 10512027Sjungma@eit.uni-kl.de{ 10612027Sjungma@eit.uni-kl.de} 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.desc_report::sc_report(const sc_report& other) 10912027Sjungma@eit.uni-kl.de: std::exception(other), 11012027Sjungma@eit.uni-kl.de severity(other.severity), 11112027Sjungma@eit.uni-kl.de md(other.md), 11212027Sjungma@eit.uni-kl.de msg(empty_dup(other.msg)), 11312027Sjungma@eit.uni-kl.de file(empty_dup(other.file)), 11412027Sjungma@eit.uni-kl.de line(other.line), 11512027Sjungma@eit.uni-kl.de timestamp(new sc_time(*other.timestamp)), 11612027Sjungma@eit.uni-kl.de process(other.process), 11712027Sjungma@eit.uni-kl.de m_verbosity_level(other.m_verbosity_level), 11812027Sjungma@eit.uni-kl.de m_what(empty_dup(other.m_what)) 11912027Sjungma@eit.uni-kl.de{ 12012027Sjungma@eit.uni-kl.de} 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.desc_report & sc_report::operator=(const sc_report& other) 12312027Sjungma@eit.uni-kl.de{ 12412027Sjungma@eit.uni-kl.de sc_report copy(other); 12512027Sjungma@eit.uni-kl.de swap( copy ); 12612027Sjungma@eit.uni-kl.de return *this; 12712027Sjungma@eit.uni-kl.de} 12812027Sjungma@eit.uni-kl.de 12912027Sjungma@eit.uni-kl.devoid 13012027Sjungma@eit.uni-kl.desc_report::swap( sc_report & that ) 13112027Sjungma@eit.uni-kl.de{ 13212027Sjungma@eit.uni-kl.de using std::swap; 13312027Sjungma@eit.uni-kl.de swap( severity, that.severity ); 13412027Sjungma@eit.uni-kl.de swap( md, that.md ); 13512027Sjungma@eit.uni-kl.de swap( msg, that.msg ); 13612027Sjungma@eit.uni-kl.de swap( file, that.file ); 13712027Sjungma@eit.uni-kl.de swap( line, that.line ); 13812027Sjungma@eit.uni-kl.de swap( timestamp, that.timestamp ); 13912027Sjungma@eit.uni-kl.de swap( process, that.process ); 14012027Sjungma@eit.uni-kl.de swap( m_verbosity_level, that.m_verbosity_level ); 14112027Sjungma@eit.uni-kl.de swap( m_what, that.m_what ); 14212027Sjungma@eit.uni-kl.de} 14312027Sjungma@eit.uni-kl.de 14412027Sjungma@eit.uni-kl.desc_report::~sc_report() throw() 14512027Sjungma@eit.uni-kl.de{ 14612027Sjungma@eit.uni-kl.de if ( file != empty_str ) 14712027Sjungma@eit.uni-kl.de free(file); 14812027Sjungma@eit.uni-kl.de if ( msg != empty_str ) 14912027Sjungma@eit.uni-kl.de free(msg); 15012027Sjungma@eit.uni-kl.de delete timestamp; 15112027Sjungma@eit.uni-kl.de if ( m_what != empty_str ) 15212027Sjungma@eit.uni-kl.de free(m_what); 15312027Sjungma@eit.uni-kl.de} 15412027Sjungma@eit.uni-kl.de 15512027Sjungma@eit.uni-kl.deconst char * sc_report::get_msg_type() const 15612027Sjungma@eit.uni-kl.de{ 15712027Sjungma@eit.uni-kl.de return md->msg_type; 15812027Sjungma@eit.uni-kl.de} 15912027Sjungma@eit.uni-kl.de 16012027Sjungma@eit.uni-kl.de// 16112027Sjungma@eit.uni-kl.de// backward compatibility with 2.0+ 16212027Sjungma@eit.uni-kl.de// 16312027Sjungma@eit.uni-kl.de 16412027Sjungma@eit.uni-kl.destatic bool warnings_are_errors = false; 16512027Sjungma@eit.uni-kl.destatic const char unknown_id[] = "unknown id"; 16612027Sjungma@eit.uni-kl.de 16712027Sjungma@eit.uni-kl.devoid sc_report_handler::report(sc_severity severity_, 16812027Sjungma@eit.uni-kl.de int id_, 16912027Sjungma@eit.uni-kl.de const char* msg_, 17012027Sjungma@eit.uni-kl.de const char* file_, 17112027Sjungma@eit.uni-kl.de int line_ ) 17212027Sjungma@eit.uni-kl.de{ 17312027Sjungma@eit.uni-kl.de sc_msg_def * md = sc_report_handler::mdlookup(id_); 17412027Sjungma@eit.uni-kl.de 17512027Sjungma@eit.uni-kl.de if ( !md ) 17612027Sjungma@eit.uni-kl.de { 17712027Sjungma@eit.uni-kl.de md = sc_report_handler::add_msg_type(unknown_id); 17812027Sjungma@eit.uni-kl.de md->id = id_; 17912027Sjungma@eit.uni-kl.de } 18012027Sjungma@eit.uni-kl.de 18112027Sjungma@eit.uni-kl.de if ( severity_ == SC_WARNING && warnings_are_errors ) 18212027Sjungma@eit.uni-kl.de severity_ = SC_ERROR; 18312027Sjungma@eit.uni-kl.de 18412027Sjungma@eit.uni-kl.de sc_actions actions = execute(md, severity_); 18512027Sjungma@eit.uni-kl.de sc_report rep(severity_, md, msg_, file_, line_); 18612027Sjungma@eit.uni-kl.de 18712027Sjungma@eit.uni-kl.de if ( actions & SC_CACHE_REPORT ) 18812027Sjungma@eit.uni-kl.de cache_report(rep); 18912027Sjungma@eit.uni-kl.de 19012027Sjungma@eit.uni-kl.de if ( severity_ == SC_ERROR ) 19112027Sjungma@eit.uni-kl.de actions |= SC_THROW; 19212027Sjungma@eit.uni-kl.de else if ( severity_ == SC_FATAL ) 19312027Sjungma@eit.uni-kl.de actions |= SC_ABORT; 19412027Sjungma@eit.uni-kl.de 19512027Sjungma@eit.uni-kl.de handler(rep, actions); 19612027Sjungma@eit.uni-kl.de} 19712027Sjungma@eit.uni-kl.de 19812027Sjungma@eit.uni-kl.devoid sc_report::register_id( int id, const char* msg ) 19912027Sjungma@eit.uni-kl.de{ 20012027Sjungma@eit.uni-kl.de sc_deprecated_report_ids("sc_report::register_id()"); 20112027Sjungma@eit.uni-kl.de if( id < 0 ) { 20212027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_REGISTER_ID_FAILED_, 20312027Sjungma@eit.uni-kl.de "invalid report id" ); 20412027Sjungma@eit.uni-kl.de } 20512027Sjungma@eit.uni-kl.de if( msg == 0 ) { 20612027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_REGISTER_ID_FAILED_, 20712027Sjungma@eit.uni-kl.de "invalid report message" ); 20812027Sjungma@eit.uni-kl.de } 20912027Sjungma@eit.uni-kl.de sc_msg_def * md = sc_report_handler::mdlookup(id); 21012027Sjungma@eit.uni-kl.de 21112027Sjungma@eit.uni-kl.de if ( !md ) 21212027Sjungma@eit.uni-kl.de md = sc_report_handler::add_msg_type(msg); 21312027Sjungma@eit.uni-kl.de 21412027Sjungma@eit.uni-kl.de if ( !md ) { 21512027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_REGISTER_ID_FAILED_, 21612027Sjungma@eit.uni-kl.de "report_map insertion error" ); 21712027Sjungma@eit.uni-kl.de } 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.de if( md->id != -1 ) { 22012027Sjungma@eit.uni-kl.de if( strcmp( msg, md->msg_type ) != 0 ) { 22112027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_REGISTER_ID_FAILED_, 22212027Sjungma@eit.uni-kl.de "report id already exists" ); 22312027Sjungma@eit.uni-kl.de } 22412027Sjungma@eit.uni-kl.de return; 22512027Sjungma@eit.uni-kl.de } 22612027Sjungma@eit.uni-kl.de md->id = id; 22712027Sjungma@eit.uni-kl.de} 22812027Sjungma@eit.uni-kl.de 22912027Sjungma@eit.uni-kl.deconst char* sc_report::get_message( int id ) 23012027Sjungma@eit.uni-kl.de{ 23112027Sjungma@eit.uni-kl.de sc_deprecated_report_ids("sc_report::get_message()"); 23212027Sjungma@eit.uni-kl.de sc_msg_def* md = sc_report_handler::mdlookup(id); 23312027Sjungma@eit.uni-kl.de 23412027Sjungma@eit.uni-kl.de return md ? md->msg_type: unknown_id; 23512027Sjungma@eit.uni-kl.de} 23612027Sjungma@eit.uni-kl.de 23712027Sjungma@eit.uni-kl.debool sc_report::is_suppressed( int id ) 23812027Sjungma@eit.uni-kl.de{ 23912027Sjungma@eit.uni-kl.de sc_deprecated_report_ids("sc_report::is_suppressed()"); 24012027Sjungma@eit.uni-kl.de sc_msg_def* md = sc_report_handler::mdlookup(id); 24112027Sjungma@eit.uni-kl.de 24212027Sjungma@eit.uni-kl.de return md ? md->actions == SC_DO_NOTHING: false; // only do-nothing set 24312027Sjungma@eit.uni-kl.de} 24412027Sjungma@eit.uni-kl.de 24512027Sjungma@eit.uni-kl.devoid sc_report::suppress_id(int id_, bool suppress) 24612027Sjungma@eit.uni-kl.de{ 24712027Sjungma@eit.uni-kl.de sc_deprecated_report_ids("sc_report::suppress_id()"); 24812027Sjungma@eit.uni-kl.de sc_msg_def* md = sc_report_handler::mdlookup(id_); 24912027Sjungma@eit.uni-kl.de 25012027Sjungma@eit.uni-kl.de if ( md ) 25112027Sjungma@eit.uni-kl.de md->actions = suppress ? SC_DO_NOTHING: SC_UNSPECIFIED; 25212027Sjungma@eit.uni-kl.de} 25312027Sjungma@eit.uni-kl.de 25412027Sjungma@eit.uni-kl.devoid sc_report::suppress_infos(bool suppress) 25512027Sjungma@eit.uni-kl.de{ 25612027Sjungma@eit.uni-kl.de sc_deprecated_report_ids("sc_report::supress_infos"); 25712027Sjungma@eit.uni-kl.de sc_report_handler::sev_actions[SC_INFO] = 25812027Sjungma@eit.uni-kl.de suppress ? SC_DO_NOTHING: SC_DEFAULT_INFO_ACTIONS; 25912027Sjungma@eit.uni-kl.de} 26012027Sjungma@eit.uni-kl.de 26112027Sjungma@eit.uni-kl.devoid sc_report::suppress_warnings(bool suppress) 26212027Sjungma@eit.uni-kl.de{ 26312027Sjungma@eit.uni-kl.de sc_deprecated_report_ids("sc_report::suppress_warnings"); 26412027Sjungma@eit.uni-kl.de sc_report_handler::sev_actions[SC_WARNING] = 26512027Sjungma@eit.uni-kl.de suppress ? SC_DO_NOTHING: SC_DEFAULT_WARNING_ACTIONS; 26612027Sjungma@eit.uni-kl.de} 26712027Sjungma@eit.uni-kl.de 26812027Sjungma@eit.uni-kl.devoid sc_report::make_warnings_errors(bool flag) 26912027Sjungma@eit.uni-kl.de{ 27012027Sjungma@eit.uni-kl.de sc_deprecated_report_ids("sc_report::make_warnings_errors"); 27112027Sjungma@eit.uni-kl.de warnings_are_errors = flag; 27212027Sjungma@eit.uni-kl.de} 27312027Sjungma@eit.uni-kl.de 27412027Sjungma@eit.uni-kl.deint sc_report::get_id() const 27512027Sjungma@eit.uni-kl.de{ 27612027Sjungma@eit.uni-kl.de return md->id; 27712027Sjungma@eit.uni-kl.de} 27812027Sjungma@eit.uni-kl.de 27912027Sjungma@eit.uni-kl.de} // namespace sc_core 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.de// $Log: sc_report.cpp,v $ 28212027Sjungma@eit.uni-kl.de// Revision 1.8 2011/08/29 18:04:32 acg 28312027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: miscellaneous clean ups. 28412027Sjungma@eit.uni-kl.de// 28512027Sjungma@eit.uni-kl.de// Revision 1.7 2011/08/26 20:43:01 acg 28612027Sjungma@eit.uni-kl.de// Andy Goodrich: 28712027Sjungma@eit.uni-kl.de// (1) Replaced strdup with new and strcpy to eliminate issue with the 28812027Sjungma@eit.uni-kl.de// Greenhills compiler. 28912027Sjungma@eit.uni-kl.de// (2) Moved modification log to the end of the file to eliminate line 29012027Sjungma@eit.uni-kl.de// skew when check-ins are done. 29112027Sjungma@eit.uni-kl.de// 29212027Sjungma@eit.uni-kl.de// Revision 1.6 2011/08/24 22:05:56 acg 29312027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 29412027Sjungma@eit.uni-kl.de// 29512027Sjungma@eit.uni-kl.de// Revision 1.5 2011/05/05 17:46:04 acg 29612027Sjungma@eit.uni-kl.de// Philip A. Hartmann: changes in "swap" support. 29712027Sjungma@eit.uni-kl.de// 29812027Sjungma@eit.uni-kl.de// Revision 1.4 2011/03/23 16:16:48 acg 29912027Sjungma@eit.uni-kl.de// Andy Goodrich: finish message verbosity support. 30012027Sjungma@eit.uni-kl.de// 30112027Sjungma@eit.uni-kl.de// Revision 1.3 2011/02/18 20:38:44 acg 30212027Sjungma@eit.uni-kl.de// Andy Goodrich: Updated Copyright notice. 30312027Sjungma@eit.uni-kl.de// 30412027Sjungma@eit.uni-kl.de// Revision 1.2 2011/02/01 23:02:05 acg 30512027Sjungma@eit.uni-kl.de// Andy Goodrich: IEEE 1666 2011 changes. 30612027Sjungma@eit.uni-kl.de// 30712027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:06 acg 30812027Sjungma@eit.uni-kl.de// SystemC 2.3 30912027Sjungma@eit.uni-kl.de// 31012027Sjungma@eit.uni-kl.de// Revision 1.7 2006/03/21 00:00:37 acg 31112027Sjungma@eit.uni-kl.de// Andy Goodrich: changed name of sc_get_current_process_base() to be 31212027Sjungma@eit.uni-kl.de// sc_get_current_process_b() since its returning an sc_process_b instance. 31312027Sjungma@eit.uni-kl.de// 31412027Sjungma@eit.uni-kl.de// Revision 1.6 2006/01/25 00:31:27 acg 31512027Sjungma@eit.uni-kl.de// Andy Goodrich: Changed over to use a standard message id of 31612027Sjungma@eit.uni-kl.de// SC_ID_IEEE_1666_DEPRECATION for all deprecation messages. 31712027Sjungma@eit.uni-kl.de// 31812027Sjungma@eit.uni-kl.de// Revision 1.5 2006/01/24 22:02:30 acg 31912027Sjungma@eit.uni-kl.de// Andy Goodrich: switch deprecated features warnings to use a single message 32012027Sjungma@eit.uni-kl.de// id, SC_ID_IEEE_1666_DEPRECATION_. 32112027Sjungma@eit.uni-kl.de// 32212027Sjungma@eit.uni-kl.de// Revision 1.4 2006/01/24 20:53:41 acg 32312027Sjungma@eit.uni-kl.de// Andy Goodrich: added warnings indicating that use of integer ids in reports 32412027Sjungma@eit.uni-kl.de// is deprecated. Added tracing/sc_trace_ids.h to message list. 32512027Sjungma@eit.uni-kl.de// 32612027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:53:11 acg 32712027Sjungma@eit.uni-kl.de// Andy Goodrich: Added $Log command so that CVS comments are reproduced in 32812027Sjungma@eit.uni-kl.de// the source. 32912027Sjungma@eit.uni-kl.de 33012027Sjungma@eit.uni-kl.de// taf 331