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_wif_trace.cpp - Implementation of WIF tracing. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author - Abhijit Ghosh, Synopsys, Inc. 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de *****************************************************************************/ 2712027Sjungma@eit.uni-kl.de 2812027Sjungma@eit.uni-kl.de/***************************************************************************** 2912027Sjungma@eit.uni-kl.de 3012027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affliation, date and 3112027Sjungma@eit.uni-kl.de changes you are making here. 3212027Sjungma@eit.uni-kl.de 3312027Sjungma@eit.uni-kl.de Name, Affiliation, Date: Ali Dasdan, Synopsys, Inc. 3412027Sjungma@eit.uni-kl.de Description of Modification: - Replaced 'width' of sc_(u)int with their 3512027Sjungma@eit.uni-kl.de 'bitwidth()'. 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de Name, Affiliation, Date: 3812027Sjungma@eit.uni-kl.de Description of Modification: 3912027Sjungma@eit.uni-kl.de 4012027Sjungma@eit.uni-kl.de *****************************************************************************/ 4112027Sjungma@eit.uni-kl.de 4212027Sjungma@eit.uni-kl.de/***************************************************************************** 4312027Sjungma@eit.uni-kl.de 4412027Sjungma@eit.uni-kl.de Acknowledgement: The tracing mechanism is based on the tracing 4512027Sjungma@eit.uni-kl.de mechanism developed at Infineon (formerly Siemens HL). Though this 4612027Sjungma@eit.uni-kl.de code is somewhat different, and significantly enhanced, the basics 4712027Sjungma@eit.uni-kl.de are identical to what was originally contributed by Infineon. The 4812027Sjungma@eit.uni-kl.de contribution of Infineon in the development of this tracing 4912027Sjungma@eit.uni-kl.de technology is hereby acknowledged. 5012027Sjungma@eit.uni-kl.de 5112027Sjungma@eit.uni-kl.de *****************************************************************************/ 5212027Sjungma@eit.uni-kl.de 5312027Sjungma@eit.uni-kl.de/***************************************************************************** 5412027Sjungma@eit.uni-kl.de 5512027Sjungma@eit.uni-kl.de Instead of creating the binary WIF format, we create the ASCII 5612027Sjungma@eit.uni-kl.de WIF format which can be converted to the binary format using 5712027Sjungma@eit.uni-kl.de a2wif (utility that comes with VSS from Synopsys). This way, 5812027Sjungma@eit.uni-kl.de a user who does not have Synopsys VSS can still create WIF 5912027Sjungma@eit.uni-kl.de files, but they can only be viewed by users who have VSS. 6012027Sjungma@eit.uni-kl.de 6112027Sjungma@eit.uni-kl.de *****************************************************************************/ 6212027Sjungma@eit.uni-kl.de 6312027Sjungma@eit.uni-kl.de 6412027Sjungma@eit.uni-kl.de#include <cstdlib> 6512027Sjungma@eit.uni-kl.de#include <vector> 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.de#define SC_DISABLE_API_VERSION_CHECK // for in-library sc_ver.h inclusion 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h" 7012027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_ver.h" 7112027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit.h" 7212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_logic.h" 7312027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_lv_base.h" 7412027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h" 7512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h" 7612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_base.h" 7712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h" 7812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/fx.h" 7912027Sjungma@eit.uni-kl.de#include "sysc/tracing/sc_wif_trace.h" 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.denamespace sc_core { 8212027Sjungma@eit.uni-kl.de 8312027Sjungma@eit.uni-kl.de// Forward declarations for functions that come later in the file 8412027Sjungma@eit.uni-kl.destatic char map_sc_logic_state_to_wif_state(char in_char); 8512027Sjungma@eit.uni-kl.de 8612027Sjungma@eit.uni-kl.deconst char* wif_names[wif_trace_file::WIF_LAST] = {"BIT","MVL","real"}; 8712027Sjungma@eit.uni-kl.de 8812027Sjungma@eit.uni-kl.de 8912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 9012027Sjungma@eit.uni-kl.de// CLASS : wif_trace 9112027Sjungma@eit.uni-kl.de// 9212027Sjungma@eit.uni-kl.de// Base class for WIF traces. 9312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.declass wif_trace 9612027Sjungma@eit.uni-kl.de{ 9712027Sjungma@eit.uni-kl.depublic: 9812027Sjungma@eit.uni-kl.de 9912027Sjungma@eit.uni-kl.de wif_trace(const std::string& name_, const std::string& wif_name_); 10012027Sjungma@eit.uni-kl.de 10112027Sjungma@eit.uni-kl.de // Needs to be pure virtual as has to be defined by the particular 10212027Sjungma@eit.uni-kl.de // type being traced 10312027Sjungma@eit.uni-kl.de virtual void write(FILE* f) = 0; 10412027Sjungma@eit.uni-kl.de 10512027Sjungma@eit.uni-kl.de virtual void set_width(); 10612027Sjungma@eit.uni-kl.de 10712027Sjungma@eit.uni-kl.de // Comparison function needs to be pure virtual too 10812027Sjungma@eit.uni-kl.de virtual bool changed() = 0; 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de // Got to declare this virtual as this will be overwritten 11112027Sjungma@eit.uni-kl.de // by one base class 11212027Sjungma@eit.uni-kl.de virtual void print_variable_declaration_line(FILE* f); 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.de virtual ~wif_trace(); 11512027Sjungma@eit.uni-kl.de 11612027Sjungma@eit.uni-kl.de const std::string name; // Name of the variable 11712027Sjungma@eit.uni-kl.de const std::string wif_name; // Name of the variable in WIF file 11812027Sjungma@eit.uni-kl.de const char* wif_type; // WIF data type 11912027Sjungma@eit.uni-kl.de int bit_width; 12012027Sjungma@eit.uni-kl.de}; 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.de 12312027Sjungma@eit.uni-kl.dewif_trace::wif_trace(const std::string& name_, 12412027Sjungma@eit.uni-kl.de const std::string& wif_name_) 12512027Sjungma@eit.uni-kl.de : name(name_), wif_name(wif_name_), wif_type(0), bit_width(-1) 12612027Sjungma@eit.uni-kl.de{ 12712027Sjungma@eit.uni-kl.de /* Intentionally blank */ 12812027Sjungma@eit.uni-kl.de} 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.devoid 13112027Sjungma@eit.uni-kl.dewif_trace::print_variable_declaration_line( FILE* f ) 13212027Sjungma@eit.uni-kl.de{ 13312027Sjungma@eit.uni-kl.de if( bit_width < 0 ) 13412027Sjungma@eit.uni-kl.de { 13512027Sjungma@eit.uni-kl.de std::stringstream ss; 13612027Sjungma@eit.uni-kl.de ss << "'" << name << "' has < 0 bits"; 13712027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_TRACING_OBJECT_IGNORED_ 13812027Sjungma@eit.uni-kl.de , ss.str().c_str() ); 13912027Sjungma@eit.uni-kl.de return; 14012027Sjungma@eit.uni-kl.de } 14112027Sjungma@eit.uni-kl.de 14212027Sjungma@eit.uni-kl.de std::fprintf( f, "declare %s \"%s\" %s ", 14312027Sjungma@eit.uni-kl.de wif_name.c_str(), name.c_str(), wif_type ); 14412027Sjungma@eit.uni-kl.de 14512027Sjungma@eit.uni-kl.de if( bit_width > 0 ) { 14612027Sjungma@eit.uni-kl.de std::fprintf( f, "0 %d ", bit_width - 1 ); 14712027Sjungma@eit.uni-kl.de } 14812027Sjungma@eit.uni-kl.de std::fprintf( f, "variable ;\n" ); 14912027Sjungma@eit.uni-kl.de std::fprintf( f, "start_trace %s ;\n", wif_name.c_str() ); 15012027Sjungma@eit.uni-kl.de} 15112027Sjungma@eit.uni-kl.de 15212027Sjungma@eit.uni-kl.devoid 15312027Sjungma@eit.uni-kl.dewif_trace::set_width() 15412027Sjungma@eit.uni-kl.de{ 15512027Sjungma@eit.uni-kl.de /* Intentionally Blank, should be defined for each type separately */ 15612027Sjungma@eit.uni-kl.de} 15712027Sjungma@eit.uni-kl.de 15812027Sjungma@eit.uni-kl.dewif_trace::~wif_trace() 15912027Sjungma@eit.uni-kl.de{ 16012027Sjungma@eit.uni-kl.de /* Intentionally Blank */ 16112027Sjungma@eit.uni-kl.de} 16212027Sjungma@eit.uni-kl.de 16312027Sjungma@eit.uni-kl.de// Classes for tracing individual data types 16412027Sjungma@eit.uni-kl.de 16512027Sjungma@eit.uni-kl.de/*****************************************************************************/ 16612027Sjungma@eit.uni-kl.de 16712027Sjungma@eit.uni-kl.declass wif_uint64_trace: public wif_trace { 16812027Sjungma@eit.uni-kl.depublic: 16912027Sjungma@eit.uni-kl.de wif_uint64_trace(const sc_dt::uint64& object_, 17012027Sjungma@eit.uni-kl.de const std::string& name_, 17112027Sjungma@eit.uni-kl.de const std::string& wif_name_, 17212027Sjungma@eit.uni-kl.de int width_); 17312027Sjungma@eit.uni-kl.de void write(FILE* f); 17412027Sjungma@eit.uni-kl.de bool changed(); 17512027Sjungma@eit.uni-kl.de 17612027Sjungma@eit.uni-kl.deprotected: 17712027Sjungma@eit.uni-kl.de const sc_dt::uint64& object; 17812027Sjungma@eit.uni-kl.de sc_dt::uint64 old_value; 17912027Sjungma@eit.uni-kl.de sc_dt::uint64 mask; 18012027Sjungma@eit.uni-kl.de}; 18112027Sjungma@eit.uni-kl.de 18212027Sjungma@eit.uni-kl.de 18312027Sjungma@eit.uni-kl.dewif_uint64_trace::wif_uint64_trace(const sc_dt::uint64& object_, 18412027Sjungma@eit.uni-kl.de const std::string& name_, 18512027Sjungma@eit.uni-kl.de const std::string& wif_name_, 18612027Sjungma@eit.uni-kl.de int width_) 18712027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), 18812027Sjungma@eit.uni-kl.de mask(static_cast<sc_dt::uint64>(-1)) 18912027Sjungma@eit.uni-kl.de{ 19012027Sjungma@eit.uni-kl.de bit_width = width_; 19112027Sjungma@eit.uni-kl.de if (bit_width < (int)(sizeof(sc_dt::uint64)*BITS_PER_BYTE)) 19212027Sjungma@eit.uni-kl.de mask = ~(mask << bit_width); 19312027Sjungma@eit.uni-kl.de wif_type = "BIT"; 19412027Sjungma@eit.uni-kl.de} 19512027Sjungma@eit.uni-kl.de 19612027Sjungma@eit.uni-kl.de 19712027Sjungma@eit.uni-kl.debool wif_uint64_trace::changed() 19812027Sjungma@eit.uni-kl.de{ 19912027Sjungma@eit.uni-kl.de return object != old_value; 20012027Sjungma@eit.uni-kl.de} 20112027Sjungma@eit.uni-kl.de 20212027Sjungma@eit.uni-kl.de 20312027Sjungma@eit.uni-kl.devoid wif_uint64_trace::write(FILE* f) 20412027Sjungma@eit.uni-kl.de{ 20512027Sjungma@eit.uni-kl.de char buf[1000]; 20612027Sjungma@eit.uni-kl.de int bitindex; 20712027Sjungma@eit.uni-kl.de 20812027Sjungma@eit.uni-kl.de // Check for overflow 20912027Sjungma@eit.uni-kl.de if ((object & mask) != object) 21012027Sjungma@eit.uni-kl.de { 21112027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) 21212027Sjungma@eit.uni-kl.de { 21312027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 21412027Sjungma@eit.uni-kl.de } 21512027Sjungma@eit.uni-kl.de } 21612027Sjungma@eit.uni-kl.de else 21712027Sjungma@eit.uni-kl.de { 21812027Sjungma@eit.uni-kl.de sc_dt::uint64 bit_mask = 1; 21912027Sjungma@eit.uni-kl.de bit_mask = bit_mask << (bit_width-1); 22012027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) 22112027Sjungma@eit.uni-kl.de { 22212027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 22312027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 22412027Sjungma@eit.uni-kl.de } 22512027Sjungma@eit.uni-kl.de } 22612027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 22712027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 22812027Sjungma@eit.uni-kl.de old_value = object; 22912027Sjungma@eit.uni-kl.de} 23012027Sjungma@eit.uni-kl.de 23112027Sjungma@eit.uni-kl.de/*****************************************************************************/ 23212027Sjungma@eit.uni-kl.de 23312027Sjungma@eit.uni-kl.declass wif_int64_trace: public wif_trace { 23412027Sjungma@eit.uni-kl.depublic: 23512027Sjungma@eit.uni-kl.de wif_int64_trace(const sc_dt::int64& object_, 23612027Sjungma@eit.uni-kl.de const std::string& name_, 23712027Sjungma@eit.uni-kl.de const std::string& wif_name_, 23812027Sjungma@eit.uni-kl.de int width_); 23912027Sjungma@eit.uni-kl.de void write(FILE* f); 24012027Sjungma@eit.uni-kl.de bool changed(); 24112027Sjungma@eit.uni-kl.de 24212027Sjungma@eit.uni-kl.deprotected: 24312027Sjungma@eit.uni-kl.de const sc_dt::int64& object; 24412027Sjungma@eit.uni-kl.de sc_dt::int64 old_value; 24512027Sjungma@eit.uni-kl.de sc_dt::uint64 mask; 24612027Sjungma@eit.uni-kl.de}; 24712027Sjungma@eit.uni-kl.de 24812027Sjungma@eit.uni-kl.de 24912027Sjungma@eit.uni-kl.dewif_int64_trace::wif_int64_trace(const sc_dt::int64& object_, 25012027Sjungma@eit.uni-kl.de const std::string& name_, 25112027Sjungma@eit.uni-kl.de const std::string& wif_name_, 25212027Sjungma@eit.uni-kl.de int width_) 25312027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), 25412027Sjungma@eit.uni-kl.de mask(static_cast<sc_dt::uint64>(-1)) 25512027Sjungma@eit.uni-kl.de{ 25612027Sjungma@eit.uni-kl.de bit_width = width_; 25712027Sjungma@eit.uni-kl.de if (bit_width < (int)(sizeof(sc_dt::int64)*BITS_PER_BYTE)) 25812027Sjungma@eit.uni-kl.de mask = ~(mask << bit_width); 25912027Sjungma@eit.uni-kl.de wif_type = "BIT"; 26012027Sjungma@eit.uni-kl.de} 26112027Sjungma@eit.uni-kl.de 26212027Sjungma@eit.uni-kl.de 26312027Sjungma@eit.uni-kl.debool wif_int64_trace::changed() 26412027Sjungma@eit.uni-kl.de{ 26512027Sjungma@eit.uni-kl.de return object != old_value; 26612027Sjungma@eit.uni-kl.de} 26712027Sjungma@eit.uni-kl.de 26812027Sjungma@eit.uni-kl.de 26912027Sjungma@eit.uni-kl.devoid wif_int64_trace::write(FILE* f) 27012027Sjungma@eit.uni-kl.de{ 27112027Sjungma@eit.uni-kl.de char buf[1000]; 27212027Sjungma@eit.uni-kl.de int bitindex; 27312027Sjungma@eit.uni-kl.de 27412027Sjungma@eit.uni-kl.de // Check for overflow 27512027Sjungma@eit.uni-kl.de if ((object & mask) != (sc_dt::uint64)object) 27612027Sjungma@eit.uni-kl.de { 27712027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) 27812027Sjungma@eit.uni-kl.de { 27912027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 28012027Sjungma@eit.uni-kl.de } 28112027Sjungma@eit.uni-kl.de } 28212027Sjungma@eit.uni-kl.de else 28312027Sjungma@eit.uni-kl.de { 28412027Sjungma@eit.uni-kl.de sc_dt::uint64 bit_mask = 1; 28512027Sjungma@eit.uni-kl.de bit_mask = bit_mask << (bit_width-1); 28612027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) 28712027Sjungma@eit.uni-kl.de { 28812027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 28912027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 29012027Sjungma@eit.uni-kl.de } 29112027Sjungma@eit.uni-kl.de } 29212027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 29312027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 29412027Sjungma@eit.uni-kl.de old_value = object; 29512027Sjungma@eit.uni-kl.de} 29612027Sjungma@eit.uni-kl.de 29712027Sjungma@eit.uni-kl.de/*****************************************************************************/ 29812027Sjungma@eit.uni-kl.de 29912027Sjungma@eit.uni-kl.declass wif_bool_trace 30012027Sjungma@eit.uni-kl.de: public wif_trace 30112027Sjungma@eit.uni-kl.de{ 30212027Sjungma@eit.uni-kl.depublic: 30312027Sjungma@eit.uni-kl.de 30412027Sjungma@eit.uni-kl.de wif_bool_trace( const bool& object_, 30512027Sjungma@eit.uni-kl.de const std::string& name_, 30612027Sjungma@eit.uni-kl.de const std::string& wif_name_ ); 30712027Sjungma@eit.uni-kl.de void write( FILE* f ); 30812027Sjungma@eit.uni-kl.de bool changed(); 30912027Sjungma@eit.uni-kl.de 31012027Sjungma@eit.uni-kl.deprotected: 31112027Sjungma@eit.uni-kl.de 31212027Sjungma@eit.uni-kl.de const bool& object; 31312027Sjungma@eit.uni-kl.de bool old_value; 31412027Sjungma@eit.uni-kl.de}; 31512027Sjungma@eit.uni-kl.de 31612027Sjungma@eit.uni-kl.dewif_bool_trace::wif_bool_trace( const bool& object_, 31712027Sjungma@eit.uni-kl.de const std::string& name_, 31812027Sjungma@eit.uni-kl.de const std::string& wif_name_ ) 31912027Sjungma@eit.uni-kl.de: wif_trace( name_, wif_name_ ), object( object_ ), old_value( object_ ) 32012027Sjungma@eit.uni-kl.de{ 32112027Sjungma@eit.uni-kl.de bit_width = 0; 32212027Sjungma@eit.uni-kl.de wif_type = "BIT"; 32312027Sjungma@eit.uni-kl.de} 32412027Sjungma@eit.uni-kl.de 32512027Sjungma@eit.uni-kl.debool 32612027Sjungma@eit.uni-kl.dewif_bool_trace::changed() 32712027Sjungma@eit.uni-kl.de{ 32812027Sjungma@eit.uni-kl.de return object != old_value; 32912027Sjungma@eit.uni-kl.de} 33012027Sjungma@eit.uni-kl.de 33112027Sjungma@eit.uni-kl.devoid 33212027Sjungma@eit.uni-kl.dewif_bool_trace::write( FILE* f ) 33312027Sjungma@eit.uni-kl.de{ 33412027Sjungma@eit.uni-kl.de if( object == true ) { 33512027Sjungma@eit.uni-kl.de std::fprintf( f, "assign %s \'1\' ;\n", wif_name.c_str() ); 33612027Sjungma@eit.uni-kl.de } else { 33712027Sjungma@eit.uni-kl.de std::fprintf( f, "assign %s \'0\' ;\n", wif_name.c_str() ); 33812027Sjungma@eit.uni-kl.de } 33912027Sjungma@eit.uni-kl.de old_value = object; 34012027Sjungma@eit.uni-kl.de} 34112027Sjungma@eit.uni-kl.de 34212027Sjungma@eit.uni-kl.de//***************************************************************************** 34312027Sjungma@eit.uni-kl.de 34412027Sjungma@eit.uni-kl.declass wif_sc_bit_trace : public wif_trace { 34512027Sjungma@eit.uni-kl.depublic: 34612027Sjungma@eit.uni-kl.de wif_sc_bit_trace(const sc_dt::sc_bit& object_, 34712027Sjungma@eit.uni-kl.de const std::string& name_, 34812027Sjungma@eit.uni-kl.de const std::string& wif_name_); 34912027Sjungma@eit.uni-kl.de void write(FILE* f); 35012027Sjungma@eit.uni-kl.de bool changed(); 35112027Sjungma@eit.uni-kl.de 35212027Sjungma@eit.uni-kl.deprotected: 35312027Sjungma@eit.uni-kl.de const sc_dt::sc_bit& object; 35412027Sjungma@eit.uni-kl.de sc_dt::sc_bit old_value; 35512027Sjungma@eit.uni-kl.de}; 35612027Sjungma@eit.uni-kl.de 35712027Sjungma@eit.uni-kl.dewif_sc_bit_trace::wif_sc_bit_trace(const sc_dt::sc_bit& object_, 35812027Sjungma@eit.uni-kl.de const std::string& name_, 35912027Sjungma@eit.uni-kl.de const std::string& wif_name_) 36012027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_) 36112027Sjungma@eit.uni-kl.de{ 36212027Sjungma@eit.uni-kl.de bit_width = 0; 36312027Sjungma@eit.uni-kl.de wif_type = "BIT"; 36412027Sjungma@eit.uni-kl.de} 36512027Sjungma@eit.uni-kl.de 36612027Sjungma@eit.uni-kl.debool wif_sc_bit_trace::changed() 36712027Sjungma@eit.uni-kl.de{ 36812027Sjungma@eit.uni-kl.de return object != old_value; 36912027Sjungma@eit.uni-kl.de} 37012027Sjungma@eit.uni-kl.de 37112027Sjungma@eit.uni-kl.devoid wif_sc_bit_trace::write(FILE* f) 37212027Sjungma@eit.uni-kl.de{ 37312027Sjungma@eit.uni-kl.de if (object == true) { 37412027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \'1\' ;\n", wif_name.c_str()); 37512027Sjungma@eit.uni-kl.de } else { 37612027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \'0\' ;\n", wif_name.c_str()); 37712027Sjungma@eit.uni-kl.de } 37812027Sjungma@eit.uni-kl.de old_value = object; 37912027Sjungma@eit.uni-kl.de} 38012027Sjungma@eit.uni-kl.de 38112027Sjungma@eit.uni-kl.de/*****************************************************************************/ 38212027Sjungma@eit.uni-kl.de 38312027Sjungma@eit.uni-kl.declass wif_sc_logic_trace: public wif_trace { 38412027Sjungma@eit.uni-kl.depublic: 38512027Sjungma@eit.uni-kl.de wif_sc_logic_trace(const sc_dt::sc_logic& object_, 38612027Sjungma@eit.uni-kl.de const std::string& name_, 38712027Sjungma@eit.uni-kl.de const std::string& wif_name_); 38812027Sjungma@eit.uni-kl.de void write(FILE* f); 38912027Sjungma@eit.uni-kl.de bool changed(); 39012027Sjungma@eit.uni-kl.de 39112027Sjungma@eit.uni-kl.deprotected: 39212027Sjungma@eit.uni-kl.de const sc_dt::sc_logic& object; 39312027Sjungma@eit.uni-kl.de sc_dt::sc_logic old_value; 39412027Sjungma@eit.uni-kl.de}; 39512027Sjungma@eit.uni-kl.de 39612027Sjungma@eit.uni-kl.de 39712027Sjungma@eit.uni-kl.dewif_sc_logic_trace::wif_sc_logic_trace(const sc_dt::sc_logic& object_, 39812027Sjungma@eit.uni-kl.de const std::string& name_, 39912027Sjungma@eit.uni-kl.de const std::string& wif_name_) 40012027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_) 40112027Sjungma@eit.uni-kl.de{ 40212027Sjungma@eit.uni-kl.de bit_width = 0; 40312027Sjungma@eit.uni-kl.de wif_type = "MVL"; 40412027Sjungma@eit.uni-kl.de} 40512027Sjungma@eit.uni-kl.de 40612027Sjungma@eit.uni-kl.de 40712027Sjungma@eit.uni-kl.debool wif_sc_logic_trace::changed() 40812027Sjungma@eit.uni-kl.de{ 40912027Sjungma@eit.uni-kl.de return object != old_value; 41012027Sjungma@eit.uni-kl.de} 41112027Sjungma@eit.uni-kl.de 41212027Sjungma@eit.uni-kl.de 41312027Sjungma@eit.uni-kl.devoid wif_sc_logic_trace::write(FILE* f) 41412027Sjungma@eit.uni-kl.de{ 41512027Sjungma@eit.uni-kl.de char wif_char; 41612027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \'", wif_name.c_str()); 41712027Sjungma@eit.uni-kl.de wif_char = map_sc_logic_state_to_wif_state(object.to_char()); 41812027Sjungma@eit.uni-kl.de std::fputc(wif_char, f); 41912027Sjungma@eit.uni-kl.de std::fprintf(f,"\' ;\n"); 42012027Sjungma@eit.uni-kl.de old_value = object; 42112027Sjungma@eit.uni-kl.de} 42212027Sjungma@eit.uni-kl.de 42312027Sjungma@eit.uni-kl.de 42412027Sjungma@eit.uni-kl.de/*****************************************************************************/ 42512027Sjungma@eit.uni-kl.de 42612027Sjungma@eit.uni-kl.declass wif_sc_unsigned_trace: public wif_trace { 42712027Sjungma@eit.uni-kl.depublic: 42812027Sjungma@eit.uni-kl.de wif_sc_unsigned_trace(const sc_dt::sc_unsigned& object_, 42912027Sjungma@eit.uni-kl.de const std::string& name_, 43012027Sjungma@eit.uni-kl.de const std::string& wif_name_); 43112027Sjungma@eit.uni-kl.de void write(FILE* f); 43212027Sjungma@eit.uni-kl.de bool changed(); 43312027Sjungma@eit.uni-kl.de void set_width(); 43412027Sjungma@eit.uni-kl.de 43512027Sjungma@eit.uni-kl.deprotected: 43612027Sjungma@eit.uni-kl.de const sc_dt::sc_unsigned& object; 43712027Sjungma@eit.uni-kl.de sc_dt::sc_unsigned old_value; 43812027Sjungma@eit.uni-kl.de}; 43912027Sjungma@eit.uni-kl.de 44012027Sjungma@eit.uni-kl.de 44112027Sjungma@eit.uni-kl.dewif_sc_unsigned_trace::wif_sc_unsigned_trace(const sc_dt::sc_unsigned& object_, 44212027Sjungma@eit.uni-kl.de const std::string& name_, 44312027Sjungma@eit.uni-kl.de const std::string& wif_name_) 44412027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_.length()) 44512027Sjungma@eit.uni-kl.de{ 44612027Sjungma@eit.uni-kl.de old_value = object; 44712027Sjungma@eit.uni-kl.de wif_type = "BIT"; 44812027Sjungma@eit.uni-kl.de} 44912027Sjungma@eit.uni-kl.de 45012027Sjungma@eit.uni-kl.debool wif_sc_unsigned_trace::changed() 45112027Sjungma@eit.uni-kl.de{ 45212027Sjungma@eit.uni-kl.de return object != old_value; 45312027Sjungma@eit.uni-kl.de} 45412027Sjungma@eit.uni-kl.de 45512027Sjungma@eit.uni-kl.devoid wif_sc_unsigned_trace::write(FILE* f) 45612027Sjungma@eit.uni-kl.de{ 45712027Sjungma@eit.uni-kl.de static std::vector<char> buf(1024); 45812027Sjungma@eit.uni-kl.de typedef std::vector<char>::size_type size_t; 45912027Sjungma@eit.uni-kl.de 46012027Sjungma@eit.uni-kl.de if ( buf.size() < (size_t)object.length() ) { 46112027Sjungma@eit.uni-kl.de size_t sz = ( (size_t)object.length() + 4096 ) & (~(size_t)(4096-1)); 46212027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( buf ); // resize without copying values 46312027Sjungma@eit.uni-kl.de } 46412027Sjungma@eit.uni-kl.de char *buf_ptr = &buf[0]; 46512027Sjungma@eit.uni-kl.de 46612027Sjungma@eit.uni-kl.de for(int bitindex = object.length() - 1; bitindex >= 0; --bitindex) { 46712027Sjungma@eit.uni-kl.de *buf_ptr++ = "01"[object[bitindex].to_bool()]; 46812027Sjungma@eit.uni-kl.de } 46912027Sjungma@eit.uni-kl.de *buf_ptr = '\0'; 47012027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), &buf[0]); 47112027Sjungma@eit.uni-kl.de old_value = object; 47212027Sjungma@eit.uni-kl.de} 47312027Sjungma@eit.uni-kl.de 47412027Sjungma@eit.uni-kl.devoid wif_sc_unsigned_trace::set_width() 47512027Sjungma@eit.uni-kl.de{ 47612027Sjungma@eit.uni-kl.de bit_width = object.length(); 47712027Sjungma@eit.uni-kl.de} 47812027Sjungma@eit.uni-kl.de 47912027Sjungma@eit.uni-kl.de 48012027Sjungma@eit.uni-kl.de/*****************************************************************************/ 48112027Sjungma@eit.uni-kl.de 48212027Sjungma@eit.uni-kl.declass wif_sc_signed_trace: public wif_trace { 48312027Sjungma@eit.uni-kl.depublic: 48412027Sjungma@eit.uni-kl.de wif_sc_signed_trace(const sc_dt::sc_signed& object_, 48512027Sjungma@eit.uni-kl.de const std::string& name_, 48612027Sjungma@eit.uni-kl.de const std::string& wif_name_); 48712027Sjungma@eit.uni-kl.de void write(FILE* f); 48812027Sjungma@eit.uni-kl.de bool changed(); 48912027Sjungma@eit.uni-kl.de void set_width(); 49012027Sjungma@eit.uni-kl.de 49112027Sjungma@eit.uni-kl.deprotected: 49212027Sjungma@eit.uni-kl.de const sc_dt::sc_signed& object; 49312027Sjungma@eit.uni-kl.de sc_dt::sc_signed old_value; 49412027Sjungma@eit.uni-kl.de}; 49512027Sjungma@eit.uni-kl.de 49612027Sjungma@eit.uni-kl.de 49712027Sjungma@eit.uni-kl.dewif_sc_signed_trace::wif_sc_signed_trace(const sc_dt::sc_signed& object_, 49812027Sjungma@eit.uni-kl.de const std::string& name_, 49912027Sjungma@eit.uni-kl.de const std::string& wif_name_) 50012027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_.length()) 50112027Sjungma@eit.uni-kl.de{ 50212027Sjungma@eit.uni-kl.de old_value = object; 50312027Sjungma@eit.uni-kl.de wif_type = "BIT"; 50412027Sjungma@eit.uni-kl.de} 50512027Sjungma@eit.uni-kl.de 50612027Sjungma@eit.uni-kl.debool wif_sc_signed_trace::changed() 50712027Sjungma@eit.uni-kl.de{ 50812027Sjungma@eit.uni-kl.de return object != old_value; 50912027Sjungma@eit.uni-kl.de} 51012027Sjungma@eit.uni-kl.de 51112027Sjungma@eit.uni-kl.devoid wif_sc_signed_trace::write(FILE* f) 51212027Sjungma@eit.uni-kl.de{ 51312027Sjungma@eit.uni-kl.de static std::vector<char> buf(1024); 51412027Sjungma@eit.uni-kl.de typedef std::vector<char>::size_type size_t; 51512027Sjungma@eit.uni-kl.de 51612027Sjungma@eit.uni-kl.de if ( buf.size() < (size_t)object.length() ) { 51712027Sjungma@eit.uni-kl.de size_t sz = ( (size_t)object.length() + 4096 ) & (~(size_t)(4096-1)); 51812027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( buf ); // resize without copying values 51912027Sjungma@eit.uni-kl.de } 52012027Sjungma@eit.uni-kl.de char *buf_ptr = &buf[0]; 52112027Sjungma@eit.uni-kl.de 52212027Sjungma@eit.uni-kl.de for(int bitindex = object.length() - 1; bitindex >= 0; --bitindex) { 52312027Sjungma@eit.uni-kl.de *buf_ptr++ = "01"[object[bitindex].to_bool()]; 52412027Sjungma@eit.uni-kl.de } 52512027Sjungma@eit.uni-kl.de *buf_ptr = '\0'; 52612027Sjungma@eit.uni-kl.de 52712027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), &buf[0]); 52812027Sjungma@eit.uni-kl.de old_value = object; 52912027Sjungma@eit.uni-kl.de} 53012027Sjungma@eit.uni-kl.de 53112027Sjungma@eit.uni-kl.devoid wif_sc_signed_trace::set_width() 53212027Sjungma@eit.uni-kl.de{ 53312027Sjungma@eit.uni-kl.de bit_width = object.length(); 53412027Sjungma@eit.uni-kl.de} 53512027Sjungma@eit.uni-kl.de 53612027Sjungma@eit.uni-kl.de/*****************************************************************************/ 53712027Sjungma@eit.uni-kl.de 53812027Sjungma@eit.uni-kl.declass wif_sc_uint_base_trace: public wif_trace { 53912027Sjungma@eit.uni-kl.depublic: 54012027Sjungma@eit.uni-kl.de wif_sc_uint_base_trace(const sc_dt::sc_uint_base& object_, 54112027Sjungma@eit.uni-kl.de const std::string& name_, 54212027Sjungma@eit.uni-kl.de const std::string& wif_name_); 54312027Sjungma@eit.uni-kl.de void write(FILE* f); 54412027Sjungma@eit.uni-kl.de bool changed(); 54512027Sjungma@eit.uni-kl.de void set_width(); 54612027Sjungma@eit.uni-kl.de 54712027Sjungma@eit.uni-kl.deprotected: 54812027Sjungma@eit.uni-kl.de const sc_dt::sc_uint_base& object; 54912027Sjungma@eit.uni-kl.de sc_dt::sc_uint_base old_value; 55012027Sjungma@eit.uni-kl.de}; 55112027Sjungma@eit.uni-kl.de 55212027Sjungma@eit.uni-kl.de 55312027Sjungma@eit.uni-kl.dewif_sc_uint_base_trace::wif_sc_uint_base_trace( 55412027Sjungma@eit.uni-kl.de const sc_dt::sc_uint_base& object_, 55512027Sjungma@eit.uni-kl.de const std::string& name_, 55612027Sjungma@eit.uni-kl.de const std::string& wif_name_) 55712027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_.length()) 55812027Sjungma@eit.uni-kl.de{ 55912027Sjungma@eit.uni-kl.de old_value = object; 56012027Sjungma@eit.uni-kl.de wif_type = "BIT"; 56112027Sjungma@eit.uni-kl.de} 56212027Sjungma@eit.uni-kl.de 56312027Sjungma@eit.uni-kl.debool wif_sc_uint_base_trace::changed() 56412027Sjungma@eit.uni-kl.de{ 56512027Sjungma@eit.uni-kl.de return object != old_value; 56612027Sjungma@eit.uni-kl.de} 56712027Sjungma@eit.uni-kl.de 56812027Sjungma@eit.uni-kl.devoid wif_sc_uint_base_trace::write(FILE* f) 56912027Sjungma@eit.uni-kl.de{ 57012027Sjungma@eit.uni-kl.de char buf[1000], *buf_ptr = buf; 57112027Sjungma@eit.uni-kl.de 57212027Sjungma@eit.uni-kl.de int bitindex; 57312027Sjungma@eit.uni-kl.de for(bitindex = object.length() - 1; bitindex >= 0; --bitindex) { 57412027Sjungma@eit.uni-kl.de *buf_ptr++ = "01"[object[bitindex].to_bool()]; 57512027Sjungma@eit.uni-kl.de } 57612027Sjungma@eit.uni-kl.de *buf_ptr = '\0'; 57712027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 57812027Sjungma@eit.uni-kl.de old_value = object; 57912027Sjungma@eit.uni-kl.de} 58012027Sjungma@eit.uni-kl.de 58112027Sjungma@eit.uni-kl.devoid wif_sc_uint_base_trace::set_width() 58212027Sjungma@eit.uni-kl.de{ 58312027Sjungma@eit.uni-kl.de bit_width = object.length(); 58412027Sjungma@eit.uni-kl.de} 58512027Sjungma@eit.uni-kl.de 58612027Sjungma@eit.uni-kl.de 58712027Sjungma@eit.uni-kl.de/*****************************************************************************/ 58812027Sjungma@eit.uni-kl.de 58912027Sjungma@eit.uni-kl.declass wif_sc_int_base_trace: public wif_trace { 59012027Sjungma@eit.uni-kl.depublic: 59112027Sjungma@eit.uni-kl.de wif_sc_int_base_trace(const sc_dt::sc_int_base& object_, 59212027Sjungma@eit.uni-kl.de const std::string& name_, 59312027Sjungma@eit.uni-kl.de const std::string& wif_name_); 59412027Sjungma@eit.uni-kl.de void write(FILE* f); 59512027Sjungma@eit.uni-kl.de bool changed(); 59612027Sjungma@eit.uni-kl.de void set_width(); 59712027Sjungma@eit.uni-kl.de 59812027Sjungma@eit.uni-kl.deprotected: 59912027Sjungma@eit.uni-kl.de const sc_dt::sc_int_base& object; 60012027Sjungma@eit.uni-kl.de sc_dt::sc_int_base old_value; 60112027Sjungma@eit.uni-kl.de}; 60212027Sjungma@eit.uni-kl.de 60312027Sjungma@eit.uni-kl.de 60412027Sjungma@eit.uni-kl.dewif_sc_int_base_trace::wif_sc_int_base_trace(const sc_dt::sc_int_base& object_, 60512027Sjungma@eit.uni-kl.de const std::string& name_, 60612027Sjungma@eit.uni-kl.de const std::string& wif_name_) 60712027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_.length()) 60812027Sjungma@eit.uni-kl.de{ 60912027Sjungma@eit.uni-kl.de old_value = object; 61012027Sjungma@eit.uni-kl.de wif_type = "BIT"; 61112027Sjungma@eit.uni-kl.de} 61212027Sjungma@eit.uni-kl.de 61312027Sjungma@eit.uni-kl.debool wif_sc_int_base_trace::changed() 61412027Sjungma@eit.uni-kl.de{ 61512027Sjungma@eit.uni-kl.de return object != old_value; 61612027Sjungma@eit.uni-kl.de} 61712027Sjungma@eit.uni-kl.de 61812027Sjungma@eit.uni-kl.devoid wif_sc_int_base_trace::write(FILE* f) 61912027Sjungma@eit.uni-kl.de{ 62012027Sjungma@eit.uni-kl.de char buf[1000], *buf_ptr = buf; 62112027Sjungma@eit.uni-kl.de 62212027Sjungma@eit.uni-kl.de int bitindex; 62312027Sjungma@eit.uni-kl.de for(bitindex = object.length() - 1; bitindex >= 0; --bitindex) { 62412027Sjungma@eit.uni-kl.de *buf_ptr++ = "01"[object[bitindex].to_bool()]; 62512027Sjungma@eit.uni-kl.de } 62612027Sjungma@eit.uni-kl.de *buf_ptr = '\0'; 62712027Sjungma@eit.uni-kl.de 62812027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 62912027Sjungma@eit.uni-kl.de old_value = object; 63012027Sjungma@eit.uni-kl.de} 63112027Sjungma@eit.uni-kl.de 63212027Sjungma@eit.uni-kl.devoid wif_sc_int_base_trace::set_width() 63312027Sjungma@eit.uni-kl.de{ 63412027Sjungma@eit.uni-kl.de bit_width = object.length(); 63512027Sjungma@eit.uni-kl.de} 63612027Sjungma@eit.uni-kl.de 63712027Sjungma@eit.uni-kl.de 63812027Sjungma@eit.uni-kl.de/*****************************************************************************/ 63912027Sjungma@eit.uni-kl.de 64012027Sjungma@eit.uni-kl.declass wif_sc_fxval_trace: public wif_trace 64112027Sjungma@eit.uni-kl.de{ 64212027Sjungma@eit.uni-kl.depublic: 64312027Sjungma@eit.uni-kl.de 64412027Sjungma@eit.uni-kl.de wif_sc_fxval_trace( const sc_dt::sc_fxval& object_, 64512027Sjungma@eit.uni-kl.de const std::string& name_, 64612027Sjungma@eit.uni-kl.de const std::string& wif_name_ ); 64712027Sjungma@eit.uni-kl.de void write( FILE* f ); 64812027Sjungma@eit.uni-kl.de bool changed(); 64912027Sjungma@eit.uni-kl.de 65012027Sjungma@eit.uni-kl.deprotected: 65112027Sjungma@eit.uni-kl.de 65212027Sjungma@eit.uni-kl.de const sc_dt::sc_fxval& object; 65312027Sjungma@eit.uni-kl.de sc_dt::sc_fxval old_value; 65412027Sjungma@eit.uni-kl.de 65512027Sjungma@eit.uni-kl.de}; 65612027Sjungma@eit.uni-kl.de 65712027Sjungma@eit.uni-kl.dewif_sc_fxval_trace::wif_sc_fxval_trace( const sc_dt::sc_fxval& object_, 65812027Sjungma@eit.uni-kl.de const std::string& name_, 65912027Sjungma@eit.uni-kl.de const std::string& wif_name_ ) 66012027Sjungma@eit.uni-kl.de: wif_trace( name_, wif_name_ ), object( object_ ), old_value( object_ ) 66112027Sjungma@eit.uni-kl.de{ 66212027Sjungma@eit.uni-kl.de bit_width = 0; 66312027Sjungma@eit.uni-kl.de wif_type = "real"; 66412027Sjungma@eit.uni-kl.de} 66512027Sjungma@eit.uni-kl.de 66612027Sjungma@eit.uni-kl.debool 66712027Sjungma@eit.uni-kl.dewif_sc_fxval_trace::changed() 66812027Sjungma@eit.uni-kl.de{ 66912027Sjungma@eit.uni-kl.de return object != old_value; 67012027Sjungma@eit.uni-kl.de} 67112027Sjungma@eit.uni-kl.de 67212027Sjungma@eit.uni-kl.devoid 67312027Sjungma@eit.uni-kl.dewif_sc_fxval_trace::write( FILE* f ) 67412027Sjungma@eit.uni-kl.de{ 67512027Sjungma@eit.uni-kl.de std::fprintf( f, "assign %s %f ; \n", wif_name.c_str(), object.to_double() ); 67612027Sjungma@eit.uni-kl.de old_value = object; 67712027Sjungma@eit.uni-kl.de} 67812027Sjungma@eit.uni-kl.de 67912027Sjungma@eit.uni-kl.de/*****************************************************************************/ 68012027Sjungma@eit.uni-kl.de 68112027Sjungma@eit.uni-kl.declass wif_sc_fxval_fast_trace: public wif_trace 68212027Sjungma@eit.uni-kl.de{ 68312027Sjungma@eit.uni-kl.depublic: 68412027Sjungma@eit.uni-kl.de 68512027Sjungma@eit.uni-kl.de wif_sc_fxval_fast_trace( const sc_dt::sc_fxval_fast& object_, 68612027Sjungma@eit.uni-kl.de const std::string& name_, 68712027Sjungma@eit.uni-kl.de const std::string& wif_name_ ); 68812027Sjungma@eit.uni-kl.de void write( FILE* f ); 68912027Sjungma@eit.uni-kl.de bool changed(); 69012027Sjungma@eit.uni-kl.de 69112027Sjungma@eit.uni-kl.deprotected: 69212027Sjungma@eit.uni-kl.de 69312027Sjungma@eit.uni-kl.de const sc_dt::sc_fxval_fast& object; 69412027Sjungma@eit.uni-kl.de sc_dt::sc_fxval_fast old_value; 69512027Sjungma@eit.uni-kl.de 69612027Sjungma@eit.uni-kl.de}; 69712027Sjungma@eit.uni-kl.de 69812027Sjungma@eit.uni-kl.dewif_sc_fxval_fast_trace::wif_sc_fxval_fast_trace( 69912027Sjungma@eit.uni-kl.de const sc_dt::sc_fxval_fast& object_, 70012027Sjungma@eit.uni-kl.de const std::string& name_, 70112027Sjungma@eit.uni-kl.de const std::string& wif_name_ ) 70212027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object( object_ ), old_value( object_ ) 70312027Sjungma@eit.uni-kl.de{ 70412027Sjungma@eit.uni-kl.de bit_width = 0; 70512027Sjungma@eit.uni-kl.de wif_type = "real"; 70612027Sjungma@eit.uni-kl.de} 70712027Sjungma@eit.uni-kl.de 70812027Sjungma@eit.uni-kl.debool 70912027Sjungma@eit.uni-kl.dewif_sc_fxval_fast_trace::changed() 71012027Sjungma@eit.uni-kl.de{ 71112027Sjungma@eit.uni-kl.de return object != old_value; 71212027Sjungma@eit.uni-kl.de} 71312027Sjungma@eit.uni-kl.de 71412027Sjungma@eit.uni-kl.devoid 71512027Sjungma@eit.uni-kl.dewif_sc_fxval_fast_trace::write( FILE* f ) 71612027Sjungma@eit.uni-kl.de{ 71712027Sjungma@eit.uni-kl.de std::fprintf( f, "assign %s %f ; \n", wif_name.c_str(), object.to_double() ); 71812027Sjungma@eit.uni-kl.de old_value = object; 71912027Sjungma@eit.uni-kl.de} 72012027Sjungma@eit.uni-kl.de 72112027Sjungma@eit.uni-kl.de/*****************************************************************************/ 72212027Sjungma@eit.uni-kl.de 72312027Sjungma@eit.uni-kl.declass wif_sc_fxnum_trace: public wif_trace 72412027Sjungma@eit.uni-kl.de{ 72512027Sjungma@eit.uni-kl.depublic: 72612027Sjungma@eit.uni-kl.de 72712027Sjungma@eit.uni-kl.de wif_sc_fxnum_trace( const sc_dt::sc_fxnum& object_, 72812027Sjungma@eit.uni-kl.de const std::string& name_, 72912027Sjungma@eit.uni-kl.de const std::string& wif_name_ ); 73012027Sjungma@eit.uni-kl.de void write( FILE* f ); 73112027Sjungma@eit.uni-kl.de bool changed(); 73212027Sjungma@eit.uni-kl.de void set_width(); 73312027Sjungma@eit.uni-kl.de 73412027Sjungma@eit.uni-kl.deprotected: 73512027Sjungma@eit.uni-kl.de 73612027Sjungma@eit.uni-kl.de const sc_dt::sc_fxnum& object; 73712027Sjungma@eit.uni-kl.de sc_dt::sc_fxnum old_value; 73812027Sjungma@eit.uni-kl.de 73912027Sjungma@eit.uni-kl.de}; 74012027Sjungma@eit.uni-kl.de 74112027Sjungma@eit.uni-kl.dewif_sc_fxnum_trace::wif_sc_fxnum_trace( const sc_dt::sc_fxnum& object_, 74212027Sjungma@eit.uni-kl.de const std::string& name_, 74312027Sjungma@eit.uni-kl.de const std::string& wif_name_ ) 74412027Sjungma@eit.uni-kl.de: wif_trace( name_, wif_name_ ), 74512027Sjungma@eit.uni-kl.de object( object_ ), 74612027Sjungma@eit.uni-kl.de old_value( object_.m_params.type_params(), 74712027Sjungma@eit.uni-kl.de object_.m_params.enc(), 74812027Sjungma@eit.uni-kl.de object_.m_params.cast_switch(), 74912027Sjungma@eit.uni-kl.de 0 ) 75012027Sjungma@eit.uni-kl.de{ 75112027Sjungma@eit.uni-kl.de old_value = object; 75212027Sjungma@eit.uni-kl.de wif_type = "BIT"; 75312027Sjungma@eit.uni-kl.de} 75412027Sjungma@eit.uni-kl.de 75512027Sjungma@eit.uni-kl.debool 75612027Sjungma@eit.uni-kl.dewif_sc_fxnum_trace::changed() 75712027Sjungma@eit.uni-kl.de{ 75812027Sjungma@eit.uni-kl.de return object != old_value; 75912027Sjungma@eit.uni-kl.de} 76012027Sjungma@eit.uni-kl.de 76112027Sjungma@eit.uni-kl.devoid 76212027Sjungma@eit.uni-kl.dewif_sc_fxnum_trace::write( FILE* f ) 76312027Sjungma@eit.uni-kl.de{ 76412027Sjungma@eit.uni-kl.de static std::vector<char> buf(1024); 76512027Sjungma@eit.uni-kl.de typedef std::vector<char>::size_type size_t; 76612027Sjungma@eit.uni-kl.de 76712027Sjungma@eit.uni-kl.de if ( buf.size() < (size_t)object.wl() ) { 76812027Sjungma@eit.uni-kl.de size_t sz = ( (size_t)object.wl() + 4096 ) & (~(size_t)(4096-1)); 76912027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( buf ); // resize without copying values 77012027Sjungma@eit.uni-kl.de } 77112027Sjungma@eit.uni-kl.de char *buf_ptr = &buf[0]; 77212027Sjungma@eit.uni-kl.de 77312027Sjungma@eit.uni-kl.de for(int bitindex = object.wl() - 1; bitindex >= 0; --bitindex) 77412027Sjungma@eit.uni-kl.de { 77512027Sjungma@eit.uni-kl.de *buf_ptr ++ = "01"[object[bitindex]]; 77612027Sjungma@eit.uni-kl.de } 77712027Sjungma@eit.uni-kl.de *buf_ptr = '\0'; 77812027Sjungma@eit.uni-kl.de 77912027Sjungma@eit.uni-kl.de std::fprintf( f, "assign %s \"%s\" ;\n", wif_name.c_str(), &buf[0]); 78012027Sjungma@eit.uni-kl.de old_value = object; 78112027Sjungma@eit.uni-kl.de} 78212027Sjungma@eit.uni-kl.de 78312027Sjungma@eit.uni-kl.devoid 78412027Sjungma@eit.uni-kl.dewif_sc_fxnum_trace::set_width() 78512027Sjungma@eit.uni-kl.de{ 78612027Sjungma@eit.uni-kl.de bit_width = object.wl(); 78712027Sjungma@eit.uni-kl.de} 78812027Sjungma@eit.uni-kl.de 78912027Sjungma@eit.uni-kl.de/*****************************************************************************/ 79012027Sjungma@eit.uni-kl.de 79112027Sjungma@eit.uni-kl.declass wif_sc_fxnum_fast_trace: public wif_trace 79212027Sjungma@eit.uni-kl.de{ 79312027Sjungma@eit.uni-kl.depublic: 79412027Sjungma@eit.uni-kl.de 79512027Sjungma@eit.uni-kl.de wif_sc_fxnum_fast_trace( const sc_dt::sc_fxnum_fast& object_, 79612027Sjungma@eit.uni-kl.de const std::string& name_, 79712027Sjungma@eit.uni-kl.de const std::string& wif_name_ ); 79812027Sjungma@eit.uni-kl.de void write( FILE* f ); 79912027Sjungma@eit.uni-kl.de bool changed(); 80012027Sjungma@eit.uni-kl.de void set_width(); 80112027Sjungma@eit.uni-kl.de 80212027Sjungma@eit.uni-kl.deprotected: 80312027Sjungma@eit.uni-kl.de 80412027Sjungma@eit.uni-kl.de const sc_dt::sc_fxnum_fast& object; 80512027Sjungma@eit.uni-kl.de sc_dt::sc_fxnum_fast old_value; 80612027Sjungma@eit.uni-kl.de 80712027Sjungma@eit.uni-kl.de}; 80812027Sjungma@eit.uni-kl.de 80912027Sjungma@eit.uni-kl.dewif_sc_fxnum_fast_trace::wif_sc_fxnum_fast_trace( 81012027Sjungma@eit.uni-kl.de const sc_dt::sc_fxnum_fast& object_, 81112027Sjungma@eit.uni-kl.de const std::string& name_, 81212027Sjungma@eit.uni-kl.de const std::string& wif_name_ ) 81312027Sjungma@eit.uni-kl.de: wif_trace( name_, wif_name_ ), 81412027Sjungma@eit.uni-kl.de object( object_ ), 81512027Sjungma@eit.uni-kl.de old_value( object_.m_params.type_params(), 81612027Sjungma@eit.uni-kl.de object_.m_params.enc(), 81712027Sjungma@eit.uni-kl.de object_.m_params.cast_switch(), 81812027Sjungma@eit.uni-kl.de 0 ) 81912027Sjungma@eit.uni-kl.de{ 82012027Sjungma@eit.uni-kl.de old_value = object; 82112027Sjungma@eit.uni-kl.de wif_type = "BIT"; 82212027Sjungma@eit.uni-kl.de} 82312027Sjungma@eit.uni-kl.de 82412027Sjungma@eit.uni-kl.debool 82512027Sjungma@eit.uni-kl.dewif_sc_fxnum_fast_trace::changed() 82612027Sjungma@eit.uni-kl.de{ 82712027Sjungma@eit.uni-kl.de return object != old_value; 82812027Sjungma@eit.uni-kl.de} 82912027Sjungma@eit.uni-kl.de 83012027Sjungma@eit.uni-kl.devoid 83112027Sjungma@eit.uni-kl.dewif_sc_fxnum_fast_trace::write( FILE* f ) 83212027Sjungma@eit.uni-kl.de{ 83312027Sjungma@eit.uni-kl.de static std::vector<char> buf(1024); 83412027Sjungma@eit.uni-kl.de typedef std::vector<char>::size_type size_t; 83512027Sjungma@eit.uni-kl.de 83612027Sjungma@eit.uni-kl.de if ( buf.size() < (size_t)object.wl() ) { 83712027Sjungma@eit.uni-kl.de size_t sz = ( (size_t)object.wl() + 4096 ) & (~(size_t)(4096-1)); 83812027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( buf ); // resize without copying values 83912027Sjungma@eit.uni-kl.de } 84012027Sjungma@eit.uni-kl.de char *buf_ptr = &buf[0]; 84112027Sjungma@eit.uni-kl.de 84212027Sjungma@eit.uni-kl.de for(int bitindex = object.wl() - 1; bitindex >= 0; --bitindex) 84312027Sjungma@eit.uni-kl.de { 84412027Sjungma@eit.uni-kl.de *buf_ptr ++ = "01"[object[bitindex]]; 84512027Sjungma@eit.uni-kl.de } 84612027Sjungma@eit.uni-kl.de *buf_ptr = '\0'; 84712027Sjungma@eit.uni-kl.de 84812027Sjungma@eit.uni-kl.de std::fprintf( f, "assign %s \"%s\" ;\n", wif_name.c_str(), &buf[0]); 84912027Sjungma@eit.uni-kl.de old_value = object; 85012027Sjungma@eit.uni-kl.de} 85112027Sjungma@eit.uni-kl.de 85212027Sjungma@eit.uni-kl.devoid 85312027Sjungma@eit.uni-kl.dewif_sc_fxnum_fast_trace::set_width() 85412027Sjungma@eit.uni-kl.de{ 85512027Sjungma@eit.uni-kl.de bit_width = object.wl(); 85612027Sjungma@eit.uni-kl.de} 85712027Sjungma@eit.uni-kl.de 85812027Sjungma@eit.uni-kl.de 85912027Sjungma@eit.uni-kl.de/*****************************************************************************/ 86012027Sjungma@eit.uni-kl.de 86112027Sjungma@eit.uni-kl.declass wif_unsigned_int_trace: public wif_trace { 86212027Sjungma@eit.uni-kl.depublic: 86312027Sjungma@eit.uni-kl.de wif_unsigned_int_trace(const unsigned& object_, 86412027Sjungma@eit.uni-kl.de const std::string& name_, 86512027Sjungma@eit.uni-kl.de const std::string& wif_name_, int width_); 86612027Sjungma@eit.uni-kl.de void write(FILE* f); 86712027Sjungma@eit.uni-kl.de bool changed(); 86812027Sjungma@eit.uni-kl.de 86912027Sjungma@eit.uni-kl.deprotected: 87012027Sjungma@eit.uni-kl.de const unsigned& object; 87112027Sjungma@eit.uni-kl.de unsigned old_value; 87212027Sjungma@eit.uni-kl.de unsigned mask; 87312027Sjungma@eit.uni-kl.de}; 87412027Sjungma@eit.uni-kl.de 87512027Sjungma@eit.uni-kl.de 87612027Sjungma@eit.uni-kl.dewif_unsigned_int_trace::wif_unsigned_int_trace(const unsigned& object_, 87712027Sjungma@eit.uni-kl.de const std::string& name_, 87812027Sjungma@eit.uni-kl.de const std::string& wif_name_, 87912027Sjungma@eit.uni-kl.de int width_) 88012027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), 88112027Sjungma@eit.uni-kl.de mask(0xffffffff) 88212027Sjungma@eit.uni-kl.de{ 88312027Sjungma@eit.uni-kl.de bit_width = width_; 88412027Sjungma@eit.uni-kl.de if (bit_width < 32) { 88512027Sjungma@eit.uni-kl.de mask = ~(-1 << bit_width); 88612027Sjungma@eit.uni-kl.de } 88712027Sjungma@eit.uni-kl.de 88812027Sjungma@eit.uni-kl.de wif_type = "BIT"; 88912027Sjungma@eit.uni-kl.de} 89012027Sjungma@eit.uni-kl.de 89112027Sjungma@eit.uni-kl.de 89212027Sjungma@eit.uni-kl.debool wif_unsigned_int_trace::changed() 89312027Sjungma@eit.uni-kl.de{ 89412027Sjungma@eit.uni-kl.de return object != old_value; 89512027Sjungma@eit.uni-kl.de} 89612027Sjungma@eit.uni-kl.de 89712027Sjungma@eit.uni-kl.de 89812027Sjungma@eit.uni-kl.devoid wif_unsigned_int_trace::write(FILE* f) 89912027Sjungma@eit.uni-kl.de{ 90012027Sjungma@eit.uni-kl.de char buf[1000]; 90112027Sjungma@eit.uni-kl.de int bitindex; 90212027Sjungma@eit.uni-kl.de 90312027Sjungma@eit.uni-kl.de // Check for overflow 90412027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 90512027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 90612027Sjungma@eit.uni-kl.de buf[bitindex] = '0'; 90712027Sjungma@eit.uni-kl.de } 90812027Sjungma@eit.uni-kl.de } 90912027Sjungma@eit.uni-kl.de else{ 91012027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 91112027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 91212027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 91312027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 91412027Sjungma@eit.uni-kl.de } 91512027Sjungma@eit.uni-kl.de } 91612027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 91712027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 91812027Sjungma@eit.uni-kl.de old_value = object; 91912027Sjungma@eit.uni-kl.de} 92012027Sjungma@eit.uni-kl.de 92112027Sjungma@eit.uni-kl.de 92212027Sjungma@eit.uni-kl.de/*****************************************************************************/ 92312027Sjungma@eit.uni-kl.de 92412027Sjungma@eit.uni-kl.declass wif_unsigned_short_trace: public wif_trace { 92512027Sjungma@eit.uni-kl.depublic: 92612027Sjungma@eit.uni-kl.de wif_unsigned_short_trace(const unsigned short& object_, 92712027Sjungma@eit.uni-kl.de const std::string& name_, 92812027Sjungma@eit.uni-kl.de const std::string& wif_name_, 92912027Sjungma@eit.uni-kl.de int width_); 93012027Sjungma@eit.uni-kl.de void write(FILE* f); 93112027Sjungma@eit.uni-kl.de bool changed(); 93212027Sjungma@eit.uni-kl.de 93312027Sjungma@eit.uni-kl.deprotected: 93412027Sjungma@eit.uni-kl.de const unsigned short& object; 93512027Sjungma@eit.uni-kl.de unsigned short old_value; 93612027Sjungma@eit.uni-kl.de unsigned short mask; 93712027Sjungma@eit.uni-kl.de}; 93812027Sjungma@eit.uni-kl.de 93912027Sjungma@eit.uni-kl.de 94012027Sjungma@eit.uni-kl.dewif_unsigned_short_trace::wif_unsigned_short_trace( 94112027Sjungma@eit.uni-kl.de const unsigned short& object_, 94212027Sjungma@eit.uni-kl.de const std::string& name_, 94312027Sjungma@eit.uni-kl.de const std::string& wif_name_, 94412027Sjungma@eit.uni-kl.de int width_) 94512027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), mask(0xffff) 94612027Sjungma@eit.uni-kl.de{ 94712027Sjungma@eit.uni-kl.de bit_width = width_; 94812027Sjungma@eit.uni-kl.de if (bit_width < 16) { 94912027Sjungma@eit.uni-kl.de mask = (unsigned short)~(-1 << bit_width); 95012027Sjungma@eit.uni-kl.de } 95112027Sjungma@eit.uni-kl.de 95212027Sjungma@eit.uni-kl.de wif_type = "BIT"; 95312027Sjungma@eit.uni-kl.de} 95412027Sjungma@eit.uni-kl.de 95512027Sjungma@eit.uni-kl.de 95612027Sjungma@eit.uni-kl.debool wif_unsigned_short_trace::changed() 95712027Sjungma@eit.uni-kl.de{ 95812027Sjungma@eit.uni-kl.de return object != old_value; 95912027Sjungma@eit.uni-kl.de} 96012027Sjungma@eit.uni-kl.de 96112027Sjungma@eit.uni-kl.de 96212027Sjungma@eit.uni-kl.devoid wif_unsigned_short_trace::write(FILE* f) 96312027Sjungma@eit.uni-kl.de{ 96412027Sjungma@eit.uni-kl.de char buf[1000]; 96512027Sjungma@eit.uni-kl.de int bitindex; 96612027Sjungma@eit.uni-kl.de 96712027Sjungma@eit.uni-kl.de // Check for overflow 96812027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 96912027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 97012027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 97112027Sjungma@eit.uni-kl.de } 97212027Sjungma@eit.uni-kl.de } 97312027Sjungma@eit.uni-kl.de else{ 97412027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 97512027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 97612027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 97712027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 97812027Sjungma@eit.uni-kl.de } 97912027Sjungma@eit.uni-kl.de } 98012027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 98112027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 98212027Sjungma@eit.uni-kl.de old_value = object; 98312027Sjungma@eit.uni-kl.de} 98412027Sjungma@eit.uni-kl.de 98512027Sjungma@eit.uni-kl.de/*****************************************************************************/ 98612027Sjungma@eit.uni-kl.de 98712027Sjungma@eit.uni-kl.declass wif_unsigned_char_trace: public wif_trace { 98812027Sjungma@eit.uni-kl.depublic: 98912027Sjungma@eit.uni-kl.de wif_unsigned_char_trace(const unsigned char& object_, 99012027Sjungma@eit.uni-kl.de const std::string& name_, 99112027Sjungma@eit.uni-kl.de const std::string& wif_name_, 99212027Sjungma@eit.uni-kl.de int width_); 99312027Sjungma@eit.uni-kl.de void write(FILE* f); 99412027Sjungma@eit.uni-kl.de bool changed(); 99512027Sjungma@eit.uni-kl.de 99612027Sjungma@eit.uni-kl.deprotected: 99712027Sjungma@eit.uni-kl.de const unsigned char& object; 99812027Sjungma@eit.uni-kl.de unsigned char old_value; 99912027Sjungma@eit.uni-kl.de unsigned char mask; 100012027Sjungma@eit.uni-kl.de}; 100112027Sjungma@eit.uni-kl.de 100212027Sjungma@eit.uni-kl.de 100312027Sjungma@eit.uni-kl.dewif_unsigned_char_trace::wif_unsigned_char_trace(const unsigned char& object_, 100412027Sjungma@eit.uni-kl.de const std::string& name_, 100512027Sjungma@eit.uni-kl.de const std::string& wif_name_, 100612027Sjungma@eit.uni-kl.de int width_) 100712027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), mask(0xff) 100812027Sjungma@eit.uni-kl.de{ 100912027Sjungma@eit.uni-kl.de bit_width = width_; 101012027Sjungma@eit.uni-kl.de if (bit_width < 8) { 101112027Sjungma@eit.uni-kl.de mask = (unsigned char)~(-1 << bit_width); 101212027Sjungma@eit.uni-kl.de } 101312027Sjungma@eit.uni-kl.de 101412027Sjungma@eit.uni-kl.de wif_type = "BIT"; 101512027Sjungma@eit.uni-kl.de} 101612027Sjungma@eit.uni-kl.de 101712027Sjungma@eit.uni-kl.de 101812027Sjungma@eit.uni-kl.debool wif_unsigned_char_trace::changed() 101912027Sjungma@eit.uni-kl.de{ 102012027Sjungma@eit.uni-kl.de return object != old_value; 102112027Sjungma@eit.uni-kl.de} 102212027Sjungma@eit.uni-kl.de 102312027Sjungma@eit.uni-kl.de 102412027Sjungma@eit.uni-kl.devoid wif_unsigned_char_trace::write(FILE* f) 102512027Sjungma@eit.uni-kl.de{ 102612027Sjungma@eit.uni-kl.de char buf[1000]; 102712027Sjungma@eit.uni-kl.de int bitindex; 102812027Sjungma@eit.uni-kl.de 102912027Sjungma@eit.uni-kl.de // Check for overflow 103012027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 103112027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 103212027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 103312027Sjungma@eit.uni-kl.de } 103412027Sjungma@eit.uni-kl.de } 103512027Sjungma@eit.uni-kl.de else{ 103612027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 103712027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 103812027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 103912027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 104012027Sjungma@eit.uni-kl.de } 104112027Sjungma@eit.uni-kl.de } 104212027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 104312027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 104412027Sjungma@eit.uni-kl.de old_value = object; 104512027Sjungma@eit.uni-kl.de} 104612027Sjungma@eit.uni-kl.de 104712027Sjungma@eit.uni-kl.de/*****************************************************************************/ 104812027Sjungma@eit.uni-kl.de 104912027Sjungma@eit.uni-kl.declass wif_unsigned_long_trace: public wif_trace { 105012027Sjungma@eit.uni-kl.depublic: 105112027Sjungma@eit.uni-kl.de wif_unsigned_long_trace(const unsigned long& object_, 105212027Sjungma@eit.uni-kl.de const std::string& name_, 105312027Sjungma@eit.uni-kl.de const std::string& wif_name_, 105412027Sjungma@eit.uni-kl.de int width_); 105512027Sjungma@eit.uni-kl.de void write(FILE* f); 105612027Sjungma@eit.uni-kl.de bool changed(); 105712027Sjungma@eit.uni-kl.de 105812027Sjungma@eit.uni-kl.deprotected: 105912027Sjungma@eit.uni-kl.de const unsigned long& object; 106012027Sjungma@eit.uni-kl.de unsigned long old_value; 106112027Sjungma@eit.uni-kl.de unsigned long mask; 106212027Sjungma@eit.uni-kl.de}; 106312027Sjungma@eit.uni-kl.de 106412027Sjungma@eit.uni-kl.de 106512027Sjungma@eit.uni-kl.dewif_unsigned_long_trace::wif_unsigned_long_trace(const unsigned long& object_, 106612027Sjungma@eit.uni-kl.de const std::string& name_, 106712027Sjungma@eit.uni-kl.de const std::string& wif_name_, 106812027Sjungma@eit.uni-kl.de int width_) 106912027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), 107012027Sjungma@eit.uni-kl.de mask((unsigned long)-1L) 107112027Sjungma@eit.uni-kl.de{ 107212027Sjungma@eit.uni-kl.de bit_width = width_; 107312027Sjungma@eit.uni-kl.de if (bit_width < (int)(sizeof(unsigned long)*BITS_PER_BYTE)) { 107412027Sjungma@eit.uni-kl.de mask = ~(-1L << bit_width); 107512027Sjungma@eit.uni-kl.de } 107612027Sjungma@eit.uni-kl.de 107712027Sjungma@eit.uni-kl.de wif_type = "BIT"; 107812027Sjungma@eit.uni-kl.de} 107912027Sjungma@eit.uni-kl.de 108012027Sjungma@eit.uni-kl.de 108112027Sjungma@eit.uni-kl.debool wif_unsigned_long_trace::changed() 108212027Sjungma@eit.uni-kl.de{ 108312027Sjungma@eit.uni-kl.de return object != old_value; 108412027Sjungma@eit.uni-kl.de} 108512027Sjungma@eit.uni-kl.de 108612027Sjungma@eit.uni-kl.de 108712027Sjungma@eit.uni-kl.devoid wif_unsigned_long_trace::write(FILE* f) 108812027Sjungma@eit.uni-kl.de{ 108912027Sjungma@eit.uni-kl.de char buf[1000]; 109012027Sjungma@eit.uni-kl.de int bitindex; 109112027Sjungma@eit.uni-kl.de 109212027Sjungma@eit.uni-kl.de // Check for overflow 109312027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 109412027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 109512027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 109612027Sjungma@eit.uni-kl.de } 109712027Sjungma@eit.uni-kl.de } 109812027Sjungma@eit.uni-kl.de else{ 109912027Sjungma@eit.uni-kl.de unsigned long bit_mask = 1ul << (bit_width-1); 110012027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 110112027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 110212027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 110312027Sjungma@eit.uni-kl.de } 110412027Sjungma@eit.uni-kl.de } 110512027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 110612027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 110712027Sjungma@eit.uni-kl.de old_value = object; 110812027Sjungma@eit.uni-kl.de} 110912027Sjungma@eit.uni-kl.de 111012027Sjungma@eit.uni-kl.de/*****************************************************************************/ 111112027Sjungma@eit.uni-kl.de 111212027Sjungma@eit.uni-kl.declass wif_signed_int_trace: public wif_trace { 111312027Sjungma@eit.uni-kl.depublic: 111412027Sjungma@eit.uni-kl.de wif_signed_int_trace(const int& object_, 111512027Sjungma@eit.uni-kl.de const std::string& name_, 111612027Sjungma@eit.uni-kl.de const std::string& wif_name_, 111712027Sjungma@eit.uni-kl.de int width_); 111812027Sjungma@eit.uni-kl.de void write(FILE* f); 111912027Sjungma@eit.uni-kl.de bool changed(); 112012027Sjungma@eit.uni-kl.de 112112027Sjungma@eit.uni-kl.deprotected: 112212027Sjungma@eit.uni-kl.de const int& object; 112312027Sjungma@eit.uni-kl.de int old_value; 112412027Sjungma@eit.uni-kl.de unsigned mask; 112512027Sjungma@eit.uni-kl.de}; 112612027Sjungma@eit.uni-kl.de 112712027Sjungma@eit.uni-kl.de 112812027Sjungma@eit.uni-kl.dewif_signed_int_trace::wif_signed_int_trace(const signed& object_, 112912027Sjungma@eit.uni-kl.de const std::string& name_, 113012027Sjungma@eit.uni-kl.de const std::string& wif_name_, 113112027Sjungma@eit.uni-kl.de int width_) 113212027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), 113312027Sjungma@eit.uni-kl.de mask(0xffffffff) 113412027Sjungma@eit.uni-kl.de{ 113512027Sjungma@eit.uni-kl.de bit_width = width_; 113612027Sjungma@eit.uni-kl.de if (bit_width < 32) { 113712027Sjungma@eit.uni-kl.de mask = ~(-1 << bit_width); 113812027Sjungma@eit.uni-kl.de } 113912027Sjungma@eit.uni-kl.de 114012027Sjungma@eit.uni-kl.de wif_type = "BIT"; 114112027Sjungma@eit.uni-kl.de} 114212027Sjungma@eit.uni-kl.de 114312027Sjungma@eit.uni-kl.de 114412027Sjungma@eit.uni-kl.debool wif_signed_int_trace::changed() 114512027Sjungma@eit.uni-kl.de{ 114612027Sjungma@eit.uni-kl.de return object != old_value; 114712027Sjungma@eit.uni-kl.de} 114812027Sjungma@eit.uni-kl.de 114912027Sjungma@eit.uni-kl.de 115012027Sjungma@eit.uni-kl.devoid wif_signed_int_trace::write(FILE* f) 115112027Sjungma@eit.uni-kl.de{ 115212027Sjungma@eit.uni-kl.de char buf[1000]; 115312027Sjungma@eit.uni-kl.de int bitindex; 115412027Sjungma@eit.uni-kl.de 115512027Sjungma@eit.uni-kl.de // Check for overflow 115612027Sjungma@eit.uni-kl.de if (((unsigned) object & mask) != (unsigned) object) { 115712027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 115812027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 115912027Sjungma@eit.uni-kl.de } 116012027Sjungma@eit.uni-kl.de } 116112027Sjungma@eit.uni-kl.de else{ 116212027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 116312027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 116412027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 116512027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 116612027Sjungma@eit.uni-kl.de } 116712027Sjungma@eit.uni-kl.de } 116812027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 116912027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 117012027Sjungma@eit.uni-kl.de old_value = object; 117112027Sjungma@eit.uni-kl.de} 117212027Sjungma@eit.uni-kl.de 117312027Sjungma@eit.uni-kl.de/*****************************************************************************/ 117412027Sjungma@eit.uni-kl.de 117512027Sjungma@eit.uni-kl.declass wif_signed_short_trace: public wif_trace { 117612027Sjungma@eit.uni-kl.depublic: 117712027Sjungma@eit.uni-kl.de wif_signed_short_trace(const short& object_, 117812027Sjungma@eit.uni-kl.de const std::string& name_, 117912027Sjungma@eit.uni-kl.de const std::string& wif_name_, 118012027Sjungma@eit.uni-kl.de int width_); 118112027Sjungma@eit.uni-kl.de void write(FILE* f); 118212027Sjungma@eit.uni-kl.de bool changed(); 118312027Sjungma@eit.uni-kl.de 118412027Sjungma@eit.uni-kl.deprotected: 118512027Sjungma@eit.uni-kl.de const short& object; 118612027Sjungma@eit.uni-kl.de short old_value; 118712027Sjungma@eit.uni-kl.de unsigned short mask; 118812027Sjungma@eit.uni-kl.de}; 118912027Sjungma@eit.uni-kl.de 119012027Sjungma@eit.uni-kl.de 119112027Sjungma@eit.uni-kl.dewif_signed_short_trace::wif_signed_short_trace(const short& object_, 119212027Sjungma@eit.uni-kl.de const std::string& name_, 119312027Sjungma@eit.uni-kl.de const std::string& wif_name_, 119412027Sjungma@eit.uni-kl.de int width_) 119512027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), mask(0xffff) 119612027Sjungma@eit.uni-kl.de{ 119712027Sjungma@eit.uni-kl.de bit_width = width_; 119812027Sjungma@eit.uni-kl.de if (bit_width < 16) { 119912027Sjungma@eit.uni-kl.de mask = (unsigned short)~(-1 << bit_width); 120012027Sjungma@eit.uni-kl.de } 120112027Sjungma@eit.uni-kl.de 120212027Sjungma@eit.uni-kl.de wif_type = "BIT"; 120312027Sjungma@eit.uni-kl.de} 120412027Sjungma@eit.uni-kl.de 120512027Sjungma@eit.uni-kl.de 120612027Sjungma@eit.uni-kl.debool wif_signed_short_trace::changed() 120712027Sjungma@eit.uni-kl.de{ 120812027Sjungma@eit.uni-kl.de return object != old_value; 120912027Sjungma@eit.uni-kl.de} 121012027Sjungma@eit.uni-kl.de 121112027Sjungma@eit.uni-kl.de 121212027Sjungma@eit.uni-kl.devoid wif_signed_short_trace::write(FILE* f) 121312027Sjungma@eit.uni-kl.de{ 121412027Sjungma@eit.uni-kl.de char buf[1000]; 121512027Sjungma@eit.uni-kl.de int bitindex; 121612027Sjungma@eit.uni-kl.de 121712027Sjungma@eit.uni-kl.de // Check for overflow 121812027Sjungma@eit.uni-kl.de if (((unsigned short) object & mask) != (unsigned short) object) { 121912027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 122012027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 122112027Sjungma@eit.uni-kl.de } 122212027Sjungma@eit.uni-kl.de } 122312027Sjungma@eit.uni-kl.de else{ 122412027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 122512027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 122612027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 122712027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 122812027Sjungma@eit.uni-kl.de } 122912027Sjungma@eit.uni-kl.de } 123012027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 123112027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 123212027Sjungma@eit.uni-kl.de old_value = object; 123312027Sjungma@eit.uni-kl.de} 123412027Sjungma@eit.uni-kl.de 123512027Sjungma@eit.uni-kl.de/*****************************************************************************/ 123612027Sjungma@eit.uni-kl.de 123712027Sjungma@eit.uni-kl.declass wif_signed_char_trace: public wif_trace { 123812027Sjungma@eit.uni-kl.depublic: 123912027Sjungma@eit.uni-kl.de wif_signed_char_trace(const char& object_, 124012027Sjungma@eit.uni-kl.de const std::string& name_, 124112027Sjungma@eit.uni-kl.de const std::string& wif_name_, 124212027Sjungma@eit.uni-kl.de int width_); 124312027Sjungma@eit.uni-kl.de void write(FILE* f); 124412027Sjungma@eit.uni-kl.de bool changed(); 124512027Sjungma@eit.uni-kl.de 124612027Sjungma@eit.uni-kl.deprotected: 124712027Sjungma@eit.uni-kl.de const char& object; 124812027Sjungma@eit.uni-kl.de char old_value; 124912027Sjungma@eit.uni-kl.de unsigned char mask; 125012027Sjungma@eit.uni-kl.de}; 125112027Sjungma@eit.uni-kl.de 125212027Sjungma@eit.uni-kl.de 125312027Sjungma@eit.uni-kl.dewif_signed_char_trace::wif_signed_char_trace(const char& object_, 125412027Sjungma@eit.uni-kl.de const std::string& name_, 125512027Sjungma@eit.uni-kl.de const std::string& wif_name_, 125612027Sjungma@eit.uni-kl.de int width_) 125712027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), mask(0xff) 125812027Sjungma@eit.uni-kl.de{ 125912027Sjungma@eit.uni-kl.de bit_width = width_; 126012027Sjungma@eit.uni-kl.de if (bit_width < 8) { 126112027Sjungma@eit.uni-kl.de mask = (unsigned char)~(-1 << bit_width); 126212027Sjungma@eit.uni-kl.de } 126312027Sjungma@eit.uni-kl.de 126412027Sjungma@eit.uni-kl.de wif_type = "BIT"; 126512027Sjungma@eit.uni-kl.de} 126612027Sjungma@eit.uni-kl.de 126712027Sjungma@eit.uni-kl.de 126812027Sjungma@eit.uni-kl.debool wif_signed_char_trace::changed() 126912027Sjungma@eit.uni-kl.de{ 127012027Sjungma@eit.uni-kl.de return object != old_value; 127112027Sjungma@eit.uni-kl.de} 127212027Sjungma@eit.uni-kl.de 127312027Sjungma@eit.uni-kl.de 127412027Sjungma@eit.uni-kl.devoid wif_signed_char_trace::write(FILE* f) 127512027Sjungma@eit.uni-kl.de{ 127612027Sjungma@eit.uni-kl.de char buf[1000]; 127712027Sjungma@eit.uni-kl.de int bitindex; 127812027Sjungma@eit.uni-kl.de 127912027Sjungma@eit.uni-kl.de // Check for overflow 128012027Sjungma@eit.uni-kl.de if (((unsigned char) object & mask) != (unsigned char) object) { 128112027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 128212027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 128312027Sjungma@eit.uni-kl.de } 128412027Sjungma@eit.uni-kl.de } 128512027Sjungma@eit.uni-kl.de else{ 128612027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 128712027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 128812027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 128912027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 129012027Sjungma@eit.uni-kl.de } 129112027Sjungma@eit.uni-kl.de } 129212027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 129312027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 129412027Sjungma@eit.uni-kl.de old_value = object; 129512027Sjungma@eit.uni-kl.de} 129612027Sjungma@eit.uni-kl.de 129712027Sjungma@eit.uni-kl.de/*****************************************************************************/ 129812027Sjungma@eit.uni-kl.de 129912027Sjungma@eit.uni-kl.declass wif_signed_long_trace: public wif_trace { 130012027Sjungma@eit.uni-kl.depublic: 130112027Sjungma@eit.uni-kl.de wif_signed_long_trace(const long& object_, 130212027Sjungma@eit.uni-kl.de const std::string& name_, 130312027Sjungma@eit.uni-kl.de const std::string& wif_name_, 130412027Sjungma@eit.uni-kl.de int width_); 130512027Sjungma@eit.uni-kl.de void write(FILE* f); 130612027Sjungma@eit.uni-kl.de bool changed(); 130712027Sjungma@eit.uni-kl.de 130812027Sjungma@eit.uni-kl.deprotected: 130912027Sjungma@eit.uni-kl.de const long& object; 131012027Sjungma@eit.uni-kl.de long old_value; 131112027Sjungma@eit.uni-kl.de unsigned long mask; 131212027Sjungma@eit.uni-kl.de}; 131312027Sjungma@eit.uni-kl.de 131412027Sjungma@eit.uni-kl.de 131512027Sjungma@eit.uni-kl.dewif_signed_long_trace::wif_signed_long_trace(const long& object_, 131612027Sjungma@eit.uni-kl.de const std::string& name_, 131712027Sjungma@eit.uni-kl.de const std::string& wif_name_, 131812027Sjungma@eit.uni-kl.de int width_) 131912027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), 132012027Sjungma@eit.uni-kl.de mask((unsigned long)-1L) 132112027Sjungma@eit.uni-kl.de{ 132212027Sjungma@eit.uni-kl.de bit_width = width_; 132312027Sjungma@eit.uni-kl.de if (bit_width < (int)(sizeof(long)*BITS_PER_BYTE)) { 132412027Sjungma@eit.uni-kl.de mask = ~(-1L << bit_width); 132512027Sjungma@eit.uni-kl.de } 132612027Sjungma@eit.uni-kl.de 132712027Sjungma@eit.uni-kl.de wif_type = "BIT"; 132812027Sjungma@eit.uni-kl.de} 132912027Sjungma@eit.uni-kl.de 133012027Sjungma@eit.uni-kl.de 133112027Sjungma@eit.uni-kl.debool wif_signed_long_trace::changed() 133212027Sjungma@eit.uni-kl.de{ 133312027Sjungma@eit.uni-kl.de return object != old_value; 133412027Sjungma@eit.uni-kl.de} 133512027Sjungma@eit.uni-kl.de 133612027Sjungma@eit.uni-kl.de 133712027Sjungma@eit.uni-kl.devoid wif_signed_long_trace::write(FILE* f) 133812027Sjungma@eit.uni-kl.de{ 133912027Sjungma@eit.uni-kl.de char buf[1000]; 134012027Sjungma@eit.uni-kl.de int bitindex; 134112027Sjungma@eit.uni-kl.de 134212027Sjungma@eit.uni-kl.de // Check for overflow 134312027Sjungma@eit.uni-kl.de if (((unsigned long) object & mask) != (unsigned long) object) { 134412027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 134512027Sjungma@eit.uni-kl.de buf[bitindex]='0'; 134612027Sjungma@eit.uni-kl.de } 134712027Sjungma@eit.uni-kl.de } else { 134812027Sjungma@eit.uni-kl.de unsigned long bit_mask = 1ul << (bit_width-1); 134912027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 135012027Sjungma@eit.uni-kl.de buf[bitindex] = (object & bit_mask)? '1' : '0'; 135112027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 135212027Sjungma@eit.uni-kl.de } 135312027Sjungma@eit.uni-kl.de } 135412027Sjungma@eit.uni-kl.de buf[bitindex] = '\0'; 135512027Sjungma@eit.uni-kl.de std::fprintf(f, "assign %s \"%s\" ;\n", wif_name.c_str(), buf); 135612027Sjungma@eit.uni-kl.de old_value = object; 135712027Sjungma@eit.uni-kl.de} 135812027Sjungma@eit.uni-kl.de 135912027Sjungma@eit.uni-kl.de 136012027Sjungma@eit.uni-kl.de/*****************************************************************************/ 136112027Sjungma@eit.uni-kl.de 136212027Sjungma@eit.uni-kl.declass wif_float_trace: public wif_trace { 136312027Sjungma@eit.uni-kl.depublic: 136412027Sjungma@eit.uni-kl.de wif_float_trace(const float& object_, 136512027Sjungma@eit.uni-kl.de const std::string& name_, 136612027Sjungma@eit.uni-kl.de const std::string& wif_name_); 136712027Sjungma@eit.uni-kl.de void write(FILE* f); 136812027Sjungma@eit.uni-kl.de bool changed(); 136912027Sjungma@eit.uni-kl.de 137012027Sjungma@eit.uni-kl.deprotected: 137112027Sjungma@eit.uni-kl.de const float& object; 137212027Sjungma@eit.uni-kl.de float old_value; 137312027Sjungma@eit.uni-kl.de}; 137412027Sjungma@eit.uni-kl.de 137512027Sjungma@eit.uni-kl.dewif_float_trace::wif_float_trace(const float& object_, 137612027Sjungma@eit.uni-kl.de const std::string& name_, 137712027Sjungma@eit.uni-kl.de const std::string& wif_name_) 137812027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_) 137912027Sjungma@eit.uni-kl.de{ 138012027Sjungma@eit.uni-kl.de bit_width = 0; 138112027Sjungma@eit.uni-kl.de wif_type = "real"; 138212027Sjungma@eit.uni-kl.de} 138312027Sjungma@eit.uni-kl.de 138412027Sjungma@eit.uni-kl.debool wif_float_trace::changed() 138512027Sjungma@eit.uni-kl.de{ 138612027Sjungma@eit.uni-kl.de return object != old_value; 138712027Sjungma@eit.uni-kl.de} 138812027Sjungma@eit.uni-kl.de 138912027Sjungma@eit.uni-kl.devoid wif_float_trace::write(FILE* f) 139012027Sjungma@eit.uni-kl.de{ 139112027Sjungma@eit.uni-kl.de std::fprintf(f,"assign %s %f ; \n", wif_name.c_str(), object); 139212027Sjungma@eit.uni-kl.de old_value = object; 139312027Sjungma@eit.uni-kl.de} 139412027Sjungma@eit.uni-kl.de 139512027Sjungma@eit.uni-kl.de/*****************************************************************************/ 139612027Sjungma@eit.uni-kl.de 139712027Sjungma@eit.uni-kl.declass wif_double_trace: public wif_trace { 139812027Sjungma@eit.uni-kl.depublic: 139912027Sjungma@eit.uni-kl.de wif_double_trace(const double& object_, 140012027Sjungma@eit.uni-kl.de const std::string& name_, 140112027Sjungma@eit.uni-kl.de const std::string& wif_name_); 140212027Sjungma@eit.uni-kl.de void write(FILE* f); 140312027Sjungma@eit.uni-kl.de bool changed(); 140412027Sjungma@eit.uni-kl.de 140512027Sjungma@eit.uni-kl.deprotected: 140612027Sjungma@eit.uni-kl.de const double& object; 140712027Sjungma@eit.uni-kl.de double old_value; 140812027Sjungma@eit.uni-kl.de}; 140912027Sjungma@eit.uni-kl.de 141012027Sjungma@eit.uni-kl.dewif_double_trace::wif_double_trace(const double& object_, 141112027Sjungma@eit.uni-kl.de const std::string& name_, 141212027Sjungma@eit.uni-kl.de const std::string& wif_name_) 141312027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_) 141412027Sjungma@eit.uni-kl.de{ 141512027Sjungma@eit.uni-kl.de bit_width = 0; 141612027Sjungma@eit.uni-kl.de wif_type = "real"; 141712027Sjungma@eit.uni-kl.de} 141812027Sjungma@eit.uni-kl.de 141912027Sjungma@eit.uni-kl.debool wif_double_trace::changed() 142012027Sjungma@eit.uni-kl.de{ 142112027Sjungma@eit.uni-kl.de return object != old_value; 142212027Sjungma@eit.uni-kl.de} 142312027Sjungma@eit.uni-kl.de 142412027Sjungma@eit.uni-kl.devoid wif_double_trace::write(FILE* f) 142512027Sjungma@eit.uni-kl.de{ 142612027Sjungma@eit.uni-kl.de std::fprintf(f,"assign %s %f ; \n", wif_name.c_str(), object); 142712027Sjungma@eit.uni-kl.de old_value = object; 142812027Sjungma@eit.uni-kl.de} 142912027Sjungma@eit.uni-kl.de 143012027Sjungma@eit.uni-kl.de 143112027Sjungma@eit.uni-kl.de/*****************************************************************************/ 143212027Sjungma@eit.uni-kl.de 143312027Sjungma@eit.uni-kl.declass wif_enum_trace : public wif_trace { 143412027Sjungma@eit.uni-kl.depublic: 143512027Sjungma@eit.uni-kl.de wif_enum_trace(const unsigned& object_, 143612027Sjungma@eit.uni-kl.de const std::string& name_, 143712027Sjungma@eit.uni-kl.de const std::string& wif_name_, 143812027Sjungma@eit.uni-kl.de const char** enum_literals); 143912027Sjungma@eit.uni-kl.de void write(FILE* f); 144012027Sjungma@eit.uni-kl.de bool changed(); 144112027Sjungma@eit.uni-kl.de // Hides the definition of the same (virtual) function in wif_trace 144212027Sjungma@eit.uni-kl.de void print_variable_declaration_line(FILE* f); 144312027Sjungma@eit.uni-kl.de 144412027Sjungma@eit.uni-kl.deprotected: 144512027Sjungma@eit.uni-kl.de const unsigned& object; 144612027Sjungma@eit.uni-kl.de unsigned old_value; 144712027Sjungma@eit.uni-kl.de 144812027Sjungma@eit.uni-kl.de const char** literals; 144912027Sjungma@eit.uni-kl.de unsigned nliterals; 145012027Sjungma@eit.uni-kl.de std::string type_name; 145112027Sjungma@eit.uni-kl.de 145212027Sjungma@eit.uni-kl.de ~wif_enum_trace(); 145312027Sjungma@eit.uni-kl.de}; 145412027Sjungma@eit.uni-kl.de 145512027Sjungma@eit.uni-kl.de 145612027Sjungma@eit.uni-kl.dewif_enum_trace::wif_enum_trace(const unsigned& object_, 145712027Sjungma@eit.uni-kl.de const std::string& name_, 145812027Sjungma@eit.uni-kl.de const std::string& wif_name_, 145912027Sjungma@eit.uni-kl.de const char** enum_literals_) 146012027Sjungma@eit.uni-kl.de: wif_trace(name_, wif_name_), object(object_), old_value(object_), 146112027Sjungma@eit.uni-kl.de literals(enum_literals_), nliterals(0), type_name(name_ + "__type__") 146212027Sjungma@eit.uni-kl.de{ 146312027Sjungma@eit.uni-kl.de // find number of enumeration literals - counting loop 146412027Sjungma@eit.uni-kl.de for (nliterals = 0; enum_literals_[nliterals]; nliterals++) continue; 146512027Sjungma@eit.uni-kl.de 146612027Sjungma@eit.uni-kl.de bit_width = 0; 146712027Sjungma@eit.uni-kl.de wif_type = type_name.c_str(); 146812027Sjungma@eit.uni-kl.de} 146912027Sjungma@eit.uni-kl.de 147012027Sjungma@eit.uni-kl.devoid wif_enum_trace::print_variable_declaration_line(FILE* f) 147112027Sjungma@eit.uni-kl.de{ 147212027Sjungma@eit.uni-kl.de std::fprintf(f, "type scalar \"%s\" enum ", wif_type); 147312027Sjungma@eit.uni-kl.de 147412027Sjungma@eit.uni-kl.de for (unsigned i = 0; i < nliterals; i++) 147512027Sjungma@eit.uni-kl.de std::fprintf(f, "\"%s\", ", literals[i]); 147612027Sjungma@eit.uni-kl.de std::fprintf(f, "\"SC_WIF_UNDEF\" ;\n"); 147712027Sjungma@eit.uni-kl.de 147812027Sjungma@eit.uni-kl.de std::fprintf(f, "declare %s \"%s\" \"%s\" ", 147912027Sjungma@eit.uni-kl.de wif_name.c_str(), name.c_str(), wif_type); 148012027Sjungma@eit.uni-kl.de std::fprintf(f, "variable ;\n"); 148112027Sjungma@eit.uni-kl.de std::fprintf(f, "start_trace %s ;\n", wif_name.c_str()); 148212027Sjungma@eit.uni-kl.de} 148312027Sjungma@eit.uni-kl.de 148412027Sjungma@eit.uni-kl.debool wif_enum_trace::changed() 148512027Sjungma@eit.uni-kl.de{ 148612027Sjungma@eit.uni-kl.de return object != old_value; 148712027Sjungma@eit.uni-kl.de} 148812027Sjungma@eit.uni-kl.de 148912027Sjungma@eit.uni-kl.devoid wif_enum_trace::write(FILE* f) 149012027Sjungma@eit.uni-kl.de{ 149112027Sjungma@eit.uni-kl.de static bool warning_issued = false; 149212027Sjungma@eit.uni-kl.de const char* lit; 149312027Sjungma@eit.uni-kl.de 149412027Sjungma@eit.uni-kl.de if (object >= nliterals) { // Note unsigned value is always greater than 0 149512027Sjungma@eit.uni-kl.de if (!warning_issued) { 149612027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_TRACING_INVALID_ENUM_VALUE_ 149712027Sjungma@eit.uni-kl.de , name.c_str() ); 149812027Sjungma@eit.uni-kl.de warning_issued = true; 149912027Sjungma@eit.uni-kl.de } 150012027Sjungma@eit.uni-kl.de lit = "SC_WIF_UNDEF"; 150112027Sjungma@eit.uni-kl.de } 150212027Sjungma@eit.uni-kl.de else 150312027Sjungma@eit.uni-kl.de { 150412027Sjungma@eit.uni-kl.de lit = literals[object]; 150512027Sjungma@eit.uni-kl.de } 150612027Sjungma@eit.uni-kl.de std::fprintf( f, "assign %s \"%s\" ;\n", wif_name.c_str(), lit ); 150712027Sjungma@eit.uni-kl.de old_value = object; 150812027Sjungma@eit.uni-kl.de} 150912027Sjungma@eit.uni-kl.de 151012027Sjungma@eit.uni-kl.dewif_enum_trace::~wif_enum_trace() 151112027Sjungma@eit.uni-kl.de{ 151212027Sjungma@eit.uni-kl.de /* Intentionally blank */ 151312027Sjungma@eit.uni-kl.de} 151412027Sjungma@eit.uni-kl.de 151512027Sjungma@eit.uni-kl.de 151612027Sjungma@eit.uni-kl.detemplate <class T> 151712027Sjungma@eit.uni-kl.declass wif_T_trace 151812027Sjungma@eit.uni-kl.de: public wif_trace 151912027Sjungma@eit.uni-kl.de{ 152012027Sjungma@eit.uni-kl.depublic: 152112027Sjungma@eit.uni-kl.de 152212027Sjungma@eit.uni-kl.de wif_T_trace( const T& object_, 152312027Sjungma@eit.uni-kl.de const std::string& name_, 152412027Sjungma@eit.uni-kl.de const std::string& wif_name_, 152512027Sjungma@eit.uni-kl.de wif_trace_file::wif_enum type_ ) 152612027Sjungma@eit.uni-kl.de : wif_trace( name_, wif_name_), 152712027Sjungma@eit.uni-kl.de object( object_ ), 152812027Sjungma@eit.uni-kl.de old_value( object_ ) 152912027Sjungma@eit.uni-kl.de { wif_type = wif_names[type_]; } 153012027Sjungma@eit.uni-kl.de 153112027Sjungma@eit.uni-kl.de void write( FILE* f ) 153212027Sjungma@eit.uni-kl.de { 153312027Sjungma@eit.uni-kl.de std::fprintf( f, 153412027Sjungma@eit.uni-kl.de "assign %s \"%s\" ;\n", 153512027Sjungma@eit.uni-kl.de wif_name.c_str(), 153612027Sjungma@eit.uni-kl.de object.to_string().c_str() ); 153712027Sjungma@eit.uni-kl.de old_value = object; 153812027Sjungma@eit.uni-kl.de } 153912027Sjungma@eit.uni-kl.de 154012027Sjungma@eit.uni-kl.de bool changed() 154112027Sjungma@eit.uni-kl.de { return !(object == old_value); } 154212027Sjungma@eit.uni-kl.de 154312027Sjungma@eit.uni-kl.de void set_width() 154412027Sjungma@eit.uni-kl.de { bit_width = object.length(); } 154512027Sjungma@eit.uni-kl.de 154612027Sjungma@eit.uni-kl.deprotected: 154712027Sjungma@eit.uni-kl.de 154812027Sjungma@eit.uni-kl.de const T& object; 154912027Sjungma@eit.uni-kl.de T old_value; 155012027Sjungma@eit.uni-kl.de}; 155112027Sjungma@eit.uni-kl.de 155212027Sjungma@eit.uni-kl.detypedef wif_T_trace<sc_dt::sc_bv_base> wif_sc_bv_trace; 155312027Sjungma@eit.uni-kl.detypedef wif_T_trace<sc_dt::sc_lv_base> wif_sc_lv_trace; 155412027Sjungma@eit.uni-kl.de 155512027Sjungma@eit.uni-kl.de 155612027Sjungma@eit.uni-kl.de//*********************************************************************** 155712027Sjungma@eit.uni-kl.de// wif_trace_file functions 155812027Sjungma@eit.uni-kl.de//*********************************************************************** 155912027Sjungma@eit.uni-kl.de 156012027Sjungma@eit.uni-kl.de 156112027Sjungma@eit.uni-kl.dewif_trace_file::wif_trace_file(const char * name) 156212027Sjungma@eit.uni-kl.de : sc_trace_file_base( name, "awif" ) 156312027Sjungma@eit.uni-kl.de , wif_name_index(0) 156412027Sjungma@eit.uni-kl.de , previous_time_units_low(0) 156512027Sjungma@eit.uni-kl.de , previous_time_units_high(0) 156612027Sjungma@eit.uni-kl.de , previous_time(0.0) 156712027Sjungma@eit.uni-kl.de , traces() 156812027Sjungma@eit.uni-kl.de{} 156912027Sjungma@eit.uni-kl.de 157012027Sjungma@eit.uni-kl.de 157112027Sjungma@eit.uni-kl.devoid wif_trace_file::do_initialize() 157212027Sjungma@eit.uni-kl.de{ 157312027Sjungma@eit.uni-kl.de char buf[2000]; 157412027Sjungma@eit.uni-kl.de 157512027Sjungma@eit.uni-kl.de // init 157612027Sjungma@eit.uni-kl.de std::fprintf(fp, "init ;\n\n"); 157712027Sjungma@eit.uni-kl.de 157812027Sjungma@eit.uni-kl.de //timescale: 157912027Sjungma@eit.uni-kl.de if (timescale_unit == 1e-15) std::sprintf(buf,"0"); 158012027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-14) std::sprintf(buf,"1"); 158112027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-13) std::sprintf(buf,"2"); 158212027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-12) std::sprintf(buf,"3"); 158312027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-11) std::sprintf(buf,"4"); 158412027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-10) std::sprintf(buf,"5"); 158512027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-9) std::sprintf(buf,"6"); 158612027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-8) std::sprintf(buf,"7"); 158712027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-7) std::sprintf(buf,"8"); 158812027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-6) std::sprintf(buf,"9"); 158912027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-5) std::sprintf(buf,"10"); 159012027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-4) std::sprintf(buf,"11"); 159112027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-3) std::sprintf(buf,"12"); 159212027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-2) std::sprintf(buf,"13"); 159312027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e-1) std::sprintf(buf,"14"); 159412027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e0) std::sprintf(buf,"15"); 159512027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e1) std::sprintf(buf,"16"); 159612027Sjungma@eit.uni-kl.de else if(timescale_unit == 1e2) std::sprintf(buf,"17"); 159712027Sjungma@eit.uni-kl.de std::fprintf(fp,"header %s \"%s\" ;\n\n", buf, sc_version()); 159812027Sjungma@eit.uni-kl.de 159912027Sjungma@eit.uni-kl.de std::fprintf(fp, "comment \"ASCII WIF file produced on date: %s\" ;\n" 160012027Sjungma@eit.uni-kl.de , localtime_string().c_str()); 160112027Sjungma@eit.uni-kl.de 160212027Sjungma@eit.uni-kl.de //version: 160312027Sjungma@eit.uni-kl.de std::fprintf(fp, "comment \"Created by %s\" ;\n", sc_version()); 160412027Sjungma@eit.uni-kl.de //conversion info 160512027Sjungma@eit.uni-kl.de std::fprintf(fp, "comment \"Convert this file to binary WIF format using a2wif\" ;\n\n"); 160612027Sjungma@eit.uni-kl.de 160712027Sjungma@eit.uni-kl.de // Define the two types we need to represent bool and sc_logic 160812027Sjungma@eit.uni-kl.de std::fprintf(fp, "type scalar \"BIT\" enum '0', '1' ;\n"); 160912027Sjungma@eit.uni-kl.de std::fprintf(fp, "type scalar \"MVL\" enum '0', '1', 'X', 'Z', '?' ;\n"); 161012027Sjungma@eit.uni-kl.de std::fprintf(fp, "\n"); 161112027Sjungma@eit.uni-kl.de 161212027Sjungma@eit.uni-kl.de //variable definitions: 161312027Sjungma@eit.uni-kl.de int i; 161412027Sjungma@eit.uni-kl.de for (i = 0; i < (int)traces.size(); i++) { 161512027Sjungma@eit.uni-kl.de wif_trace* t = traces[i]; 161612027Sjungma@eit.uni-kl.de t->set_width(); //needed for all vectors 161712027Sjungma@eit.uni-kl.de t->print_variable_declaration_line(fp); 161812027Sjungma@eit.uni-kl.de } 161912027Sjungma@eit.uni-kl.de 162012027Sjungma@eit.uni-kl.de double inittime = sc_time_stamp().to_seconds(); 162112027Sjungma@eit.uni-kl.de previous_time = inittime/timescale_unit; 162212027Sjungma@eit.uni-kl.de 162312027Sjungma@eit.uni-kl.de // Dump all values at initial time 162412027Sjungma@eit.uni-kl.de std::sprintf(buf, 162512027Sjungma@eit.uni-kl.de "All initial values are dumped below at time " 162612027Sjungma@eit.uni-kl.de "%g sec = %g timescale units.", 162712027Sjungma@eit.uni-kl.de inittime, 162812027Sjungma@eit.uni-kl.de inittime/timescale_unit 162912027Sjungma@eit.uni-kl.de ); 163012027Sjungma@eit.uni-kl.de write_comment(buf); 163112027Sjungma@eit.uni-kl.de 163212027Sjungma@eit.uni-kl.de double_to_special_int64(inittime/timescale_unit, 163312027Sjungma@eit.uni-kl.de &previous_time_units_high, 163412027Sjungma@eit.uni-kl.de &previous_time_units_low ); 163512027Sjungma@eit.uni-kl.de 163612027Sjungma@eit.uni-kl.de for (i = 0; i < (int)traces.size(); i++) { 163712027Sjungma@eit.uni-kl.de wif_trace* t = traces[i]; 163812027Sjungma@eit.uni-kl.de t->write(fp); 163912027Sjungma@eit.uni-kl.de } 164012027Sjungma@eit.uni-kl.de} 164112027Sjungma@eit.uni-kl.de 164212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 164312027Sjungma@eit.uni-kl.de 164412027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD(tp) \ 164512027Sjungma@eit.uni-kl.devoid \ 164612027Sjungma@eit.uni-kl.dewif_trace_file::trace( const tp& object_, const std::string& name_ ) \ 164712027Sjungma@eit.uni-kl.de{ \ 164812027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 164912027Sjungma@eit.uni-kl.de traces.push_back( new wif_ ## tp ## _trace( object_, \ 165012027Sjungma@eit.uni-kl.de name_, \ 165112027Sjungma@eit.uni-kl.de obtain_name() ) ); \ 165212027Sjungma@eit.uni-kl.de} 165312027Sjungma@eit.uni-kl.de 165412027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(bool) 165512027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(float) 165612027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(double) 165712027Sjungma@eit.uni-kl.de 165812027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD 165912027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD(tp) \ 166012027Sjungma@eit.uni-kl.devoid \ 166112027Sjungma@eit.uni-kl.dewif_trace_file::trace(const sc_dt::tp& object_, const std::string& name_) \ 166212027Sjungma@eit.uni-kl.de{ \ 166312027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 166412027Sjungma@eit.uni-kl.de traces.push_back( new wif_ ## tp ## _trace( object_, \ 166512027Sjungma@eit.uni-kl.de name_, \ 166612027Sjungma@eit.uni-kl.de obtain_name() ) ); \ 166712027Sjungma@eit.uni-kl.de} 166812027Sjungma@eit.uni-kl.de 166912027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_bit) 167012027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_logic) 167112027Sjungma@eit.uni-kl.de 167212027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_signed) 167312027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_unsigned) 167412027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_int_base) 167512027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_uint_base) 167612027Sjungma@eit.uni-kl.de 167712027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_fxval) 167812027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_fxval_fast) 167912027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_fxnum) 168012027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_fxnum_fast) 168112027Sjungma@eit.uni-kl.de 168212027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD 168312027Sjungma@eit.uni-kl.de 168412027Sjungma@eit.uni-kl.de 168512027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD_SIGNED(tp) \ 168612027Sjungma@eit.uni-kl.devoid \ 168712027Sjungma@eit.uni-kl.dewif_trace_file::trace( const tp& object_, \ 168812027Sjungma@eit.uni-kl.de const std::string& name_, \ 168912027Sjungma@eit.uni-kl.de int width_ ) \ 169012027Sjungma@eit.uni-kl.de{ \ 169112027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 169212027Sjungma@eit.uni-kl.de traces.push_back( new wif_signed_ ## tp ## _trace( object_, \ 169312027Sjungma@eit.uni-kl.de name_, \ 169412027Sjungma@eit.uni-kl.de obtain_name(), \ 169512027Sjungma@eit.uni-kl.de width_ ) ); \ 169612027Sjungma@eit.uni-kl.de} 169712027Sjungma@eit.uni-kl.de 169812027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD_UNSIGNED(tp) \ 169912027Sjungma@eit.uni-kl.devoid \ 170012027Sjungma@eit.uni-kl.dewif_trace_file::trace( const unsigned tp& object_, \ 170112027Sjungma@eit.uni-kl.de const std::string& name_, \ 170212027Sjungma@eit.uni-kl.de int width_ ) \ 170312027Sjungma@eit.uni-kl.de{ \ 170412027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 170512027Sjungma@eit.uni-kl.de traces.push_back( new wif_unsigned_ ## tp ## _trace( object_, \ 170612027Sjungma@eit.uni-kl.de name_, \ 170712027Sjungma@eit.uni-kl.de obtain_name(), \ 170812027Sjungma@eit.uni-kl.de width_ ) ); \ 170912027Sjungma@eit.uni-kl.de} 171012027Sjungma@eit.uni-kl.de 171112027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_SIGNED(char) 171212027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_SIGNED(short) 171312027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_SIGNED(int) 171412027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_SIGNED(long) 171512027Sjungma@eit.uni-kl.de 171612027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_UNSIGNED(char) 171712027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_UNSIGNED(short) 171812027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_UNSIGNED(int) 171912027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_UNSIGNED(long) 172012027Sjungma@eit.uni-kl.de 172112027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD_SIGNED 172212027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD_UNSIGNED 172312027Sjungma@eit.uni-kl.de 172412027Sjungma@eit.uni-kl.de 172512027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD_LONG_LONG(tp) \ 172612027Sjungma@eit.uni-kl.devoid \ 172712027Sjungma@eit.uni-kl.dewif_trace_file::trace( const sc_dt::tp& object_, \ 172812027Sjungma@eit.uni-kl.de const std::string& name_, \ 172912027Sjungma@eit.uni-kl.de int width_ ) \ 173012027Sjungma@eit.uni-kl.de{ \ 173112027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 173212027Sjungma@eit.uni-kl.de traces.push_back( new wif_ ## tp ## _trace( object_, \ 173312027Sjungma@eit.uni-kl.de name_, \ 173412027Sjungma@eit.uni-kl.de obtain_name(), \ 173512027Sjungma@eit.uni-kl.de width_ ) ); \ 173612027Sjungma@eit.uni-kl.de} 173712027Sjungma@eit.uni-kl.de 173812027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_LONG_LONG(int64) 173912027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_LONG_LONG(uint64) 174012027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD_LONG_LONG 174112027Sjungma@eit.uni-kl.de 174212027Sjungma@eit.uni-kl.devoid 174312027Sjungma@eit.uni-kl.dewif_trace_file::trace( const unsigned& object_, 174412027Sjungma@eit.uni-kl.de const std::string& name_, 174512027Sjungma@eit.uni-kl.de const char** enum_literals_ ) 174612027Sjungma@eit.uni-kl.de{ 174712027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) 174812027Sjungma@eit.uni-kl.de traces.push_back( new wif_enum_trace( object_, 174912027Sjungma@eit.uni-kl.de name_, 175012027Sjungma@eit.uni-kl.de obtain_name(), 175112027Sjungma@eit.uni-kl.de enum_literals_ ) ); 175212027Sjungma@eit.uni-kl.de} 175312027Sjungma@eit.uni-kl.de 175412027Sjungma@eit.uni-kl.devoid 175512027Sjungma@eit.uni-kl.dewif_trace_file::trace( const sc_dt::sc_bv_base& object_, 175612027Sjungma@eit.uni-kl.de const std::string& name_ ) 175712027Sjungma@eit.uni-kl.de{ 175812027Sjungma@eit.uni-kl.de traceT( object_, name_, WIF_BIT ); 175912027Sjungma@eit.uni-kl.de} 176012027Sjungma@eit.uni-kl.de 176112027Sjungma@eit.uni-kl.devoid 176212027Sjungma@eit.uni-kl.dewif_trace_file::trace( const sc_dt::sc_lv_base& object_, 176312027Sjungma@eit.uni-kl.de const std::string& name_ ) 176412027Sjungma@eit.uni-kl.de{ 176512027Sjungma@eit.uni-kl.de traceT( object_, name_, WIF_MVL ); 176612027Sjungma@eit.uni-kl.de} 176712027Sjungma@eit.uni-kl.de 176812027Sjungma@eit.uni-kl.de 176912027Sjungma@eit.uni-kl.devoid 177012027Sjungma@eit.uni-kl.dewif_trace_file::write_comment(const std::string& comment) 177112027Sjungma@eit.uni-kl.de{ 177212027Sjungma@eit.uni-kl.de if(!fp) open_fp(); 177312027Sjungma@eit.uni-kl.de //no newline in comments allowed 177412027Sjungma@eit.uni-kl.de std::fprintf(fp, "comment \"%s\" ;\n", comment.c_str()); 177512027Sjungma@eit.uni-kl.de} 177612027Sjungma@eit.uni-kl.de 177712027Sjungma@eit.uni-kl.de 177812027Sjungma@eit.uni-kl.devoid 177912027Sjungma@eit.uni-kl.dewif_trace_file::cycle(bool this_is_a_delta_cycle) 178012027Sjungma@eit.uni-kl.de{ 178112027Sjungma@eit.uni-kl.de unsigned now_units_high, now_units_low; 178212027Sjungma@eit.uni-kl.de 178312027Sjungma@eit.uni-kl.de // Trace delta cycles only when enabled 178412027Sjungma@eit.uni-kl.de if (!delta_cycles() && this_is_a_delta_cycle) return; 178512027Sjungma@eit.uni-kl.de 178612027Sjungma@eit.uni-kl.de // Check for initialization 178712027Sjungma@eit.uni-kl.de if( initialize() ) { 178812027Sjungma@eit.uni-kl.de return; 178912027Sjungma@eit.uni-kl.de }; 179012027Sjungma@eit.uni-kl.de 179112027Sjungma@eit.uni-kl.de // double now_units = sc_simulation_time() / timescale_unit; 179212027Sjungma@eit.uni-kl.de double now_units = sc_time_stamp().to_seconds() / timescale_unit; 179312027Sjungma@eit.uni-kl.de 179412027Sjungma@eit.uni-kl.de double_to_special_int64(now_units, &now_units_high, &now_units_low ); 179512027Sjungma@eit.uni-kl.de 179612027Sjungma@eit.uni-kl.de // Now do the real stuff 179712027Sjungma@eit.uni-kl.de unsigned delta_units_high, delta_units_low; 179812027Sjungma@eit.uni-kl.de double diff_time; 179912027Sjungma@eit.uni-kl.de diff_time = now_units - previous_time; 180012027Sjungma@eit.uni-kl.de double_to_special_int64(diff_time, &delta_units_high, &delta_units_low); 180112027Sjungma@eit.uni-kl.de if (this_is_a_delta_cycle && (diff_time == 0.0)) 180212027Sjungma@eit.uni-kl.de delta_units_low++; // Increment time for delta cycle simulation 180312027Sjungma@eit.uni-kl.de // Note that in the last statement above, we are assuming no more 180412027Sjungma@eit.uni-kl.de // than 2^32 delta cycles - seems realistic 180512027Sjungma@eit.uni-kl.de 180612027Sjungma@eit.uni-kl.de bool time_printed = false; 180712027Sjungma@eit.uni-kl.de wif_trace* const* const l_traces = &traces[0]; 180812027Sjungma@eit.uni-kl.de for (int i = 0; i < (int)traces.size(); i++) { 180912027Sjungma@eit.uni-kl.de wif_trace* t = l_traces[i]; 181012027Sjungma@eit.uni-kl.de if(t->changed()){ 181112027Sjungma@eit.uni-kl.de if(time_printed == false){ 181212027Sjungma@eit.uni-kl.de if(delta_units_high){ 181312027Sjungma@eit.uni-kl.de std::fprintf(fp, "delta_time %u%09u ;\n", delta_units_high, 181412027Sjungma@eit.uni-kl.de delta_units_low); 181512027Sjungma@eit.uni-kl.de } 181612027Sjungma@eit.uni-kl.de else{ 181712027Sjungma@eit.uni-kl.de std::fprintf(fp, "delta_time %u ;\n", delta_units_low); 181812027Sjungma@eit.uni-kl.de } 181912027Sjungma@eit.uni-kl.de time_printed = true; 182012027Sjungma@eit.uni-kl.de } 182112027Sjungma@eit.uni-kl.de 182212027Sjungma@eit.uni-kl.de // Write the variable 182312027Sjungma@eit.uni-kl.de t->write(fp); 182412027Sjungma@eit.uni-kl.de } 182512027Sjungma@eit.uni-kl.de } 182612027Sjungma@eit.uni-kl.de 182712027Sjungma@eit.uni-kl.de if(time_printed) { 182812027Sjungma@eit.uni-kl.de std::fprintf(fp, "\n"); // Put another newline 182912027Sjungma@eit.uni-kl.de // We update previous_time_units only when we print time because 183012027Sjungma@eit.uni-kl.de // this field stores the previous time that was printed, not the 183112027Sjungma@eit.uni-kl.de // previous time this function was called 183212027Sjungma@eit.uni-kl.de previous_time_units_high = now_units_high; 183312027Sjungma@eit.uni-kl.de previous_time_units_low = now_units_low; 183412027Sjungma@eit.uni-kl.de previous_time = now_units; 183512027Sjungma@eit.uni-kl.de } 183612027Sjungma@eit.uni-kl.de} 183712027Sjungma@eit.uni-kl.de 183812027Sjungma@eit.uni-kl.de#if 0 183912027Sjungma@eit.uni-kl.devoid 184012027Sjungma@eit.uni-kl.dewif_trace_file::create_wif_name(std::string* ptr_to_str) 184112027Sjungma@eit.uni-kl.de{ 184212027Sjungma@eit.uni-kl.de obtain_name().swap(*ptr_to_str); 184312027Sjungma@eit.uni-kl.de} 184412027Sjungma@eit.uni-kl.de#endif 184512027Sjungma@eit.uni-kl.de 184612027Sjungma@eit.uni-kl.de// Create a WIF name for a variable 184712027Sjungma@eit.uni-kl.destd::string 184812027Sjungma@eit.uni-kl.dewif_trace_file::obtain_name() 184912027Sjungma@eit.uni-kl.de{ 185012027Sjungma@eit.uni-kl.de char buf[32]; 185112027Sjungma@eit.uni-kl.de std::sprintf( buf, "O%d", wif_name_index ++ ); 185212027Sjungma@eit.uni-kl.de return buf; 185312027Sjungma@eit.uni-kl.de} 185412027Sjungma@eit.uni-kl.de 185512027Sjungma@eit.uni-kl.dewif_trace_file::~wif_trace_file() 185612027Sjungma@eit.uni-kl.de{ 185712027Sjungma@eit.uni-kl.de for( int i = 0; i < (int)traces.size(); i++ ) { 185812027Sjungma@eit.uni-kl.de wif_trace* t = traces[i]; 185912027Sjungma@eit.uni-kl.de delete t; 186012027Sjungma@eit.uni-kl.de } 186112027Sjungma@eit.uni-kl.de} 186212027Sjungma@eit.uni-kl.de 186312027Sjungma@eit.uni-kl.de// Map sc_logic values to values understandable by WIF 186412027Sjungma@eit.uni-kl.destatic char 186512027Sjungma@eit.uni-kl.demap_sc_logic_state_to_wif_state(char in_char) 186612027Sjungma@eit.uni-kl.de{ 186712027Sjungma@eit.uni-kl.de char out_char; 186812027Sjungma@eit.uni-kl.de 186912027Sjungma@eit.uni-kl.de switch(in_char){ 187012027Sjungma@eit.uni-kl.de case 'U': 187112027Sjungma@eit.uni-kl.de case 'X': 187212027Sjungma@eit.uni-kl.de case 'W': 187312027Sjungma@eit.uni-kl.de case 'D': 187412027Sjungma@eit.uni-kl.de out_char = 'X'; 187512027Sjungma@eit.uni-kl.de break; 187612027Sjungma@eit.uni-kl.de case '0': 187712027Sjungma@eit.uni-kl.de case 'L': 187812027Sjungma@eit.uni-kl.de out_char = '0'; 187912027Sjungma@eit.uni-kl.de break; 188012027Sjungma@eit.uni-kl.de case '1': 188112027Sjungma@eit.uni-kl.de case 'H': 188212027Sjungma@eit.uni-kl.de out_char = '1'; 188312027Sjungma@eit.uni-kl.de break; 188412027Sjungma@eit.uni-kl.de case 'Z': 188512027Sjungma@eit.uni-kl.de out_char = 'Z'; 188612027Sjungma@eit.uni-kl.de break; 188712027Sjungma@eit.uni-kl.de default: 188812027Sjungma@eit.uni-kl.de out_char = '?'; 188912027Sjungma@eit.uni-kl.de } 189012027Sjungma@eit.uni-kl.de return out_char; 189112027Sjungma@eit.uni-kl.de} 189212027Sjungma@eit.uni-kl.de 189312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 189412027Sjungma@eit.uni-kl.de 189512027Sjungma@eit.uni-kl.de// Create the trace file 189612027Sjungma@eit.uni-kl.desc_trace_file* 189712027Sjungma@eit.uni-kl.desc_create_wif_trace_file(const char * name) 189812027Sjungma@eit.uni-kl.de{ 189912027Sjungma@eit.uni-kl.de sc_trace_file *tf = new wif_trace_file(name); 190012027Sjungma@eit.uni-kl.de return tf; 190112027Sjungma@eit.uni-kl.de} 190212027Sjungma@eit.uni-kl.de 190312027Sjungma@eit.uni-kl.de 190412027Sjungma@eit.uni-kl.devoid 190512027Sjungma@eit.uni-kl.desc_close_wif_trace_file( sc_trace_file* tf ) 190612027Sjungma@eit.uni-kl.de{ 190712027Sjungma@eit.uni-kl.de wif_trace_file* wif_tf = static_cast<wif_trace_file*>(tf); 190812027Sjungma@eit.uni-kl.de delete wif_tf; 190912027Sjungma@eit.uni-kl.de} 191012027Sjungma@eit.uni-kl.de 191112027Sjungma@eit.uni-kl.de} // namespace sc_core 1912