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_vcd_trace.cpp - Implementation of VCD 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, affiliation, 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#include <cstdlib> 5512027Sjungma@eit.uni-kl.de#include <string.h> 5612027Sjungma@eit.uni-kl.de#include <vector> 5712027Sjungma@eit.uni-kl.de 5812027Sjungma@eit.uni-kl.de#define SC_DISABLE_API_VERSION_CHECK // for in-library sc_ver.h inclusion 5912027Sjungma@eit.uni-kl.de 6012027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h" 6112027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_ver.h" 6212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_bit.h" 6312027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_logic.h" 6412027Sjungma@eit.uni-kl.de#include "sysc/datatypes/bit/sc_lv_base.h" 6512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h" 6612027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h" 6712027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_base.h" 6812027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h" 6912027Sjungma@eit.uni-kl.de#include "sysc/datatypes/fx/fx.h" 7012027Sjungma@eit.uni-kl.de#include "sysc/tracing/sc_vcd_trace.h" 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.denamespace sc_core { 7312027Sjungma@eit.uni-kl.de 7412027Sjungma@eit.uni-kl.de// Forward declarations for functions that come later in the file 7512027Sjungma@eit.uni-kl.de// Map sc_dt::sc_logic to printable VCD 7612027Sjungma@eit.uni-kl.destatic char map_sc_logic_state_to_vcd_state(char in_char); 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.de// Remove name problems associated with [] in vcd names 7912027Sjungma@eit.uni-kl.destatic void remove_vcd_name_problems(vcd_trace const* vcd, std::string& name); 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.deconst char* vcd_types[vcd_trace_file::VCD_LAST]={"wire","real"}; 8212027Sjungma@eit.uni-kl.de 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 8512027Sjungma@eit.uni-kl.de// CLASS : vcd_trace 8612027Sjungma@eit.uni-kl.de// 8712027Sjungma@eit.uni-kl.de// Base class for VCD traces. 8812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.declass vcd_trace 9112027Sjungma@eit.uni-kl.de{ 9212027Sjungma@eit.uni-kl.depublic: 9312027Sjungma@eit.uni-kl.de 9412027Sjungma@eit.uni-kl.de vcd_trace(const std::string& name_, const std::string& vcd_name_); 9512027Sjungma@eit.uni-kl.de 9612027Sjungma@eit.uni-kl.de // Needs to be pure virtual as has to be defined by the particular 9712027Sjungma@eit.uni-kl.de // type being traced 9812027Sjungma@eit.uni-kl.de virtual void write(FILE* f) = 0; 9912027Sjungma@eit.uni-kl.de 10012027Sjungma@eit.uni-kl.de virtual void set_width(); 10112027Sjungma@eit.uni-kl.de 10212027Sjungma@eit.uni-kl.de static const char* strip_leading_bits(const char* originalbuf); 10312027Sjungma@eit.uni-kl.de 10412027Sjungma@eit.uni-kl.de // Comparison function needs to be pure virtual too 10512027Sjungma@eit.uni-kl.de virtual bool changed() = 0; 10612027Sjungma@eit.uni-kl.de 10712027Sjungma@eit.uni-kl.de // Make this virtual as some derived classes may overwrite 10812027Sjungma@eit.uni-kl.de virtual void print_variable_declaration_line(FILE* f); 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de void compose_data_line(char* rawdata, char* compdata); 11112027Sjungma@eit.uni-kl.de std::string compose_line(const std::string& data); 11212027Sjungma@eit.uni-kl.de 11312027Sjungma@eit.uni-kl.de virtual ~vcd_trace(); 11412027Sjungma@eit.uni-kl.de 11512027Sjungma@eit.uni-kl.de const std::string name; 11612027Sjungma@eit.uni-kl.de const std::string vcd_name; 11712027Sjungma@eit.uni-kl.de const char* vcd_var_typ_name; 11812027Sjungma@eit.uni-kl.de int bit_width; 11912027Sjungma@eit.uni-kl.de}; 12012027Sjungma@eit.uni-kl.de 12112027Sjungma@eit.uni-kl.de 12212027Sjungma@eit.uni-kl.devcd_trace::vcd_trace(const std::string& name_, const std::string& vcd_name_) 12312027Sjungma@eit.uni-kl.de: name(name_), vcd_name(vcd_name_), vcd_var_typ_name(0), bit_width(0) 12412027Sjungma@eit.uni-kl.de{ 12512027Sjungma@eit.uni-kl.de /* Intentionally blank */ 12612027Sjungma@eit.uni-kl.de} 12712027Sjungma@eit.uni-kl.de 12812027Sjungma@eit.uni-kl.devoid 12912027Sjungma@eit.uni-kl.devcd_trace::compose_data_line(char* rawdata, char* compdata) 13012027Sjungma@eit.uni-kl.de{ 13112027Sjungma@eit.uni-kl.de sc_assert(rawdata != compdata); 13212027Sjungma@eit.uni-kl.de 13312027Sjungma@eit.uni-kl.de if(bit_width == 0) 13412027Sjungma@eit.uni-kl.de { 13512027Sjungma@eit.uni-kl.de compdata[0] = '\0'; 13612027Sjungma@eit.uni-kl.de } 13712027Sjungma@eit.uni-kl.de else 13812027Sjungma@eit.uni-kl.de { 13912027Sjungma@eit.uni-kl.de if(bit_width == 1) 14012027Sjungma@eit.uni-kl.de { 14112027Sjungma@eit.uni-kl.de compdata[0] = rawdata[0]; 14212027Sjungma@eit.uni-kl.de strcpy(&(compdata[1]), vcd_name.c_str()); 14312027Sjungma@eit.uni-kl.de } 14412027Sjungma@eit.uni-kl.de else 14512027Sjungma@eit.uni-kl.de { 14612027Sjungma@eit.uni-kl.de const char* effective_begin = strip_leading_bits(rawdata); 14712027Sjungma@eit.uni-kl.de std::sprintf(compdata, "b%s %s", effective_begin, vcd_name.c_str()); 14812027Sjungma@eit.uni-kl.de } 14912027Sjungma@eit.uni-kl.de } 15012027Sjungma@eit.uni-kl.de} 15112027Sjungma@eit.uni-kl.de 15212027Sjungma@eit.uni-kl.de// same as above but not that ugly 15312027Sjungma@eit.uni-kl.destd::string 15412027Sjungma@eit.uni-kl.devcd_trace::compose_line(const std::string& data) 15512027Sjungma@eit.uni-kl.de{ 15612027Sjungma@eit.uni-kl.de if(bit_width == 0) 15712027Sjungma@eit.uni-kl.de return ""; 15812027Sjungma@eit.uni-kl.de if(bit_width == 1) 15912027Sjungma@eit.uni-kl.de return data + vcd_name; 16012027Sjungma@eit.uni-kl.de return std::string("b")+strip_leading_bits(data.c_str())+" "+vcd_name; 16112027Sjungma@eit.uni-kl.de} 16212027Sjungma@eit.uni-kl.de 16312027Sjungma@eit.uni-kl.devoid 16412027Sjungma@eit.uni-kl.devcd_trace::print_variable_declaration_line(FILE* f) 16512027Sjungma@eit.uni-kl.de{ 16612027Sjungma@eit.uni-kl.de char buf[2000]; 16712027Sjungma@eit.uni-kl.de 16812027Sjungma@eit.uni-kl.de if ( bit_width <= 0 ) 16912027Sjungma@eit.uni-kl.de { 17012027Sjungma@eit.uni-kl.de std::stringstream ss; 17112027Sjungma@eit.uni-kl.de ss << "'" << name << "' has 0 bits"; 17212027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( SC_ID_TRACING_OBJECT_IGNORED_ 17312027Sjungma@eit.uni-kl.de , ss.str().c_str() ); 17412027Sjungma@eit.uni-kl.de return; 17512027Sjungma@eit.uni-kl.de } 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.de std::string namecopy = name; 17812027Sjungma@eit.uni-kl.de remove_vcd_name_problems(this, namecopy); 17912027Sjungma@eit.uni-kl.de if ( bit_width == 1 ) 18012027Sjungma@eit.uni-kl.de { 18112027Sjungma@eit.uni-kl.de std::sprintf(buf, "$var %s % 3d %s %s $end\n", 18212027Sjungma@eit.uni-kl.de vcd_var_typ_name, 18312027Sjungma@eit.uni-kl.de bit_width, 18412027Sjungma@eit.uni-kl.de vcd_name.c_str(), 18512027Sjungma@eit.uni-kl.de namecopy.c_str()); 18612027Sjungma@eit.uni-kl.de } 18712027Sjungma@eit.uni-kl.de else 18812027Sjungma@eit.uni-kl.de { 18912027Sjungma@eit.uni-kl.de std::sprintf(buf, "$var %s % 3d %s %s [%d:0] $end\n", 19012027Sjungma@eit.uni-kl.de vcd_var_typ_name, 19112027Sjungma@eit.uni-kl.de bit_width, 19212027Sjungma@eit.uni-kl.de vcd_name.c_str(), 19312027Sjungma@eit.uni-kl.de namecopy.c_str(), 19412027Sjungma@eit.uni-kl.de bit_width-1); 19512027Sjungma@eit.uni-kl.de } 19612027Sjungma@eit.uni-kl.de std::fputs(buf, f); 19712027Sjungma@eit.uni-kl.de} 19812027Sjungma@eit.uni-kl.de 19912027Sjungma@eit.uni-kl.devoid 20012027Sjungma@eit.uni-kl.devcd_trace::set_width() 20112027Sjungma@eit.uni-kl.de{ 20212027Sjungma@eit.uni-kl.de /* Intentionally Blank, should be defined for each type separately */ 20312027Sjungma@eit.uni-kl.de} 20412027Sjungma@eit.uni-kl.de 20512027Sjungma@eit.uni-kl.deconst char* 20612027Sjungma@eit.uni-kl.devcd_trace::strip_leading_bits(const char* originalbuf) 20712027Sjungma@eit.uni-kl.de{ 20812027Sjungma@eit.uni-kl.de //********************************************************************* 20912027Sjungma@eit.uni-kl.de // - Remove multiple leading 0,z,x, and replace by only one 21012027Sjungma@eit.uni-kl.de // - For example, 21112027Sjungma@eit.uni-kl.de // b000z100 -> b0z100 21212027Sjungma@eit.uni-kl.de // b00000xxx -> b0xxx 21312027Sjungma@eit.uni-kl.de // b000 -> b0 21412027Sjungma@eit.uni-kl.de // bzzzzz1 -> bz1 21512027Sjungma@eit.uni-kl.de // bxxxz10 -> xz10 21612027Sjungma@eit.uni-kl.de // - For leading 0's followed by 1, remove all leading 0's 21712027Sjungma@eit.uni-kl.de // b0000010101 -> b10101 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.de const char* position = originalbuf; 22012027Sjungma@eit.uni-kl.de 22112027Sjungma@eit.uni-kl.de if( strlen(originalbuf) < 2 || 22212027Sjungma@eit.uni-kl.de (originalbuf[0] != 'z' && originalbuf[0] != 'x' && 22312027Sjungma@eit.uni-kl.de originalbuf[0] != '0' )) 22412027Sjungma@eit.uni-kl.de return originalbuf; 22512027Sjungma@eit.uni-kl.de 22612027Sjungma@eit.uni-kl.de char first_char = *position; 22712027Sjungma@eit.uni-kl.de while(*position == first_char) 22812027Sjungma@eit.uni-kl.de { 22912027Sjungma@eit.uni-kl.de position++; 23012027Sjungma@eit.uni-kl.de } 23112027Sjungma@eit.uni-kl.de 23212027Sjungma@eit.uni-kl.de if(first_char == '0' && *position == '1') 23312027Sjungma@eit.uni-kl.de return position; 23412027Sjungma@eit.uni-kl.de // else 23512027Sjungma@eit.uni-kl.de return position-1; 23612027Sjungma@eit.uni-kl.de} 23712027Sjungma@eit.uni-kl.de 23812027Sjungma@eit.uni-kl.devcd_trace::~vcd_trace() 23912027Sjungma@eit.uni-kl.de{ 24012027Sjungma@eit.uni-kl.de /* Intentionally Blank */ 24112027Sjungma@eit.uni-kl.de} 24212027Sjungma@eit.uni-kl.de 24312027Sjungma@eit.uni-kl.de 24412027Sjungma@eit.uni-kl.detemplate <class T> 24512027Sjungma@eit.uni-kl.declass vcd_T_trace : public vcd_trace 24612027Sjungma@eit.uni-kl.de{ 24712027Sjungma@eit.uni-kl.de public: 24812027Sjungma@eit.uni-kl.de 24912027Sjungma@eit.uni-kl.de vcd_T_trace( const T& object_, 25012027Sjungma@eit.uni-kl.de const std::string& name_, 25112027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 25212027Sjungma@eit.uni-kl.de vcd_trace_file::vcd_enum type_ ) 25312027Sjungma@eit.uni-kl.de : vcd_trace( name_, vcd_name_ ), 25412027Sjungma@eit.uni-kl.de object( object_ ), 25512027Sjungma@eit.uni-kl.de old_value( object_ ) 25612027Sjungma@eit.uni-kl.de { 25712027Sjungma@eit.uni-kl.de vcd_var_typ_name = vcd_types[type_]; 25812027Sjungma@eit.uni-kl.de } 25912027Sjungma@eit.uni-kl.de 26012027Sjungma@eit.uni-kl.de void write( FILE* f ) 26112027Sjungma@eit.uni-kl.de { 26212027Sjungma@eit.uni-kl.de std::fprintf( f, "%s", compose_line( object.to_string() ).c_str() ); 26312027Sjungma@eit.uni-kl.de old_value = object; 26412027Sjungma@eit.uni-kl.de } 26512027Sjungma@eit.uni-kl.de 26612027Sjungma@eit.uni-kl.de bool changed() 26712027Sjungma@eit.uni-kl.de { return !(object == old_value); } 26812027Sjungma@eit.uni-kl.de 26912027Sjungma@eit.uni-kl.de void set_width() 27012027Sjungma@eit.uni-kl.de { bit_width = object.length(); } 27112027Sjungma@eit.uni-kl.de 27212027Sjungma@eit.uni-kl.deprotected: 27312027Sjungma@eit.uni-kl.de 27412027Sjungma@eit.uni-kl.de const T& object; 27512027Sjungma@eit.uni-kl.de T old_value; 27612027Sjungma@eit.uni-kl.de}; 27712027Sjungma@eit.uni-kl.de 27812027Sjungma@eit.uni-kl.detypedef vcd_T_trace<sc_dt::sc_bv_base> vcd_sc_bv_trace; 27912027Sjungma@eit.uni-kl.detypedef vcd_T_trace<sc_dt::sc_lv_base> vcd_sc_lv_trace; 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.de// Trace sc_dt::sc_bv_base (sc_dt::sc_bv) 28212027Sjungma@eit.uni-kl.devoid 28312027Sjungma@eit.uni-kl.devcd_trace_file::trace( 28412027Sjungma@eit.uni-kl.de const sc_dt::sc_bv_base& object, const std::string& name) 28512027Sjungma@eit.uni-kl.de{ 28612027Sjungma@eit.uni-kl.de traceT(object,name); 28712027Sjungma@eit.uni-kl.de} 28812027Sjungma@eit.uni-kl.de 28912027Sjungma@eit.uni-kl.de// Trace sc_dt::sc_lv_base (sc_dt::sc_lv) 29012027Sjungma@eit.uni-kl.devoid 29112027Sjungma@eit.uni-kl.devcd_trace_file::trace( 29212027Sjungma@eit.uni-kl.de const sc_dt::sc_lv_base& object, const std::string& name) 29312027Sjungma@eit.uni-kl.de{ 29412027Sjungma@eit.uni-kl.de traceT(object,name); 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 vcd_bool_trace : public vcd_trace { 30012027Sjungma@eit.uni-kl.depublic: 30112027Sjungma@eit.uni-kl.de vcd_bool_trace(const bool& object_, 30212027Sjungma@eit.uni-kl.de const std::string& name_, 30312027Sjungma@eit.uni-kl.de const std::string& vcd_name_); 30412027Sjungma@eit.uni-kl.de void write(FILE* f); 30512027Sjungma@eit.uni-kl.de bool changed(); 30612027Sjungma@eit.uni-kl.de 30712027Sjungma@eit.uni-kl.deprotected: 30812027Sjungma@eit.uni-kl.de const bool& object; 30912027Sjungma@eit.uni-kl.de bool old_value; 31012027Sjungma@eit.uni-kl.de}; 31112027Sjungma@eit.uni-kl.de 31212027Sjungma@eit.uni-kl.devcd_bool_trace::vcd_bool_trace(const bool& object_, 31312027Sjungma@eit.uni-kl.de const std::string& name_, 31412027Sjungma@eit.uni-kl.de const std::string& vcd_name_) 31512027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_) 31612027Sjungma@eit.uni-kl.de{ 31712027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 31812027Sjungma@eit.uni-kl.de bit_width = 1; 31912027Sjungma@eit.uni-kl.de} 32012027Sjungma@eit.uni-kl.de 32112027Sjungma@eit.uni-kl.debool 32212027Sjungma@eit.uni-kl.devcd_bool_trace::changed() 32312027Sjungma@eit.uni-kl.de{ 32412027Sjungma@eit.uni-kl.de return object != old_value; 32512027Sjungma@eit.uni-kl.de} 32612027Sjungma@eit.uni-kl.de 32712027Sjungma@eit.uni-kl.devoid 32812027Sjungma@eit.uni-kl.devcd_bool_trace::write(FILE* f) 32912027Sjungma@eit.uni-kl.de{ 33012027Sjungma@eit.uni-kl.de if (object == true) std::fputc('1', f); 33112027Sjungma@eit.uni-kl.de else std::fputc('0', f); 33212027Sjungma@eit.uni-kl.de 33312027Sjungma@eit.uni-kl.de std::fprintf(f,"%s", vcd_name.c_str()); 33412027Sjungma@eit.uni-kl.de 33512027Sjungma@eit.uni-kl.de old_value = object; 33612027Sjungma@eit.uni-kl.de} 33712027Sjungma@eit.uni-kl.de 33812027Sjungma@eit.uni-kl.de//***************************************************************************** 33912027Sjungma@eit.uni-kl.de 34012027Sjungma@eit.uni-kl.declass vcd_sc_bit_trace : public vcd_trace { 34112027Sjungma@eit.uni-kl.depublic: 34212027Sjungma@eit.uni-kl.de vcd_sc_bit_trace(const sc_dt::sc_bit& , const std::string& , 34312027Sjungma@eit.uni-kl.de const std::string& ); 34412027Sjungma@eit.uni-kl.de void write(FILE* f); 34512027Sjungma@eit.uni-kl.de bool changed(); 34612027Sjungma@eit.uni-kl.de 34712027Sjungma@eit.uni-kl.deprotected: 34812027Sjungma@eit.uni-kl.de const sc_dt::sc_bit& object; 34912027Sjungma@eit.uni-kl.de sc_dt::sc_bit old_value; 35012027Sjungma@eit.uni-kl.de}; 35112027Sjungma@eit.uni-kl.de 35212027Sjungma@eit.uni-kl.devcd_sc_bit_trace::vcd_sc_bit_trace( const sc_dt::sc_bit& object_, 35312027Sjungma@eit.uni-kl.de const std::string& name, 35412027Sjungma@eit.uni-kl.de const std::string& vcd_name) 35512027Sjungma@eit.uni-kl.de: vcd_trace(name, vcd_name), object( object_ ), old_value( object_ ) 35612027Sjungma@eit.uni-kl.de{ 35712027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 35812027Sjungma@eit.uni-kl.de bit_width = 1; 35912027Sjungma@eit.uni-kl.de} 36012027Sjungma@eit.uni-kl.de 36112027Sjungma@eit.uni-kl.debool 36212027Sjungma@eit.uni-kl.devcd_sc_bit_trace::changed() 36312027Sjungma@eit.uni-kl.de{ 36412027Sjungma@eit.uni-kl.de return object != old_value; 36512027Sjungma@eit.uni-kl.de} 36612027Sjungma@eit.uni-kl.de 36712027Sjungma@eit.uni-kl.devoid 36812027Sjungma@eit.uni-kl.devcd_sc_bit_trace::write(FILE* f) 36912027Sjungma@eit.uni-kl.de{ 37012027Sjungma@eit.uni-kl.de if (object == true) std::fputc('1', f); 37112027Sjungma@eit.uni-kl.de else std::fputc('0', f); 37212027Sjungma@eit.uni-kl.de 37312027Sjungma@eit.uni-kl.de std::fprintf(f,"%s", vcd_name.c_str()); 37412027Sjungma@eit.uni-kl.de 37512027Sjungma@eit.uni-kl.de old_value = object; 37612027Sjungma@eit.uni-kl.de} 37712027Sjungma@eit.uni-kl.de 37812027Sjungma@eit.uni-kl.de/*****************************************************************************/ 37912027Sjungma@eit.uni-kl.de 38012027Sjungma@eit.uni-kl.declass vcd_sc_logic_trace : public vcd_trace { 38112027Sjungma@eit.uni-kl.depublic: 38212027Sjungma@eit.uni-kl.de vcd_sc_logic_trace(const sc_dt::sc_logic& object_, 38312027Sjungma@eit.uni-kl.de const std::string& name_, 38412027Sjungma@eit.uni-kl.de const std::string& vcd_name_); 38512027Sjungma@eit.uni-kl.de void write(FILE* f); 38612027Sjungma@eit.uni-kl.de bool changed(); 38712027Sjungma@eit.uni-kl.de 38812027Sjungma@eit.uni-kl.deprotected: 38912027Sjungma@eit.uni-kl.de const sc_dt::sc_logic& object; 39012027Sjungma@eit.uni-kl.de sc_dt::sc_logic old_value; 39112027Sjungma@eit.uni-kl.de}; 39212027Sjungma@eit.uni-kl.de 39312027Sjungma@eit.uni-kl.de 39412027Sjungma@eit.uni-kl.devcd_sc_logic_trace::vcd_sc_logic_trace(const sc_dt::sc_logic& object_, 39512027Sjungma@eit.uni-kl.de const std::string& name_, 39612027Sjungma@eit.uni-kl.de const std::string& vcd_name_) 39712027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_) 39812027Sjungma@eit.uni-kl.de{ 39912027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 40012027Sjungma@eit.uni-kl.de bit_width = 1; 40112027Sjungma@eit.uni-kl.de} 40212027Sjungma@eit.uni-kl.de 40312027Sjungma@eit.uni-kl.de 40412027Sjungma@eit.uni-kl.debool 40512027Sjungma@eit.uni-kl.devcd_sc_logic_trace::changed() 40612027Sjungma@eit.uni-kl.de{ 40712027Sjungma@eit.uni-kl.de return object != old_value; 40812027Sjungma@eit.uni-kl.de} 40912027Sjungma@eit.uni-kl.de 41012027Sjungma@eit.uni-kl.de 41112027Sjungma@eit.uni-kl.devoid 41212027Sjungma@eit.uni-kl.devcd_sc_logic_trace::write(FILE* f) 41312027Sjungma@eit.uni-kl.de{ 41412027Sjungma@eit.uni-kl.de char out_char; 41512027Sjungma@eit.uni-kl.de out_char = map_sc_logic_state_to_vcd_state(object.to_char()); 41612027Sjungma@eit.uni-kl.de std::fputc(out_char, f); 41712027Sjungma@eit.uni-kl.de 41812027Sjungma@eit.uni-kl.de std::fprintf(f,"%s", vcd_name.c_str()); 41912027Sjungma@eit.uni-kl.de 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 vcd_sc_unsigned_trace : public vcd_trace { 42712027Sjungma@eit.uni-kl.depublic: 42812027Sjungma@eit.uni-kl.de vcd_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& vcd_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.devcd_sc_unsigned_trace::vcd_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& vcd_name_) 44412027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_.length()) 44512027Sjungma@eit.uni-kl.de// The last may look strange, but is correct 44612027Sjungma@eit.uni-kl.de{ 44712027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 44812027Sjungma@eit.uni-kl.de old_value = object; 44912027Sjungma@eit.uni-kl.de} 45012027Sjungma@eit.uni-kl.de 45112027Sjungma@eit.uni-kl.debool 45212027Sjungma@eit.uni-kl.devcd_sc_unsigned_trace::changed() 45312027Sjungma@eit.uni-kl.de{ 45412027Sjungma@eit.uni-kl.de return object != old_value; 45512027Sjungma@eit.uni-kl.de} 45612027Sjungma@eit.uni-kl.de 45712027Sjungma@eit.uni-kl.devoid 45812027Sjungma@eit.uni-kl.devcd_sc_unsigned_trace::write(FILE* f) 45912027Sjungma@eit.uni-kl.de{ 46012027Sjungma@eit.uni-kl.de static std::vector<char> compdata(1024), rawdata(1024); 46112027Sjungma@eit.uni-kl.de typedef std::vector<char>::size_type size_t; 46212027Sjungma@eit.uni-kl.de 46312027Sjungma@eit.uni-kl.de if ( compdata.size() < (size_t)object.length() ) { 46412027Sjungma@eit.uni-kl.de size_t sz = ( (size_t)object.length() + 4096 ) & (~(size_t)(4096-1)); 46512027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( compdata ); // resize without copying values 46612027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( rawdata ); 46712027Sjungma@eit.uni-kl.de } 46812027Sjungma@eit.uni-kl.de char *rawdata_ptr = &rawdata[0]; 46912027Sjungma@eit.uni-kl.de 47012027Sjungma@eit.uni-kl.de for (int bitindex = object.length() - 1; bitindex >= 0; --bitindex) { 47112027Sjungma@eit.uni-kl.de *rawdata_ptr++ = "01"[object[bitindex].to_bool()]; 47212027Sjungma@eit.uni-kl.de } 47312027Sjungma@eit.uni-kl.de *rawdata_ptr = '\0'; 47412027Sjungma@eit.uni-kl.de compose_data_line(&rawdata[0], &compdata[0]); 47512027Sjungma@eit.uni-kl.de 47612027Sjungma@eit.uni-kl.de std::fputs(&compdata[0], f); 47712027Sjungma@eit.uni-kl.de old_value = object; 47812027Sjungma@eit.uni-kl.de} 47912027Sjungma@eit.uni-kl.de 48012027Sjungma@eit.uni-kl.devoid 48112027Sjungma@eit.uni-kl.devcd_sc_unsigned_trace::set_width() 48212027Sjungma@eit.uni-kl.de{ 48312027Sjungma@eit.uni-kl.de bit_width = object.length(); 48412027Sjungma@eit.uni-kl.de} 48512027Sjungma@eit.uni-kl.de 48612027Sjungma@eit.uni-kl.de 48712027Sjungma@eit.uni-kl.de/*****************************************************************************/ 48812027Sjungma@eit.uni-kl.de 48912027Sjungma@eit.uni-kl.declass vcd_sc_signed_trace : public vcd_trace { 49012027Sjungma@eit.uni-kl.depublic: 49112027Sjungma@eit.uni-kl.de vcd_sc_signed_trace(const sc_dt::sc_signed& object, 49212027Sjungma@eit.uni-kl.de const std::string& name_, 49312027Sjungma@eit.uni-kl.de const std::string& vcd_name_); 49412027Sjungma@eit.uni-kl.de void write(FILE* f); 49512027Sjungma@eit.uni-kl.de bool changed(); 49612027Sjungma@eit.uni-kl.de void set_width(); 49712027Sjungma@eit.uni-kl.de 49812027Sjungma@eit.uni-kl.deprotected: 49912027Sjungma@eit.uni-kl.de const sc_dt::sc_signed& object; 50012027Sjungma@eit.uni-kl.de sc_dt::sc_signed old_value; 50112027Sjungma@eit.uni-kl.de}; 50212027Sjungma@eit.uni-kl.de 50312027Sjungma@eit.uni-kl.de 50412027Sjungma@eit.uni-kl.devcd_sc_signed_trace::vcd_sc_signed_trace(const sc_dt::sc_signed& object_, 50512027Sjungma@eit.uni-kl.de const std::string& name_, 50612027Sjungma@eit.uni-kl.de const std::string& vcd_name_) 50712027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_.length()) 50812027Sjungma@eit.uni-kl.de{ 50912027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 51012027Sjungma@eit.uni-kl.de old_value = object; 51112027Sjungma@eit.uni-kl.de} 51212027Sjungma@eit.uni-kl.de 51312027Sjungma@eit.uni-kl.debool 51412027Sjungma@eit.uni-kl.devcd_sc_signed_trace::changed() 51512027Sjungma@eit.uni-kl.de{ 51612027Sjungma@eit.uni-kl.de return object != old_value; 51712027Sjungma@eit.uni-kl.de} 51812027Sjungma@eit.uni-kl.de 51912027Sjungma@eit.uni-kl.devoid 52012027Sjungma@eit.uni-kl.devcd_sc_signed_trace::write(FILE* f) 52112027Sjungma@eit.uni-kl.de{ 52212027Sjungma@eit.uni-kl.de static std::vector<char> compdata(1024), rawdata(1024); 52312027Sjungma@eit.uni-kl.de typedef std::vector<char>::size_type size_t; 52412027Sjungma@eit.uni-kl.de 52512027Sjungma@eit.uni-kl.de if ( compdata.size() < (size_t)object.length() ) { 52612027Sjungma@eit.uni-kl.de size_t sz = ( (size_t)object.length() + 4096 ) & (~(size_t)(4096-1)); 52712027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( compdata ); // resize without copying values 52812027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( rawdata ); 52912027Sjungma@eit.uni-kl.de } 53012027Sjungma@eit.uni-kl.de char *rawdata_ptr = &rawdata[0]; 53112027Sjungma@eit.uni-kl.de 53212027Sjungma@eit.uni-kl.de for (int bitindex = object.length() - 1; bitindex >= 0; --bitindex) { 53312027Sjungma@eit.uni-kl.de *rawdata_ptr++ = "01"[object[bitindex].to_bool()]; 53412027Sjungma@eit.uni-kl.de } 53512027Sjungma@eit.uni-kl.de *rawdata_ptr = '\0'; 53612027Sjungma@eit.uni-kl.de compose_data_line(&rawdata[0], &compdata[0]); 53712027Sjungma@eit.uni-kl.de 53812027Sjungma@eit.uni-kl.de std::fputs(&compdata[0], f); 53912027Sjungma@eit.uni-kl.de old_value = object; 54012027Sjungma@eit.uni-kl.de} 54112027Sjungma@eit.uni-kl.de 54212027Sjungma@eit.uni-kl.devoid 54312027Sjungma@eit.uni-kl.devcd_sc_signed_trace::set_width() 54412027Sjungma@eit.uni-kl.de{ 54512027Sjungma@eit.uni-kl.de bit_width = object.length(); 54612027Sjungma@eit.uni-kl.de} 54712027Sjungma@eit.uni-kl.de 54812027Sjungma@eit.uni-kl.de/*****************************************************************************/ 54912027Sjungma@eit.uni-kl.de 55012027Sjungma@eit.uni-kl.declass vcd_sc_uint_base_trace : public vcd_trace { 55112027Sjungma@eit.uni-kl.depublic: 55212027Sjungma@eit.uni-kl.de vcd_sc_uint_base_trace(const sc_dt::sc_uint_base& object, 55312027Sjungma@eit.uni-kl.de const std::string& name_, 55412027Sjungma@eit.uni-kl.de const std::string& vcd_name_); 55512027Sjungma@eit.uni-kl.de void write(FILE* f); 55612027Sjungma@eit.uni-kl.de bool changed(); 55712027Sjungma@eit.uni-kl.de void set_width(); 55812027Sjungma@eit.uni-kl.de 55912027Sjungma@eit.uni-kl.deprotected: 56012027Sjungma@eit.uni-kl.de const sc_dt::sc_uint_base& object; 56112027Sjungma@eit.uni-kl.de sc_dt::sc_uint_base old_value; 56212027Sjungma@eit.uni-kl.de}; 56312027Sjungma@eit.uni-kl.de 56412027Sjungma@eit.uni-kl.de 56512027Sjungma@eit.uni-kl.devcd_sc_uint_base_trace::vcd_sc_uint_base_trace( 56612027Sjungma@eit.uni-kl.de const sc_dt::sc_uint_base& object_, 56712027Sjungma@eit.uni-kl.de const std::string& name_, 56812027Sjungma@eit.uni-kl.de const std::string& vcd_name_) 56912027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_.length()) 57012027Sjungma@eit.uni-kl.de// The last may look strange, but is correct 57112027Sjungma@eit.uni-kl.de{ 57212027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 57312027Sjungma@eit.uni-kl.de old_value = object; 57412027Sjungma@eit.uni-kl.de} 57512027Sjungma@eit.uni-kl.de 57612027Sjungma@eit.uni-kl.debool 57712027Sjungma@eit.uni-kl.devcd_sc_uint_base_trace::changed() 57812027Sjungma@eit.uni-kl.de{ 57912027Sjungma@eit.uni-kl.de return object != old_value; 58012027Sjungma@eit.uni-kl.de} 58112027Sjungma@eit.uni-kl.de 58212027Sjungma@eit.uni-kl.devoid 58312027Sjungma@eit.uni-kl.devcd_sc_uint_base_trace::write(FILE* f) 58412027Sjungma@eit.uni-kl.de{ 58512027Sjungma@eit.uni-kl.de char rawdata[1000], *rawdata_ptr = rawdata; 58612027Sjungma@eit.uni-kl.de char compdata[1000]; 58712027Sjungma@eit.uni-kl.de 58812027Sjungma@eit.uni-kl.de int bitindex; 58912027Sjungma@eit.uni-kl.de for (bitindex = object.length()-1; bitindex >= 0; --bitindex) { 59012027Sjungma@eit.uni-kl.de *rawdata_ptr++ = "01"[object[bitindex].to_bool()]; 59112027Sjungma@eit.uni-kl.de } 59212027Sjungma@eit.uni-kl.de *rawdata_ptr = '\0'; 59312027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 59412027Sjungma@eit.uni-kl.de 59512027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 59612027Sjungma@eit.uni-kl.de old_value = object; 59712027Sjungma@eit.uni-kl.de} 59812027Sjungma@eit.uni-kl.de 59912027Sjungma@eit.uni-kl.devoid 60012027Sjungma@eit.uni-kl.devcd_sc_uint_base_trace::set_width() 60112027Sjungma@eit.uni-kl.de{ 60212027Sjungma@eit.uni-kl.de bit_width = object.length(); 60312027Sjungma@eit.uni-kl.de} 60412027Sjungma@eit.uni-kl.de 60512027Sjungma@eit.uni-kl.de 60612027Sjungma@eit.uni-kl.de/*****************************************************************************/ 60712027Sjungma@eit.uni-kl.de 60812027Sjungma@eit.uni-kl.declass vcd_sc_int_base_trace : public vcd_trace { 60912027Sjungma@eit.uni-kl.depublic: 61012027Sjungma@eit.uni-kl.de vcd_sc_int_base_trace(const sc_dt::sc_int_base& object, 61112027Sjungma@eit.uni-kl.de const std::string& name_, 61212027Sjungma@eit.uni-kl.de const std::string& vcd_name_); 61312027Sjungma@eit.uni-kl.de void write(FILE* f); 61412027Sjungma@eit.uni-kl.de bool changed(); 61512027Sjungma@eit.uni-kl.de void set_width(); 61612027Sjungma@eit.uni-kl.de 61712027Sjungma@eit.uni-kl.deprotected: 61812027Sjungma@eit.uni-kl.de const sc_dt::sc_int_base& object; 61912027Sjungma@eit.uni-kl.de sc_dt::sc_int_base old_value; 62012027Sjungma@eit.uni-kl.de}; 62112027Sjungma@eit.uni-kl.de 62212027Sjungma@eit.uni-kl.de 62312027Sjungma@eit.uni-kl.devcd_sc_int_base_trace::vcd_sc_int_base_trace(const sc_dt::sc_int_base& object_, 62412027Sjungma@eit.uni-kl.de const std::string& name_, 62512027Sjungma@eit.uni-kl.de const std::string& vcd_name_) 62612027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_.length()) 62712027Sjungma@eit.uni-kl.de{ 62812027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 62912027Sjungma@eit.uni-kl.de old_value = object; 63012027Sjungma@eit.uni-kl.de} 63112027Sjungma@eit.uni-kl.de 63212027Sjungma@eit.uni-kl.debool 63312027Sjungma@eit.uni-kl.devcd_sc_int_base_trace::changed() 63412027Sjungma@eit.uni-kl.de{ 63512027Sjungma@eit.uni-kl.de return object != old_value; 63612027Sjungma@eit.uni-kl.de} 63712027Sjungma@eit.uni-kl.de 63812027Sjungma@eit.uni-kl.devoid 63912027Sjungma@eit.uni-kl.devcd_sc_int_base_trace::write(FILE* f) 64012027Sjungma@eit.uni-kl.de{ 64112027Sjungma@eit.uni-kl.de char rawdata[1000], *rawdata_ptr = rawdata; 64212027Sjungma@eit.uni-kl.de char compdata[1000]; 64312027Sjungma@eit.uni-kl.de 64412027Sjungma@eit.uni-kl.de int bitindex; 64512027Sjungma@eit.uni-kl.de for (bitindex = object.length()-1; bitindex >= 0; --bitindex) { 64612027Sjungma@eit.uni-kl.de *rawdata_ptr++ = "01"[object[bitindex].to_bool()]; 64712027Sjungma@eit.uni-kl.de } 64812027Sjungma@eit.uni-kl.de *rawdata_ptr = '\0'; 64912027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 65012027Sjungma@eit.uni-kl.de 65112027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 65212027Sjungma@eit.uni-kl.de old_value = object; 65312027Sjungma@eit.uni-kl.de} 65412027Sjungma@eit.uni-kl.de 65512027Sjungma@eit.uni-kl.devoid 65612027Sjungma@eit.uni-kl.devcd_sc_int_base_trace::set_width() 65712027Sjungma@eit.uni-kl.de{ 65812027Sjungma@eit.uni-kl.de bit_width = object.length(); 65912027Sjungma@eit.uni-kl.de} 66012027Sjungma@eit.uni-kl.de 66112027Sjungma@eit.uni-kl.de 66212027Sjungma@eit.uni-kl.de/*****************************************************************************/ 66312027Sjungma@eit.uni-kl.de 66412027Sjungma@eit.uni-kl.declass vcd_sc_fxval_trace : public vcd_trace 66512027Sjungma@eit.uni-kl.de{ 66612027Sjungma@eit.uni-kl.depublic: 66712027Sjungma@eit.uni-kl.de 66812027Sjungma@eit.uni-kl.de vcd_sc_fxval_trace( const sc_dt::sc_fxval& object, 66912027Sjungma@eit.uni-kl.de const std::string& name_, 67012027Sjungma@eit.uni-kl.de const std::string& vcd_name_ ); 67112027Sjungma@eit.uni-kl.de void write( FILE* f ); 67212027Sjungma@eit.uni-kl.de bool changed(); 67312027Sjungma@eit.uni-kl.de 67412027Sjungma@eit.uni-kl.deprotected: 67512027Sjungma@eit.uni-kl.de 67612027Sjungma@eit.uni-kl.de const sc_dt::sc_fxval& object; 67712027Sjungma@eit.uni-kl.de sc_dt::sc_fxval old_value; 67812027Sjungma@eit.uni-kl.de 67912027Sjungma@eit.uni-kl.de}; 68012027Sjungma@eit.uni-kl.de 68112027Sjungma@eit.uni-kl.devcd_sc_fxval_trace::vcd_sc_fxval_trace( const sc_dt::sc_fxval& object_, 68212027Sjungma@eit.uni-kl.de const std::string& name_, 68312027Sjungma@eit.uni-kl.de const std::string& vcd_name_ ) 68412027Sjungma@eit.uni-kl.de: vcd_trace( name_, vcd_name_ ), 68512027Sjungma@eit.uni-kl.de object( object_ ), old_value( object_ ) 68612027Sjungma@eit.uni-kl.de{ 68712027Sjungma@eit.uni-kl.de vcd_var_typ_name = "real"; 68812027Sjungma@eit.uni-kl.de bit_width = 1; 68912027Sjungma@eit.uni-kl.de} 69012027Sjungma@eit.uni-kl.de 69112027Sjungma@eit.uni-kl.debool 69212027Sjungma@eit.uni-kl.devcd_sc_fxval_trace::changed() 69312027Sjungma@eit.uni-kl.de{ 69412027Sjungma@eit.uni-kl.de return object != old_value; 69512027Sjungma@eit.uni-kl.de} 69612027Sjungma@eit.uni-kl.de 69712027Sjungma@eit.uni-kl.devoid 69812027Sjungma@eit.uni-kl.devcd_sc_fxval_trace::write( FILE* f ) 69912027Sjungma@eit.uni-kl.de{ 70012027Sjungma@eit.uni-kl.de std::fprintf( f, "r%.16g %s", object.to_double(), vcd_name.c_str() ); 70112027Sjungma@eit.uni-kl.de old_value = object; 70212027Sjungma@eit.uni-kl.de} 70312027Sjungma@eit.uni-kl.de 70412027Sjungma@eit.uni-kl.de/*****************************************************************************/ 70512027Sjungma@eit.uni-kl.de 70612027Sjungma@eit.uni-kl.declass vcd_sc_fxval_fast_trace : public vcd_trace 70712027Sjungma@eit.uni-kl.de{ 70812027Sjungma@eit.uni-kl.depublic: 70912027Sjungma@eit.uni-kl.de 71012027Sjungma@eit.uni-kl.de vcd_sc_fxval_fast_trace( const sc_dt::sc_fxval_fast& object, 71112027Sjungma@eit.uni-kl.de const std::string& name_, 71212027Sjungma@eit.uni-kl.de const std::string& vcd_name_ ); 71312027Sjungma@eit.uni-kl.de void write( FILE* f ); 71412027Sjungma@eit.uni-kl.de bool changed(); 71512027Sjungma@eit.uni-kl.de 71612027Sjungma@eit.uni-kl.deprotected: 71712027Sjungma@eit.uni-kl.de 71812027Sjungma@eit.uni-kl.de const sc_dt::sc_fxval_fast& object; 71912027Sjungma@eit.uni-kl.de sc_dt::sc_fxval_fast old_value; 72012027Sjungma@eit.uni-kl.de 72112027Sjungma@eit.uni-kl.de}; 72212027Sjungma@eit.uni-kl.de 72312027Sjungma@eit.uni-kl.devcd_sc_fxval_fast_trace::vcd_sc_fxval_fast_trace( 72412027Sjungma@eit.uni-kl.de const sc_dt::sc_fxval_fast& object_, 72512027Sjungma@eit.uni-kl.de const std::string& name_, 72612027Sjungma@eit.uni-kl.de const std::string& vcd_name_ ) 72712027Sjungma@eit.uni-kl.de: vcd_trace( name_, vcd_name_ ), 72812027Sjungma@eit.uni-kl.de object( object_ ), old_value( object_ ) 72912027Sjungma@eit.uni-kl.de{ 73012027Sjungma@eit.uni-kl.de vcd_var_typ_name = "real"; 73112027Sjungma@eit.uni-kl.de bit_width = 1; 73212027Sjungma@eit.uni-kl.de} 73312027Sjungma@eit.uni-kl.de 73412027Sjungma@eit.uni-kl.debool 73512027Sjungma@eit.uni-kl.devcd_sc_fxval_fast_trace::changed() 73612027Sjungma@eit.uni-kl.de{ 73712027Sjungma@eit.uni-kl.de return object != old_value; 73812027Sjungma@eit.uni-kl.de} 73912027Sjungma@eit.uni-kl.de 74012027Sjungma@eit.uni-kl.devoid 74112027Sjungma@eit.uni-kl.devcd_sc_fxval_fast_trace::write( FILE* f ) 74212027Sjungma@eit.uni-kl.de{ 74312027Sjungma@eit.uni-kl.de std::fprintf( f, "r%.16g %s", object.to_double(), vcd_name.c_str() ); 74412027Sjungma@eit.uni-kl.de old_value = object; 74512027Sjungma@eit.uni-kl.de} 74612027Sjungma@eit.uni-kl.de 74712027Sjungma@eit.uni-kl.de/*****************************************************************************/ 74812027Sjungma@eit.uni-kl.de 74912027Sjungma@eit.uni-kl.declass vcd_sc_fxnum_trace : public vcd_trace 75012027Sjungma@eit.uni-kl.de{ 75112027Sjungma@eit.uni-kl.depublic: 75212027Sjungma@eit.uni-kl.de 75312027Sjungma@eit.uni-kl.de vcd_sc_fxnum_trace( const sc_dt::sc_fxnum& object, 75412027Sjungma@eit.uni-kl.de const std::string& name_, 75512027Sjungma@eit.uni-kl.de const std::string& vcd_name_ ); 75612027Sjungma@eit.uni-kl.de void write( FILE* f ); 75712027Sjungma@eit.uni-kl.de bool changed(); 75812027Sjungma@eit.uni-kl.de void set_width(); 75912027Sjungma@eit.uni-kl.de 76012027Sjungma@eit.uni-kl.deprotected: 76112027Sjungma@eit.uni-kl.de 76212027Sjungma@eit.uni-kl.de const sc_dt::sc_fxnum& object; 76312027Sjungma@eit.uni-kl.de sc_dt::sc_fxnum old_value; 76412027Sjungma@eit.uni-kl.de 76512027Sjungma@eit.uni-kl.de}; 76612027Sjungma@eit.uni-kl.de 76712027Sjungma@eit.uni-kl.devcd_sc_fxnum_trace::vcd_sc_fxnum_trace( const sc_dt::sc_fxnum& object_, 76812027Sjungma@eit.uni-kl.de const std::string& name_, 76912027Sjungma@eit.uni-kl.de const std::string& vcd_name_ ) 77012027Sjungma@eit.uni-kl.de: vcd_trace( name_, vcd_name_ ), 77112027Sjungma@eit.uni-kl.de object( object_ ), 77212027Sjungma@eit.uni-kl.de old_value( object_.m_params.type_params(), 77312027Sjungma@eit.uni-kl.de object_.m_params.enc(), 77412027Sjungma@eit.uni-kl.de object_.m_params.cast_switch(), 77512027Sjungma@eit.uni-kl.de 0 ) 77612027Sjungma@eit.uni-kl.de{ 77712027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 77812027Sjungma@eit.uni-kl.de old_value = object; 77912027Sjungma@eit.uni-kl.de} 78012027Sjungma@eit.uni-kl.de 78112027Sjungma@eit.uni-kl.debool 78212027Sjungma@eit.uni-kl.devcd_sc_fxnum_trace::changed() 78312027Sjungma@eit.uni-kl.de{ 78412027Sjungma@eit.uni-kl.de return object != old_value; 78512027Sjungma@eit.uni-kl.de} 78612027Sjungma@eit.uni-kl.de 78712027Sjungma@eit.uni-kl.devoid 78812027Sjungma@eit.uni-kl.devcd_sc_fxnum_trace::write( FILE* f ) 78912027Sjungma@eit.uni-kl.de{ 79012027Sjungma@eit.uni-kl.de static std::vector<char> compdata(1024), rawdata(1024); 79112027Sjungma@eit.uni-kl.de typedef std::vector<char>::size_type size_t; 79212027Sjungma@eit.uni-kl.de 79312027Sjungma@eit.uni-kl.de if ( compdata.size() < (size_t)object.wl() ) { 79412027Sjungma@eit.uni-kl.de size_t sz = ( (size_t)object.wl() + 4096 ) & (~(size_t)(4096-1)); 79512027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( compdata ); // resize without copying values 79612027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( rawdata ); 79712027Sjungma@eit.uni-kl.de } 79812027Sjungma@eit.uni-kl.de char *rawdata_ptr = &rawdata[0]; 79912027Sjungma@eit.uni-kl.de 80012027Sjungma@eit.uni-kl.de for(int bitindex = object.wl() - 1; bitindex >= 0; -- bitindex ) 80112027Sjungma@eit.uni-kl.de { 80212027Sjungma@eit.uni-kl.de *rawdata_ptr ++ = "01"[object[bitindex]]; 80312027Sjungma@eit.uni-kl.de } 80412027Sjungma@eit.uni-kl.de *rawdata_ptr = '\0'; 80512027Sjungma@eit.uni-kl.de compose_data_line( &rawdata[0], &compdata[0] ); 80612027Sjungma@eit.uni-kl.de 80712027Sjungma@eit.uni-kl.de std::fputs( &compdata[0], f ); 80812027Sjungma@eit.uni-kl.de old_value = object; 80912027Sjungma@eit.uni-kl.de} 81012027Sjungma@eit.uni-kl.de 81112027Sjungma@eit.uni-kl.devoid 81212027Sjungma@eit.uni-kl.devcd_sc_fxnum_trace::set_width() 81312027Sjungma@eit.uni-kl.de{ 81412027Sjungma@eit.uni-kl.de bit_width = object.wl(); 81512027Sjungma@eit.uni-kl.de} 81612027Sjungma@eit.uni-kl.de 81712027Sjungma@eit.uni-kl.de/*****************************************************************************/ 81812027Sjungma@eit.uni-kl.de 81912027Sjungma@eit.uni-kl.declass vcd_sc_fxnum_fast_trace : public vcd_trace 82012027Sjungma@eit.uni-kl.de{ 82112027Sjungma@eit.uni-kl.depublic: 82212027Sjungma@eit.uni-kl.de 82312027Sjungma@eit.uni-kl.de vcd_sc_fxnum_fast_trace( const sc_dt::sc_fxnum_fast& object, 82412027Sjungma@eit.uni-kl.de const std::string& name_, 82512027Sjungma@eit.uni-kl.de const std::string& vcd_name_ ); 82612027Sjungma@eit.uni-kl.de void write( FILE* f ); 82712027Sjungma@eit.uni-kl.de bool changed(); 82812027Sjungma@eit.uni-kl.de void set_width(); 82912027Sjungma@eit.uni-kl.de 83012027Sjungma@eit.uni-kl.deprotected: 83112027Sjungma@eit.uni-kl.de 83212027Sjungma@eit.uni-kl.de const sc_dt::sc_fxnum_fast& object; 83312027Sjungma@eit.uni-kl.de sc_dt::sc_fxnum_fast old_value; 83412027Sjungma@eit.uni-kl.de 83512027Sjungma@eit.uni-kl.de}; 83612027Sjungma@eit.uni-kl.de 83712027Sjungma@eit.uni-kl.devcd_sc_fxnum_fast_trace::vcd_sc_fxnum_fast_trace( 83812027Sjungma@eit.uni-kl.de const sc_dt::sc_fxnum_fast& object_, 83912027Sjungma@eit.uni-kl.de const std::string& name_, 84012027Sjungma@eit.uni-kl.de const std::string& vcd_name_ ) 84112027Sjungma@eit.uni-kl.de: vcd_trace( name_, vcd_name_ ), 84212027Sjungma@eit.uni-kl.de object( object_ ), 84312027Sjungma@eit.uni-kl.de old_value( object_.m_params.type_params(), 84412027Sjungma@eit.uni-kl.de object_.m_params.enc(), 84512027Sjungma@eit.uni-kl.de object_.m_params.cast_switch(), 84612027Sjungma@eit.uni-kl.de 0 ) 84712027Sjungma@eit.uni-kl.de{ 84812027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 84912027Sjungma@eit.uni-kl.de old_value = object; 85012027Sjungma@eit.uni-kl.de} 85112027Sjungma@eit.uni-kl.de 85212027Sjungma@eit.uni-kl.debool 85312027Sjungma@eit.uni-kl.devcd_sc_fxnum_fast_trace::changed() 85412027Sjungma@eit.uni-kl.de{ 85512027Sjungma@eit.uni-kl.de return object != old_value; 85612027Sjungma@eit.uni-kl.de} 85712027Sjungma@eit.uni-kl.de 85812027Sjungma@eit.uni-kl.devoid 85912027Sjungma@eit.uni-kl.devcd_sc_fxnum_fast_trace::write( FILE* f ) 86012027Sjungma@eit.uni-kl.de{ 86112027Sjungma@eit.uni-kl.de static std::vector<char> compdata(1024), rawdata(1024); 86212027Sjungma@eit.uni-kl.de typedef std::vector<char>::size_type size_t; 86312027Sjungma@eit.uni-kl.de 86412027Sjungma@eit.uni-kl.de if ( compdata.size() < (size_t)object.wl() ) { 86512027Sjungma@eit.uni-kl.de size_t sz = ( (size_t)object.wl() + 4096 ) & (~(size_t)(4096-1)); 86612027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( compdata ); // resize without copying values 86712027Sjungma@eit.uni-kl.de std::vector<char>( sz ).swap( rawdata ); 86812027Sjungma@eit.uni-kl.de } 86912027Sjungma@eit.uni-kl.de char *rawdata_ptr = &rawdata[0]; 87012027Sjungma@eit.uni-kl.de 87112027Sjungma@eit.uni-kl.de for(int bitindex = object.wl() - 1; bitindex >= 0; -- bitindex ) 87212027Sjungma@eit.uni-kl.de { 87312027Sjungma@eit.uni-kl.de *rawdata_ptr ++ = "01"[object[bitindex]]; 87412027Sjungma@eit.uni-kl.de } 87512027Sjungma@eit.uni-kl.de *rawdata_ptr = '\0'; 87612027Sjungma@eit.uni-kl.de compose_data_line( &rawdata[0], &compdata[0] ); 87712027Sjungma@eit.uni-kl.de 87812027Sjungma@eit.uni-kl.de std::fputs( &compdata[0], f ); 87912027Sjungma@eit.uni-kl.de old_value = object; 88012027Sjungma@eit.uni-kl.de} 88112027Sjungma@eit.uni-kl.de 88212027Sjungma@eit.uni-kl.devoid 88312027Sjungma@eit.uni-kl.devcd_sc_fxnum_fast_trace::set_width() 88412027Sjungma@eit.uni-kl.de{ 88512027Sjungma@eit.uni-kl.de bit_width = object.wl(); 88612027Sjungma@eit.uni-kl.de} 88712027Sjungma@eit.uni-kl.de 88812027Sjungma@eit.uni-kl.de 88912027Sjungma@eit.uni-kl.de/*****************************************************************************/ 89012027Sjungma@eit.uni-kl.de 89112027Sjungma@eit.uni-kl.declass vcd_unsigned_int_trace : public vcd_trace { 89212027Sjungma@eit.uni-kl.depublic: 89312027Sjungma@eit.uni-kl.de vcd_unsigned_int_trace(const unsigned& object, 89412027Sjungma@eit.uni-kl.de const std::string& name_, 89512027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 89612027Sjungma@eit.uni-kl.de int width_); 89712027Sjungma@eit.uni-kl.de void write(FILE* f); 89812027Sjungma@eit.uni-kl.de bool changed(); 89912027Sjungma@eit.uni-kl.de 90012027Sjungma@eit.uni-kl.deprotected: 90112027Sjungma@eit.uni-kl.de const unsigned& object; 90212027Sjungma@eit.uni-kl.de unsigned old_value; 90312027Sjungma@eit.uni-kl.de unsigned mask; 90412027Sjungma@eit.uni-kl.de}; 90512027Sjungma@eit.uni-kl.de 90612027Sjungma@eit.uni-kl.de 90712027Sjungma@eit.uni-kl.devcd_unsigned_int_trace::vcd_unsigned_int_trace( 90812027Sjungma@eit.uni-kl.de const unsigned& object_, 90912027Sjungma@eit.uni-kl.de const std::string& name_, 91012027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 91112027Sjungma@eit.uni-kl.de int width_) 91212027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value( object_ ), 91312027Sjungma@eit.uni-kl.de mask((unsigned)-1) 91412027Sjungma@eit.uni-kl.de{ 91512027Sjungma@eit.uni-kl.de bit_width = width_; 91612027Sjungma@eit.uni-kl.de if (bit_width < 32) mask = ~(-1 << bit_width); 91712027Sjungma@eit.uni-kl.de 91812027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 91912027Sjungma@eit.uni-kl.de} 92012027Sjungma@eit.uni-kl.de 92112027Sjungma@eit.uni-kl.de 92212027Sjungma@eit.uni-kl.debool 92312027Sjungma@eit.uni-kl.devcd_unsigned_int_trace::changed() 92412027Sjungma@eit.uni-kl.de{ 92512027Sjungma@eit.uni-kl.de return object != old_value; 92612027Sjungma@eit.uni-kl.de} 92712027Sjungma@eit.uni-kl.de 92812027Sjungma@eit.uni-kl.de 92912027Sjungma@eit.uni-kl.devoid 93012027Sjungma@eit.uni-kl.devcd_unsigned_int_trace::write(FILE* f) 93112027Sjungma@eit.uni-kl.de{ 93212027Sjungma@eit.uni-kl.de char rawdata[1000]; 93312027Sjungma@eit.uni-kl.de char compdata[1000]; 93412027Sjungma@eit.uni-kl.de int bitindex; 93512027Sjungma@eit.uni-kl.de 93612027Sjungma@eit.uni-kl.de // Check for overflow 93712027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 93812027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 93912027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 94012027Sjungma@eit.uni-kl.de } 94112027Sjungma@eit.uni-kl.de } 94212027Sjungma@eit.uni-kl.de else{ 94312027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 94412027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 94512027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 94612027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 94712027Sjungma@eit.uni-kl.de } 94812027Sjungma@eit.uni-kl.de } 94912027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 95012027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 95112027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 95212027Sjungma@eit.uni-kl.de old_value = object; 95312027Sjungma@eit.uni-kl.de} 95412027Sjungma@eit.uni-kl.de 95512027Sjungma@eit.uni-kl.de/*****************************************************************************/ 95612027Sjungma@eit.uni-kl.de 95712027Sjungma@eit.uni-kl.declass vcd_unsigned_short_trace : public vcd_trace { 95812027Sjungma@eit.uni-kl.depublic: 95912027Sjungma@eit.uni-kl.de vcd_unsigned_short_trace(const unsigned short& object, 96012027Sjungma@eit.uni-kl.de const std::string& name_, 96112027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 96212027Sjungma@eit.uni-kl.de int width_); 96312027Sjungma@eit.uni-kl.de void write(FILE* f); 96412027Sjungma@eit.uni-kl.de bool changed(); 96512027Sjungma@eit.uni-kl.de 96612027Sjungma@eit.uni-kl.deprotected: 96712027Sjungma@eit.uni-kl.de const unsigned short& object; 96812027Sjungma@eit.uni-kl.de unsigned short old_value; 96912027Sjungma@eit.uni-kl.de unsigned short mask; 97012027Sjungma@eit.uni-kl.de}; 97112027Sjungma@eit.uni-kl.de 97212027Sjungma@eit.uni-kl.de 97312027Sjungma@eit.uni-kl.devcd_unsigned_short_trace::vcd_unsigned_short_trace( 97412027Sjungma@eit.uni-kl.de const unsigned short& object_, 97512027Sjungma@eit.uni-kl.de const std::string& name_, 97612027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 97712027Sjungma@eit.uni-kl.de int width_) 97812027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), mask(0xffff) 97912027Sjungma@eit.uni-kl.de{ 98012027Sjungma@eit.uni-kl.de bit_width = width_; 98112027Sjungma@eit.uni-kl.de if (bit_width < 16) mask = (unsigned short)~(-1 << bit_width); 98212027Sjungma@eit.uni-kl.de 98312027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 98412027Sjungma@eit.uni-kl.de} 98512027Sjungma@eit.uni-kl.de 98612027Sjungma@eit.uni-kl.de 98712027Sjungma@eit.uni-kl.debool 98812027Sjungma@eit.uni-kl.devcd_unsigned_short_trace::changed() 98912027Sjungma@eit.uni-kl.de{ 99012027Sjungma@eit.uni-kl.de return object != old_value; 99112027Sjungma@eit.uni-kl.de} 99212027Sjungma@eit.uni-kl.de 99312027Sjungma@eit.uni-kl.de 99412027Sjungma@eit.uni-kl.devoid 99512027Sjungma@eit.uni-kl.devcd_unsigned_short_trace::write(FILE* f) 99612027Sjungma@eit.uni-kl.de{ 99712027Sjungma@eit.uni-kl.de char rawdata[1000]; 99812027Sjungma@eit.uni-kl.de char compdata[1000]; 99912027Sjungma@eit.uni-kl.de int bitindex; 100012027Sjungma@eit.uni-kl.de 100112027Sjungma@eit.uni-kl.de // Check for overflow 100212027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 100312027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 100412027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 100512027Sjungma@eit.uni-kl.de } 100612027Sjungma@eit.uni-kl.de } 100712027Sjungma@eit.uni-kl.de else{ 100812027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 100912027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 101012027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 101112027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 101212027Sjungma@eit.uni-kl.de } 101312027Sjungma@eit.uni-kl.de } 101412027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 101512027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 101612027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 101712027Sjungma@eit.uni-kl.de old_value = object; 101812027Sjungma@eit.uni-kl.de} 101912027Sjungma@eit.uni-kl.de 102012027Sjungma@eit.uni-kl.de/*****************************************************************************/ 102112027Sjungma@eit.uni-kl.de 102212027Sjungma@eit.uni-kl.declass vcd_unsigned_char_trace : public vcd_trace { 102312027Sjungma@eit.uni-kl.depublic: 102412027Sjungma@eit.uni-kl.de vcd_unsigned_char_trace(const unsigned char& object, 102512027Sjungma@eit.uni-kl.de const std::string& name_, 102612027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 102712027Sjungma@eit.uni-kl.de int width_); 102812027Sjungma@eit.uni-kl.de void write(FILE* f); 102912027Sjungma@eit.uni-kl.de bool changed(); 103012027Sjungma@eit.uni-kl.de 103112027Sjungma@eit.uni-kl.deprotected: 103212027Sjungma@eit.uni-kl.de const unsigned char& object; 103312027Sjungma@eit.uni-kl.de unsigned char old_value; 103412027Sjungma@eit.uni-kl.de unsigned char mask; 103512027Sjungma@eit.uni-kl.de}; 103612027Sjungma@eit.uni-kl.de 103712027Sjungma@eit.uni-kl.de 103812027Sjungma@eit.uni-kl.devcd_unsigned_char_trace::vcd_unsigned_char_trace( 103912027Sjungma@eit.uni-kl.de const unsigned char& object_, 104012027Sjungma@eit.uni-kl.de const std::string& name_, 104112027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 104212027Sjungma@eit.uni-kl.de int width_) 104312027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), mask(0xff) 104412027Sjungma@eit.uni-kl.de{ 104512027Sjungma@eit.uni-kl.de bit_width = width_; 104612027Sjungma@eit.uni-kl.de if (bit_width < 8) mask = (unsigned char)~(-1 << bit_width); 104712027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 104812027Sjungma@eit.uni-kl.de} 104912027Sjungma@eit.uni-kl.de 105012027Sjungma@eit.uni-kl.de 105112027Sjungma@eit.uni-kl.debool vcd_unsigned_char_trace::changed() 105212027Sjungma@eit.uni-kl.de{ 105312027Sjungma@eit.uni-kl.de return object != old_value; 105412027Sjungma@eit.uni-kl.de} 105512027Sjungma@eit.uni-kl.de 105612027Sjungma@eit.uni-kl.de 105712027Sjungma@eit.uni-kl.devoid vcd_unsigned_char_trace::write(FILE* f) 105812027Sjungma@eit.uni-kl.de{ 105912027Sjungma@eit.uni-kl.de char rawdata[1000]; 106012027Sjungma@eit.uni-kl.de char compdata[1000]; 106112027Sjungma@eit.uni-kl.de int bitindex; 106212027Sjungma@eit.uni-kl.de 106312027Sjungma@eit.uni-kl.de // Check for overflow 106412027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 106512027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 106612027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 106712027Sjungma@eit.uni-kl.de } 106812027Sjungma@eit.uni-kl.de } 106912027Sjungma@eit.uni-kl.de else{ 107012027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 107112027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 107212027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 107312027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 107412027Sjungma@eit.uni-kl.de } 107512027Sjungma@eit.uni-kl.de } 107612027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 107712027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 107812027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 107912027Sjungma@eit.uni-kl.de old_value = object; 108012027Sjungma@eit.uni-kl.de} 108112027Sjungma@eit.uni-kl.de 108212027Sjungma@eit.uni-kl.de/*****************************************************************************/ 108312027Sjungma@eit.uni-kl.de 108412027Sjungma@eit.uni-kl.declass vcd_unsigned_long_trace : public vcd_trace { 108512027Sjungma@eit.uni-kl.depublic: 108612027Sjungma@eit.uni-kl.de vcd_unsigned_long_trace(const unsigned long& object, 108712027Sjungma@eit.uni-kl.de const std::string& name_, 108812027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 108912027Sjungma@eit.uni-kl.de int width_); 109012027Sjungma@eit.uni-kl.de void write(FILE* f); 109112027Sjungma@eit.uni-kl.de bool changed(); 109212027Sjungma@eit.uni-kl.de 109312027Sjungma@eit.uni-kl.deprotected: 109412027Sjungma@eit.uni-kl.de const unsigned long& object; 109512027Sjungma@eit.uni-kl.de unsigned long old_value; 109612027Sjungma@eit.uni-kl.de unsigned long mask; 109712027Sjungma@eit.uni-kl.de}; 109812027Sjungma@eit.uni-kl.de 109912027Sjungma@eit.uni-kl.de 110012027Sjungma@eit.uni-kl.devcd_unsigned_long_trace::vcd_unsigned_long_trace( 110112027Sjungma@eit.uni-kl.de const unsigned long& object_, 110212027Sjungma@eit.uni-kl.de const std::string& name_, 110312027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 110412027Sjungma@eit.uni-kl.de int width_) 110512027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), 110612027Sjungma@eit.uni-kl.de mask((unsigned long)-1) 110712027Sjungma@eit.uni-kl.de{ 110812027Sjungma@eit.uni-kl.de bit_width = width_; 110912027Sjungma@eit.uni-kl.de if ( bit_width < (int)(sizeof(unsigned long)*8) ) 111012027Sjungma@eit.uni-kl.de mask = ~(-1L << bit_width); 111112027Sjungma@eit.uni-kl.de 111212027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 111312027Sjungma@eit.uni-kl.de} 111412027Sjungma@eit.uni-kl.de 111512027Sjungma@eit.uni-kl.de 111612027Sjungma@eit.uni-kl.debool vcd_unsigned_long_trace::changed() 111712027Sjungma@eit.uni-kl.de{ 111812027Sjungma@eit.uni-kl.de return object != old_value; 111912027Sjungma@eit.uni-kl.de} 112012027Sjungma@eit.uni-kl.de 112112027Sjungma@eit.uni-kl.de 112212027Sjungma@eit.uni-kl.devoid vcd_unsigned_long_trace::write(FILE* f) 112312027Sjungma@eit.uni-kl.de{ 112412027Sjungma@eit.uni-kl.de char rawdata[1000]; 112512027Sjungma@eit.uni-kl.de char compdata[1000]; 112612027Sjungma@eit.uni-kl.de int bitindex; 112712027Sjungma@eit.uni-kl.de 112812027Sjungma@eit.uni-kl.de // Check for overflow 112912027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 113012027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 113112027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 113212027Sjungma@eit.uni-kl.de } 113312027Sjungma@eit.uni-kl.de } 113412027Sjungma@eit.uni-kl.de else{ 113512027Sjungma@eit.uni-kl.de unsigned long bit_mask = 1ul << (bit_width-1); 113612027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 113712027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 113812027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 113912027Sjungma@eit.uni-kl.de } 114012027Sjungma@eit.uni-kl.de } 114112027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 114212027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 114312027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 114412027Sjungma@eit.uni-kl.de old_value = object; 114512027Sjungma@eit.uni-kl.de} 114612027Sjungma@eit.uni-kl.de 114712027Sjungma@eit.uni-kl.de/*****************************************************************************/ 114812027Sjungma@eit.uni-kl.de 114912027Sjungma@eit.uni-kl.declass vcd_signed_int_trace : public vcd_trace { 115012027Sjungma@eit.uni-kl.depublic: 115112027Sjungma@eit.uni-kl.de vcd_signed_int_trace(const int& object, 115212027Sjungma@eit.uni-kl.de const std::string& name_, 115312027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 115412027Sjungma@eit.uni-kl.de int width_); 115512027Sjungma@eit.uni-kl.de void write(FILE* f); 115612027Sjungma@eit.uni-kl.de bool changed(); 115712027Sjungma@eit.uni-kl.de 115812027Sjungma@eit.uni-kl.deprotected: 115912027Sjungma@eit.uni-kl.de const int& object; 116012027Sjungma@eit.uni-kl.de int old_value; 116112027Sjungma@eit.uni-kl.de unsigned mask; 116212027Sjungma@eit.uni-kl.de}; 116312027Sjungma@eit.uni-kl.de 116412027Sjungma@eit.uni-kl.de 116512027Sjungma@eit.uni-kl.devcd_signed_int_trace::vcd_signed_int_trace(const signed& object_, 116612027Sjungma@eit.uni-kl.de const std::string& name_, 116712027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 116812027Sjungma@eit.uni-kl.de int width_) 116912027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), 117012027Sjungma@eit.uni-kl.de mask((unsigned)-1) 117112027Sjungma@eit.uni-kl.de{ 117212027Sjungma@eit.uni-kl.de bit_width = width_; 117312027Sjungma@eit.uni-kl.de if (bit_width < 32) mask = ~(-1 << bit_width); 117412027Sjungma@eit.uni-kl.de 117512027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 117612027Sjungma@eit.uni-kl.de} 117712027Sjungma@eit.uni-kl.de 117812027Sjungma@eit.uni-kl.de 117912027Sjungma@eit.uni-kl.debool vcd_signed_int_trace::changed() 118012027Sjungma@eit.uni-kl.de{ 118112027Sjungma@eit.uni-kl.de return object != old_value; 118212027Sjungma@eit.uni-kl.de} 118312027Sjungma@eit.uni-kl.de 118412027Sjungma@eit.uni-kl.de 118512027Sjungma@eit.uni-kl.devoid vcd_signed_int_trace::write(FILE* f) 118612027Sjungma@eit.uni-kl.de{ 118712027Sjungma@eit.uni-kl.de char rawdata[1000]; 118812027Sjungma@eit.uni-kl.de char compdata[1000]; 118912027Sjungma@eit.uni-kl.de int bitindex; 119012027Sjungma@eit.uni-kl.de 119112027Sjungma@eit.uni-kl.de // Check for overflow 119212027Sjungma@eit.uni-kl.de if (((unsigned) object & mask) != (unsigned) object) { 119312027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 119412027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 119512027Sjungma@eit.uni-kl.de } 119612027Sjungma@eit.uni-kl.de } 119712027Sjungma@eit.uni-kl.de else{ 119812027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 119912027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 120012027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 120112027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 120212027Sjungma@eit.uni-kl.de } 120312027Sjungma@eit.uni-kl.de } 120412027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 120512027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 120612027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 120712027Sjungma@eit.uni-kl.de old_value = object; 120812027Sjungma@eit.uni-kl.de} 120912027Sjungma@eit.uni-kl.de 121012027Sjungma@eit.uni-kl.de/*****************************************************************************/ 121112027Sjungma@eit.uni-kl.de 121212027Sjungma@eit.uni-kl.declass vcd_signed_short_trace : public vcd_trace { 121312027Sjungma@eit.uni-kl.depublic: 121412027Sjungma@eit.uni-kl.de vcd_signed_short_trace(const short& object, 121512027Sjungma@eit.uni-kl.de const std::string& name_, 121612027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 121712027Sjungma@eit.uni-kl.de int width_); 121812027Sjungma@eit.uni-kl.de void write(FILE* f); 121912027Sjungma@eit.uni-kl.de bool changed(); 122012027Sjungma@eit.uni-kl.de 122112027Sjungma@eit.uni-kl.deprotected: 122212027Sjungma@eit.uni-kl.de const short& object; 122312027Sjungma@eit.uni-kl.de short old_value; 122412027Sjungma@eit.uni-kl.de unsigned short mask; 122512027Sjungma@eit.uni-kl.de}; 122612027Sjungma@eit.uni-kl.de 122712027Sjungma@eit.uni-kl.de 122812027Sjungma@eit.uni-kl.devcd_signed_short_trace::vcd_signed_short_trace( 122912027Sjungma@eit.uni-kl.de const short& object_, 123012027Sjungma@eit.uni-kl.de const std::string& name_, 123112027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 123212027Sjungma@eit.uni-kl.de int width_) 123312027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), mask(0xffff) 123412027Sjungma@eit.uni-kl.de{ 123512027Sjungma@eit.uni-kl.de bit_width = width_; 123612027Sjungma@eit.uni-kl.de if (bit_width < 16) mask = (unsigned short)~(-1 << bit_width); 123712027Sjungma@eit.uni-kl.de 123812027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 123912027Sjungma@eit.uni-kl.de} 124012027Sjungma@eit.uni-kl.de 124112027Sjungma@eit.uni-kl.de 124212027Sjungma@eit.uni-kl.debool vcd_signed_short_trace::changed() 124312027Sjungma@eit.uni-kl.de{ 124412027Sjungma@eit.uni-kl.de return object != old_value; 124512027Sjungma@eit.uni-kl.de} 124612027Sjungma@eit.uni-kl.de 124712027Sjungma@eit.uni-kl.de 124812027Sjungma@eit.uni-kl.devoid vcd_signed_short_trace::write(FILE* f) 124912027Sjungma@eit.uni-kl.de{ 125012027Sjungma@eit.uni-kl.de char rawdata[1000]; 125112027Sjungma@eit.uni-kl.de char compdata[1000]; 125212027Sjungma@eit.uni-kl.de int bitindex; 125312027Sjungma@eit.uni-kl.de 125412027Sjungma@eit.uni-kl.de // Check for overflow 125512027Sjungma@eit.uni-kl.de if (((unsigned short) object & mask) != (unsigned short) object) { 125612027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 125712027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 125812027Sjungma@eit.uni-kl.de } 125912027Sjungma@eit.uni-kl.de } 126012027Sjungma@eit.uni-kl.de else{ 126112027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 126212027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 126312027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 126412027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 126512027Sjungma@eit.uni-kl.de } 126612027Sjungma@eit.uni-kl.de } 126712027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 126812027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 126912027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 127012027Sjungma@eit.uni-kl.de old_value = object; 127112027Sjungma@eit.uni-kl.de} 127212027Sjungma@eit.uni-kl.de 127312027Sjungma@eit.uni-kl.de/*****************************************************************************/ 127412027Sjungma@eit.uni-kl.de 127512027Sjungma@eit.uni-kl.declass vcd_signed_char_trace : public vcd_trace { 127612027Sjungma@eit.uni-kl.depublic: 127712027Sjungma@eit.uni-kl.de vcd_signed_char_trace(const char& object, 127812027Sjungma@eit.uni-kl.de const std::string& name_, 127912027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 128012027Sjungma@eit.uni-kl.de int width_); 128112027Sjungma@eit.uni-kl.de void write(FILE* f); 128212027Sjungma@eit.uni-kl.de bool changed(); 128312027Sjungma@eit.uni-kl.de 128412027Sjungma@eit.uni-kl.deprotected: 128512027Sjungma@eit.uni-kl.de const char& object; 128612027Sjungma@eit.uni-kl.de char old_value; 128712027Sjungma@eit.uni-kl.de unsigned char mask; 128812027Sjungma@eit.uni-kl.de}; 128912027Sjungma@eit.uni-kl.de 129012027Sjungma@eit.uni-kl.de 129112027Sjungma@eit.uni-kl.devcd_signed_char_trace::vcd_signed_char_trace(const char& object_, 129212027Sjungma@eit.uni-kl.de const std::string& name_, 129312027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 129412027Sjungma@eit.uni-kl.de int width_) 129512027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), mask(0xff) 129612027Sjungma@eit.uni-kl.de{ 129712027Sjungma@eit.uni-kl.de bit_width = width_; 129812027Sjungma@eit.uni-kl.de if (bit_width < 8) mask = (unsigned char)~(-1 << bit_width); 129912027Sjungma@eit.uni-kl.de 130012027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 130112027Sjungma@eit.uni-kl.de} 130212027Sjungma@eit.uni-kl.de 130312027Sjungma@eit.uni-kl.de 130412027Sjungma@eit.uni-kl.debool vcd_signed_char_trace::changed() 130512027Sjungma@eit.uni-kl.de{ 130612027Sjungma@eit.uni-kl.de return object != old_value; 130712027Sjungma@eit.uni-kl.de} 130812027Sjungma@eit.uni-kl.de 130912027Sjungma@eit.uni-kl.de 131012027Sjungma@eit.uni-kl.devoid vcd_signed_char_trace::write(FILE* f) 131112027Sjungma@eit.uni-kl.de{ 131212027Sjungma@eit.uni-kl.de char rawdata[1000]; 131312027Sjungma@eit.uni-kl.de char compdata[1000]; 131412027Sjungma@eit.uni-kl.de int bitindex; 131512027Sjungma@eit.uni-kl.de 131612027Sjungma@eit.uni-kl.de // Check for overflow 131712027Sjungma@eit.uni-kl.de if (((unsigned char) object & mask) != (unsigned char) object) { 131812027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 131912027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 132012027Sjungma@eit.uni-kl.de } 132112027Sjungma@eit.uni-kl.de } 132212027Sjungma@eit.uni-kl.de else{ 132312027Sjungma@eit.uni-kl.de unsigned bit_mask = 1 << (bit_width-1); 132412027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 132512027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 132612027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 132712027Sjungma@eit.uni-kl.de } 132812027Sjungma@eit.uni-kl.de } 132912027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 133012027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 133112027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 133212027Sjungma@eit.uni-kl.de old_value = object; 133312027Sjungma@eit.uni-kl.de} 133412027Sjungma@eit.uni-kl.de 133512027Sjungma@eit.uni-kl.de/*****************************************************************************/ 133612027Sjungma@eit.uni-kl.de 133712027Sjungma@eit.uni-kl.declass vcd_int64_trace : public vcd_trace { 133812027Sjungma@eit.uni-kl.depublic: 133912027Sjungma@eit.uni-kl.de vcd_int64_trace(const sc_dt::int64& object, 134012027Sjungma@eit.uni-kl.de const std::string& name_, 134112027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 134212027Sjungma@eit.uni-kl.de int width_); 134312027Sjungma@eit.uni-kl.de void write(FILE* f); 134412027Sjungma@eit.uni-kl.de bool changed(); 134512027Sjungma@eit.uni-kl.de 134612027Sjungma@eit.uni-kl.deprotected: 134712027Sjungma@eit.uni-kl.de const sc_dt::int64& object; 134812027Sjungma@eit.uni-kl.de sc_dt::int64 old_value; 134912027Sjungma@eit.uni-kl.de sc_dt::uint64 mask; 135012027Sjungma@eit.uni-kl.de}; 135112027Sjungma@eit.uni-kl.de 135212027Sjungma@eit.uni-kl.de 135312027Sjungma@eit.uni-kl.devcd_int64_trace::vcd_int64_trace(const sc_dt::int64& object_, 135412027Sjungma@eit.uni-kl.de const std::string& name_, 135512027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 135612027Sjungma@eit.uni-kl.de int width_) 135712027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), 135812027Sjungma@eit.uni-kl.de mask((sc_dt::uint64)-1) 135912027Sjungma@eit.uni-kl.de{ 136012027Sjungma@eit.uni-kl.de bit_width = width_; 136112027Sjungma@eit.uni-kl.de if (bit_width < 64) mask = ~(mask << bit_width); 136212027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 136312027Sjungma@eit.uni-kl.de} 136412027Sjungma@eit.uni-kl.de 136512027Sjungma@eit.uni-kl.de 136612027Sjungma@eit.uni-kl.debool vcd_int64_trace::changed() 136712027Sjungma@eit.uni-kl.de{ 136812027Sjungma@eit.uni-kl.de return object != old_value; 136912027Sjungma@eit.uni-kl.de} 137012027Sjungma@eit.uni-kl.de 137112027Sjungma@eit.uni-kl.de 137212027Sjungma@eit.uni-kl.devoid vcd_int64_trace::write(FILE* f) 137312027Sjungma@eit.uni-kl.de{ 137412027Sjungma@eit.uni-kl.de char rawdata[1000]; 137512027Sjungma@eit.uni-kl.de char compdata[1000]; 137612027Sjungma@eit.uni-kl.de int bitindex; 137712027Sjungma@eit.uni-kl.de 137812027Sjungma@eit.uni-kl.de // Check for overflow 137912027Sjungma@eit.uni-kl.de if (((sc_dt::uint64) object & mask) != (sc_dt::uint64) object) 138012027Sjungma@eit.uni-kl.de { 138112027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) 138212027Sjungma@eit.uni-kl.de { 138312027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 138412027Sjungma@eit.uni-kl.de } 138512027Sjungma@eit.uni-kl.de } 138612027Sjungma@eit.uni-kl.de else 138712027Sjungma@eit.uni-kl.de { 138812027Sjungma@eit.uni-kl.de sc_dt::uint64 bit_mask = 1; 138912027Sjungma@eit.uni-kl.de bit_mask = bit_mask << (bit_width-1); 139012027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 139112027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 139212027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 139312027Sjungma@eit.uni-kl.de } 139412027Sjungma@eit.uni-kl.de } 139512027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 139612027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 139712027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 139812027Sjungma@eit.uni-kl.de old_value = object; 139912027Sjungma@eit.uni-kl.de} 140012027Sjungma@eit.uni-kl.de 140112027Sjungma@eit.uni-kl.de 140212027Sjungma@eit.uni-kl.de/*****************************************************************************/ 140312027Sjungma@eit.uni-kl.de 140412027Sjungma@eit.uni-kl.declass vcd_uint64_trace : public vcd_trace { 140512027Sjungma@eit.uni-kl.depublic: 140612027Sjungma@eit.uni-kl.de vcd_uint64_trace(const sc_dt::uint64& object, 140712027Sjungma@eit.uni-kl.de const std::string& name_, 140812027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 140912027Sjungma@eit.uni-kl.de int width_); 141012027Sjungma@eit.uni-kl.de void write(FILE* f); 141112027Sjungma@eit.uni-kl.de bool changed(); 141212027Sjungma@eit.uni-kl.de 141312027Sjungma@eit.uni-kl.deprotected: 141412027Sjungma@eit.uni-kl.de const sc_dt::uint64& object; 141512027Sjungma@eit.uni-kl.de sc_dt::uint64 old_value; 141612027Sjungma@eit.uni-kl.de sc_dt::uint64 mask; 141712027Sjungma@eit.uni-kl.de}; 141812027Sjungma@eit.uni-kl.de 141912027Sjungma@eit.uni-kl.de 142012027Sjungma@eit.uni-kl.devcd_uint64_trace::vcd_uint64_trace( const sc_dt::uint64& object_, 142112027Sjungma@eit.uni-kl.de const std::string& name_, 142212027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 142312027Sjungma@eit.uni-kl.de int width_) 142412027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), 142512027Sjungma@eit.uni-kl.de mask((sc_dt::uint64)-1) 142612027Sjungma@eit.uni-kl.de{ 142712027Sjungma@eit.uni-kl.de bit_width = width_; 142812027Sjungma@eit.uni-kl.de if ( bit_width < 64 ) mask = ~(mask << bit_width); 142912027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 143012027Sjungma@eit.uni-kl.de} 143112027Sjungma@eit.uni-kl.de 143212027Sjungma@eit.uni-kl.de 143312027Sjungma@eit.uni-kl.debool vcd_uint64_trace::changed() 143412027Sjungma@eit.uni-kl.de{ 143512027Sjungma@eit.uni-kl.de return object != old_value; 143612027Sjungma@eit.uni-kl.de} 143712027Sjungma@eit.uni-kl.de 143812027Sjungma@eit.uni-kl.de 143912027Sjungma@eit.uni-kl.devoid vcd_uint64_trace::write(FILE* f) 144012027Sjungma@eit.uni-kl.de{ 144112027Sjungma@eit.uni-kl.de char rawdata[1000]; 144212027Sjungma@eit.uni-kl.de char compdata[1000]; 144312027Sjungma@eit.uni-kl.de int bitindex; 144412027Sjungma@eit.uni-kl.de 144512027Sjungma@eit.uni-kl.de // Check for overflow 144612027Sjungma@eit.uni-kl.de if ((object & mask) != object) 144712027Sjungma@eit.uni-kl.de { 144812027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 144912027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 145012027Sjungma@eit.uni-kl.de } 145112027Sjungma@eit.uni-kl.de } 145212027Sjungma@eit.uni-kl.de else 145312027Sjungma@eit.uni-kl.de { 145412027Sjungma@eit.uni-kl.de sc_dt::uint64 bit_mask = 1; 145512027Sjungma@eit.uni-kl.de bit_mask = bit_mask << (bit_width-1); 145612027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) 145712027Sjungma@eit.uni-kl.de { 145812027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 145912027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 146012027Sjungma@eit.uni-kl.de } 146112027Sjungma@eit.uni-kl.de } 146212027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 146312027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 146412027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 146512027Sjungma@eit.uni-kl.de old_value = object; 146612027Sjungma@eit.uni-kl.de} 146712027Sjungma@eit.uni-kl.de 146812027Sjungma@eit.uni-kl.de 146912027Sjungma@eit.uni-kl.de/*****************************************************************************/ 147012027Sjungma@eit.uni-kl.de 147112027Sjungma@eit.uni-kl.declass vcd_signed_long_trace : public vcd_trace { 147212027Sjungma@eit.uni-kl.depublic: 147312027Sjungma@eit.uni-kl.de vcd_signed_long_trace(const long& object, 147412027Sjungma@eit.uni-kl.de const std::string& name_, 147512027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 147612027Sjungma@eit.uni-kl.de int width_); 147712027Sjungma@eit.uni-kl.de void write(FILE* f); 147812027Sjungma@eit.uni-kl.de bool changed(); 147912027Sjungma@eit.uni-kl.de 148012027Sjungma@eit.uni-kl.deprotected: 148112027Sjungma@eit.uni-kl.de const long& object; 148212027Sjungma@eit.uni-kl.de long old_value; 148312027Sjungma@eit.uni-kl.de unsigned long mask; 148412027Sjungma@eit.uni-kl.de}; 148512027Sjungma@eit.uni-kl.de 148612027Sjungma@eit.uni-kl.de 148712027Sjungma@eit.uni-kl.devcd_signed_long_trace::vcd_signed_long_trace(const long& object_, 148812027Sjungma@eit.uni-kl.de const std::string& name_, 148912027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 149012027Sjungma@eit.uni-kl.de int width_) 149112027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), 149212027Sjungma@eit.uni-kl.de mask((unsigned long)-1) 149312027Sjungma@eit.uni-kl.de{ 149412027Sjungma@eit.uni-kl.de bit_width = width_; 149512027Sjungma@eit.uni-kl.de if ( bit_width < (int)(sizeof(long)*8) ) 149612027Sjungma@eit.uni-kl.de mask = ~(-1L << bit_width); 149712027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 149812027Sjungma@eit.uni-kl.de} 149912027Sjungma@eit.uni-kl.de 150012027Sjungma@eit.uni-kl.de 150112027Sjungma@eit.uni-kl.debool vcd_signed_long_trace::changed() 150212027Sjungma@eit.uni-kl.de{ 150312027Sjungma@eit.uni-kl.de return object != old_value; 150412027Sjungma@eit.uni-kl.de} 150512027Sjungma@eit.uni-kl.de 150612027Sjungma@eit.uni-kl.de 150712027Sjungma@eit.uni-kl.devoid vcd_signed_long_trace::write(FILE* f) 150812027Sjungma@eit.uni-kl.de{ 150912027Sjungma@eit.uni-kl.de char rawdata[1000]; 151012027Sjungma@eit.uni-kl.de char compdata[1000]; 151112027Sjungma@eit.uni-kl.de int bitindex; 151212027Sjungma@eit.uni-kl.de 151312027Sjungma@eit.uni-kl.de // Check for overflow 151412027Sjungma@eit.uni-kl.de if (((unsigned long) object & mask) != (unsigned long) object) { 151512027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 151612027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 151712027Sjungma@eit.uni-kl.de } 151812027Sjungma@eit.uni-kl.de } 151912027Sjungma@eit.uni-kl.de else{ 152012027Sjungma@eit.uni-kl.de unsigned long bit_mask = 1ul << (bit_width-1); 152112027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 152212027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 152312027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 152412027Sjungma@eit.uni-kl.de } 152512027Sjungma@eit.uni-kl.de } 152612027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 152712027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 152812027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 152912027Sjungma@eit.uni-kl.de old_value = object; 153012027Sjungma@eit.uni-kl.de} 153112027Sjungma@eit.uni-kl.de 153212027Sjungma@eit.uni-kl.de 153312027Sjungma@eit.uni-kl.de/*****************************************************************************/ 153412027Sjungma@eit.uni-kl.de 153512027Sjungma@eit.uni-kl.declass vcd_float_trace : public vcd_trace { 153612027Sjungma@eit.uni-kl.depublic: 153712027Sjungma@eit.uni-kl.de vcd_float_trace(const float& object, 153812027Sjungma@eit.uni-kl.de const std::string& name_, 153912027Sjungma@eit.uni-kl.de const std::string& vcd_name_); 154012027Sjungma@eit.uni-kl.de void write(FILE* f); 154112027Sjungma@eit.uni-kl.de bool changed(); 154212027Sjungma@eit.uni-kl.de 154312027Sjungma@eit.uni-kl.deprotected: 154412027Sjungma@eit.uni-kl.de const float& object; 154512027Sjungma@eit.uni-kl.de float old_value; 154612027Sjungma@eit.uni-kl.de}; 154712027Sjungma@eit.uni-kl.de 154812027Sjungma@eit.uni-kl.devcd_float_trace::vcd_float_trace(const float& object_, 154912027Sjungma@eit.uni-kl.de const std::string& name_, 155012027Sjungma@eit.uni-kl.de const std::string& vcd_name_) 155112027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_) 155212027Sjungma@eit.uni-kl.de{ 155312027Sjungma@eit.uni-kl.de vcd_var_typ_name = "real"; 155412027Sjungma@eit.uni-kl.de bit_width = 1; 155512027Sjungma@eit.uni-kl.de old_value = object; 155612027Sjungma@eit.uni-kl.de} 155712027Sjungma@eit.uni-kl.de 155812027Sjungma@eit.uni-kl.debool vcd_float_trace::changed() 155912027Sjungma@eit.uni-kl.de{ 156012027Sjungma@eit.uni-kl.de return object != old_value; 156112027Sjungma@eit.uni-kl.de} 156212027Sjungma@eit.uni-kl.de 156312027Sjungma@eit.uni-kl.devoid vcd_float_trace::write(FILE* f) 156412027Sjungma@eit.uni-kl.de{ 156512027Sjungma@eit.uni-kl.de std::fprintf(f, "r%.16g %s", object, vcd_name.c_str()); 156612027Sjungma@eit.uni-kl.de old_value = object; 156712027Sjungma@eit.uni-kl.de} 156812027Sjungma@eit.uni-kl.de 156912027Sjungma@eit.uni-kl.de/*****************************************************************************/ 157012027Sjungma@eit.uni-kl.de 157112027Sjungma@eit.uni-kl.declass vcd_double_trace : public vcd_trace { 157212027Sjungma@eit.uni-kl.depublic: 157312027Sjungma@eit.uni-kl.de vcd_double_trace(const double& object, 157412027Sjungma@eit.uni-kl.de const std::string& name_, 157512027Sjungma@eit.uni-kl.de const std::string& vcd_name_); 157612027Sjungma@eit.uni-kl.de void write(FILE* f); 157712027Sjungma@eit.uni-kl.de bool changed(); 157812027Sjungma@eit.uni-kl.de 157912027Sjungma@eit.uni-kl.deprotected: 158012027Sjungma@eit.uni-kl.de const double& object; 158112027Sjungma@eit.uni-kl.de double old_value; 158212027Sjungma@eit.uni-kl.de}; 158312027Sjungma@eit.uni-kl.de 158412027Sjungma@eit.uni-kl.devcd_double_trace::vcd_double_trace(const double& object_, 158512027Sjungma@eit.uni-kl.de const std::string& name_, 158612027Sjungma@eit.uni-kl.de const std::string& vcd_name_) 158712027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_) 158812027Sjungma@eit.uni-kl.de{ 158912027Sjungma@eit.uni-kl.de vcd_var_typ_name = "real"; 159012027Sjungma@eit.uni-kl.de bit_width = 1; 159112027Sjungma@eit.uni-kl.de} 159212027Sjungma@eit.uni-kl.de 159312027Sjungma@eit.uni-kl.debool vcd_double_trace::changed() 159412027Sjungma@eit.uni-kl.de{ 159512027Sjungma@eit.uni-kl.de return object != old_value; 159612027Sjungma@eit.uni-kl.de} 159712027Sjungma@eit.uni-kl.de 159812027Sjungma@eit.uni-kl.devoid vcd_double_trace::write(FILE* f) 159912027Sjungma@eit.uni-kl.de{ 160012027Sjungma@eit.uni-kl.de std::fprintf(f, "r%.16g %s", object, vcd_name.c_str()); 160112027Sjungma@eit.uni-kl.de old_value = object; 160212027Sjungma@eit.uni-kl.de} 160312027Sjungma@eit.uni-kl.de 160412027Sjungma@eit.uni-kl.de 160512027Sjungma@eit.uni-kl.de/*****************************************************************************/ 160612027Sjungma@eit.uni-kl.de 160712027Sjungma@eit.uni-kl.declass vcd_enum_trace : public vcd_trace { 160812027Sjungma@eit.uni-kl.depublic: 160912027Sjungma@eit.uni-kl.de vcd_enum_trace(const unsigned& object_, 161012027Sjungma@eit.uni-kl.de const std::string& name_, 161112027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 161212027Sjungma@eit.uni-kl.de const char** enum_literals); 161312027Sjungma@eit.uni-kl.de void write(FILE* f); 161412027Sjungma@eit.uni-kl.de bool changed(); 161512027Sjungma@eit.uni-kl.de 161612027Sjungma@eit.uni-kl.deprotected: 161712027Sjungma@eit.uni-kl.de const unsigned& object; 161812027Sjungma@eit.uni-kl.de unsigned old_value; 161912027Sjungma@eit.uni-kl.de unsigned mask; 162012027Sjungma@eit.uni-kl.de const char** literals; 162112027Sjungma@eit.uni-kl.de unsigned nliterals; 162212027Sjungma@eit.uni-kl.de}; 162312027Sjungma@eit.uni-kl.de 162412027Sjungma@eit.uni-kl.de 162512027Sjungma@eit.uni-kl.devcd_enum_trace::vcd_enum_trace(const unsigned& object_, 162612027Sjungma@eit.uni-kl.de const std::string& name_, 162712027Sjungma@eit.uni-kl.de const std::string& vcd_name_, 162812027Sjungma@eit.uni-kl.de const char** enum_literals_) 162912027Sjungma@eit.uni-kl.de: vcd_trace(name_, vcd_name_), object(object_), old_value(object_), 163012027Sjungma@eit.uni-kl.de mask(0xffffffff), literals(enum_literals_), nliterals(0) 163112027Sjungma@eit.uni-kl.de{ 163212027Sjungma@eit.uni-kl.de // find number of bits required to represent enumeration literal - counting loop 163312027Sjungma@eit.uni-kl.de for (nliterals = 0; enum_literals_[nliterals]; nliterals++) continue; 163412027Sjungma@eit.uni-kl.de 163512027Sjungma@eit.uni-kl.de // Figure out number of bits required to represent the number of literals 163612027Sjungma@eit.uni-kl.de bit_width = 0; 163712027Sjungma@eit.uni-kl.de unsigned shifted_maxindex = nliterals-1; 163812027Sjungma@eit.uni-kl.de while(shifted_maxindex != 0){ 163912027Sjungma@eit.uni-kl.de shifted_maxindex >>= 1; 164012027Sjungma@eit.uni-kl.de bit_width++; 164112027Sjungma@eit.uni-kl.de } 164212027Sjungma@eit.uni-kl.de 164312027Sjungma@eit.uni-kl.de // Set the mask 164412027Sjungma@eit.uni-kl.de if (bit_width < 32) { 164512027Sjungma@eit.uni-kl.de mask = ~(-1 << bit_width); 164612027Sjungma@eit.uni-kl.de } else { 164712027Sjungma@eit.uni-kl.de mask = 0xffffffff; 164812027Sjungma@eit.uni-kl.de } 164912027Sjungma@eit.uni-kl.de 165012027Sjungma@eit.uni-kl.de vcd_var_typ_name = "wire"; 165112027Sjungma@eit.uni-kl.de} 165212027Sjungma@eit.uni-kl.de 165312027Sjungma@eit.uni-kl.debool vcd_enum_trace::changed() 165412027Sjungma@eit.uni-kl.de{ 165512027Sjungma@eit.uni-kl.de return object != old_value; 165612027Sjungma@eit.uni-kl.de} 165712027Sjungma@eit.uni-kl.de 165812027Sjungma@eit.uni-kl.devoid vcd_enum_trace::write(FILE* f) 165912027Sjungma@eit.uni-kl.de{ 166012027Sjungma@eit.uni-kl.de char rawdata[1000]; 166112027Sjungma@eit.uni-kl.de char compdata[1000]; 166212027Sjungma@eit.uni-kl.de int bitindex; 166312027Sjungma@eit.uni-kl.de 166412027Sjungma@eit.uni-kl.de // Check for overflow 166512027Sjungma@eit.uni-kl.de if ((object & mask) != object) { 166612027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++){ 166712027Sjungma@eit.uni-kl.de rawdata[bitindex] = 'x'; 166812027Sjungma@eit.uni-kl.de } 166912027Sjungma@eit.uni-kl.de } else { 167012027Sjungma@eit.uni-kl.de unsigned long bit_mask = 1ul << (bit_width-1); 167112027Sjungma@eit.uni-kl.de for (bitindex = 0; bitindex < bit_width; bitindex++) { 167212027Sjungma@eit.uni-kl.de rawdata[bitindex] = (object & bit_mask)? '1' : '0'; 167312027Sjungma@eit.uni-kl.de bit_mask = bit_mask >> 1; 167412027Sjungma@eit.uni-kl.de } 167512027Sjungma@eit.uni-kl.de } 167612027Sjungma@eit.uni-kl.de rawdata[bitindex] = '\0'; 167712027Sjungma@eit.uni-kl.de compose_data_line(rawdata, compdata); 167812027Sjungma@eit.uni-kl.de std::fputs(compdata, f); 167912027Sjungma@eit.uni-kl.de old_value = object; 168012027Sjungma@eit.uni-kl.de} 168112027Sjungma@eit.uni-kl.de 168212027Sjungma@eit.uni-kl.de 168312027Sjungma@eit.uni-kl.de/***************************************************************************** 168412027Sjungma@eit.uni-kl.de vcd_trace_file functions 168512027Sjungma@eit.uni-kl.de *****************************************************************************/ 168612027Sjungma@eit.uni-kl.de 168712027Sjungma@eit.uni-kl.devcd_trace_file::vcd_trace_file(const char *name) 168812027Sjungma@eit.uni-kl.de : sc_trace_file_base( name, "vcd" ) 168912027Sjungma@eit.uni-kl.de , vcd_name_index(0) 169012027Sjungma@eit.uni-kl.de , previous_time_units_low(0) 169112027Sjungma@eit.uni-kl.de , previous_time_units_high(0) 169212027Sjungma@eit.uni-kl.de , traces() 169312027Sjungma@eit.uni-kl.de{} 169412027Sjungma@eit.uni-kl.de 169512027Sjungma@eit.uni-kl.de 169612027Sjungma@eit.uni-kl.devoid 169712027Sjungma@eit.uni-kl.devcd_trace_file::do_initialize() 169812027Sjungma@eit.uni-kl.de{ 169912027Sjungma@eit.uni-kl.de char buf[2000]; 170012027Sjungma@eit.uni-kl.de 170112027Sjungma@eit.uni-kl.de //date: 170212027Sjungma@eit.uni-kl.de std::fprintf(fp, "$date\n %s\n$end\n\n", localtime_string().c_str() ); 170312027Sjungma@eit.uni-kl.de 170412027Sjungma@eit.uni-kl.de //version: 170512027Sjungma@eit.uni-kl.de std::fprintf(fp, "$version\n %s\n$end\n\n", sc_version()); 170612027Sjungma@eit.uni-kl.de 170712027Sjungma@eit.uni-kl.de //timescale: 170812027Sjungma@eit.uni-kl.de static struct SC_TIMESCALE_TO_TEXT { 170912027Sjungma@eit.uni-kl.de double unit; 171012027Sjungma@eit.uni-kl.de const char* text; 171112027Sjungma@eit.uni-kl.de } timescale_to_text [] = { 171212027Sjungma@eit.uni-kl.de { sc_time(1, SC_FS).to_seconds(), "1 fs" }, 171312027Sjungma@eit.uni-kl.de { sc_time(10, SC_FS).to_seconds(), "10 fs" }, 171412027Sjungma@eit.uni-kl.de { sc_time(100, SC_FS).to_seconds(),"100 fs" }, 171512027Sjungma@eit.uni-kl.de { sc_time(1, SC_PS).to_seconds(), "1 ps" }, 171612027Sjungma@eit.uni-kl.de { sc_time(10, SC_PS).to_seconds(), "10 ps" }, 171712027Sjungma@eit.uni-kl.de { sc_time(100, SC_PS).to_seconds(),"100 ps" }, 171812027Sjungma@eit.uni-kl.de { sc_time(1, SC_NS).to_seconds(), "1 ns" }, 171912027Sjungma@eit.uni-kl.de { sc_time(10, SC_NS).to_seconds(), "10 ns" }, 172012027Sjungma@eit.uni-kl.de { sc_time(100, SC_NS).to_seconds(),"100 ns" }, 172112027Sjungma@eit.uni-kl.de { sc_time(1, SC_US).to_seconds(), "1 us" }, 172212027Sjungma@eit.uni-kl.de { sc_time(10, SC_US).to_seconds(), "10 us" }, 172312027Sjungma@eit.uni-kl.de { sc_time(100, SC_US).to_seconds(),"100 us" }, 172412027Sjungma@eit.uni-kl.de { sc_time(1, SC_MS).to_seconds(), "1 ms" }, 172512027Sjungma@eit.uni-kl.de { sc_time(10, SC_MS).to_seconds(), "10 ms" }, 172612027Sjungma@eit.uni-kl.de { sc_time(100, SC_MS).to_seconds(),"100 ms" }, 172712027Sjungma@eit.uni-kl.de { sc_time(1, SC_SEC).to_seconds(), "1 sec" }, 172812027Sjungma@eit.uni-kl.de { sc_time(10, SC_SEC).to_seconds(), "10 sec" }, 172912027Sjungma@eit.uni-kl.de { sc_time(100, SC_SEC).to_seconds(),"100 sec" } 173012027Sjungma@eit.uni-kl.de }; 173112027Sjungma@eit.uni-kl.de static int timescale_to_text_n = 173212027Sjungma@eit.uni-kl.de sizeof(timescale_to_text)/sizeof(SC_TIMESCALE_TO_TEXT); 173312027Sjungma@eit.uni-kl.de 173412027Sjungma@eit.uni-kl.de for ( int time_i = 0; time_i < timescale_to_text_n; time_i++ ) 173512027Sjungma@eit.uni-kl.de { 173612027Sjungma@eit.uni-kl.de if (timescale_unit == timescale_to_text[time_i].unit) 173712027Sjungma@eit.uni-kl.de { 173812027Sjungma@eit.uni-kl.de std::fprintf(fp,"$timescale\n %s\n$end\n\n", 173912027Sjungma@eit.uni-kl.de timescale_to_text[time_i].text); 174012027Sjungma@eit.uni-kl.de break; 174112027Sjungma@eit.uni-kl.de } 174212027Sjungma@eit.uni-kl.de } 174312027Sjungma@eit.uni-kl.de 174412027Sjungma@eit.uni-kl.de // Create a dummy scope 174512027Sjungma@eit.uni-kl.de std::fputs("$scope module SystemC $end\n", fp); 174612027Sjungma@eit.uni-kl.de 174712027Sjungma@eit.uni-kl.de //variable definitions: 174812027Sjungma@eit.uni-kl.de for (int i = 0; i < (int)traces.size(); i++) { 174912027Sjungma@eit.uni-kl.de vcd_trace* t = traces[i]; 175012027Sjungma@eit.uni-kl.de t->set_width(); // needed for all vectors 175112027Sjungma@eit.uni-kl.de t->print_variable_declaration_line(fp); 175212027Sjungma@eit.uni-kl.de } 175312027Sjungma@eit.uni-kl.de 175412027Sjungma@eit.uni-kl.de std::fputs("$upscope $end\n", fp); 175512027Sjungma@eit.uni-kl.de 175612027Sjungma@eit.uni-kl.de std::fputs("$enddefinitions $end\n\n", fp); 175712027Sjungma@eit.uni-kl.de 175812027Sjungma@eit.uni-kl.de // double inittime = sc_simulation_time(); 175912027Sjungma@eit.uni-kl.de double inittime = sc_time_stamp().to_seconds(); 176012027Sjungma@eit.uni-kl.de 176112027Sjungma@eit.uni-kl.de std::sprintf(buf, 176212027Sjungma@eit.uni-kl.de "All initial values are dumped below at time " 176312027Sjungma@eit.uni-kl.de "%g sec = %g timescale units.", 176412027Sjungma@eit.uni-kl.de inittime, inittime/timescale_unit 176512027Sjungma@eit.uni-kl.de ); 176612027Sjungma@eit.uni-kl.de write_comment(buf); 176712027Sjungma@eit.uni-kl.de 176812027Sjungma@eit.uni-kl.de double_to_special_int64(inittime/timescale_unit, 176912027Sjungma@eit.uni-kl.de &previous_time_units_high, 177012027Sjungma@eit.uni-kl.de &previous_time_units_low ); 177112027Sjungma@eit.uni-kl.de 177212027Sjungma@eit.uni-kl.de 177312027Sjungma@eit.uni-kl.de std::fputs("$dumpvars\n",fp); 177412027Sjungma@eit.uni-kl.de for (int i = 0; i < (int)traces.size(); i++) { 177512027Sjungma@eit.uni-kl.de traces[i]->write(fp); 177612027Sjungma@eit.uni-kl.de std::fputc('\n', fp); 177712027Sjungma@eit.uni-kl.de } 177812027Sjungma@eit.uni-kl.de std::fputs("$end\n\n", fp); 177912027Sjungma@eit.uni-kl.de} 178012027Sjungma@eit.uni-kl.de 178112027Sjungma@eit.uni-kl.de 178212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 178312027Sjungma@eit.uni-kl.de 178412027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD(tp) \ 178512027Sjungma@eit.uni-kl.devoid \ 178612027Sjungma@eit.uni-kl.devcd_trace_file::trace(const tp& object_, const std::string& name_) \ 178712027Sjungma@eit.uni-kl.de{ \ 178812027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 178912027Sjungma@eit.uni-kl.de traces.push_back( new vcd_ ## tp ## _trace( object_, \ 179012027Sjungma@eit.uni-kl.de name_, \ 179112027Sjungma@eit.uni-kl.de obtain_name() ) ); \ 179212027Sjungma@eit.uni-kl.de} 179312027Sjungma@eit.uni-kl.de 179412027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(bool) 179512027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(float) 179612027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(double) 179712027Sjungma@eit.uni-kl.de 179812027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD 179912027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD(tp) \ 180012027Sjungma@eit.uni-kl.devoid \ 180112027Sjungma@eit.uni-kl.devcd_trace_file::trace(const sc_dt::tp& object_, const std::string& name_) \ 180212027Sjungma@eit.uni-kl.de{ \ 180312027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 180412027Sjungma@eit.uni-kl.de traces.push_back( new vcd_ ## tp ## _trace( object_, \ 180512027Sjungma@eit.uni-kl.de name_, \ 180612027Sjungma@eit.uni-kl.de obtain_name() ) ); \ 180712027Sjungma@eit.uni-kl.de} 180812027Sjungma@eit.uni-kl.de 180912027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_bit) 181012027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_logic) 181112027Sjungma@eit.uni-kl.de 181212027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_signed) 181312027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_unsigned) 181412027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_int_base) 181512027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_uint_base) 181612027Sjungma@eit.uni-kl.de 181712027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_fxval) 181812027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_fxval_fast) 181912027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_fxnum) 182012027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD(sc_fxnum_fast) 182112027Sjungma@eit.uni-kl.de 182212027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD 182312027Sjungma@eit.uni-kl.de 182412027Sjungma@eit.uni-kl.de 182512027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD_SIGNED(tp) \ 182612027Sjungma@eit.uni-kl.devoid \ 182712027Sjungma@eit.uni-kl.devcd_trace_file::trace( const tp& object_, \ 182812027Sjungma@eit.uni-kl.de const std::string& name_, \ 182912027Sjungma@eit.uni-kl.de int width_ ) \ 183012027Sjungma@eit.uni-kl.de{ \ 183112027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 183212027Sjungma@eit.uni-kl.de traces.push_back( new vcd_signed_ ## tp ## _trace( object_, \ 183312027Sjungma@eit.uni-kl.de name_, \ 183412027Sjungma@eit.uni-kl.de obtain_name(), \ 183512027Sjungma@eit.uni-kl.de width_ ) ); \ 183612027Sjungma@eit.uni-kl.de} 183712027Sjungma@eit.uni-kl.de 183812027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD_UNSIGNED(tp) \ 183912027Sjungma@eit.uni-kl.devoid \ 184012027Sjungma@eit.uni-kl.devcd_trace_file::trace( const unsigned tp& object_, \ 184112027Sjungma@eit.uni-kl.de const std::string& name_, \ 184212027Sjungma@eit.uni-kl.de int width_ ) \ 184312027Sjungma@eit.uni-kl.de{ \ 184412027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 184512027Sjungma@eit.uni-kl.de traces.push_back( new vcd_unsigned_ ## tp ## _trace( object_, \ 184612027Sjungma@eit.uni-kl.de name_, \ 184712027Sjungma@eit.uni-kl.de obtain_name(), \ 184812027Sjungma@eit.uni-kl.de width_ ) ); \ 184912027Sjungma@eit.uni-kl.de} 185012027Sjungma@eit.uni-kl.de 185112027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_SIGNED(char) 185212027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_SIGNED(short) 185312027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_SIGNED(int) 185412027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_SIGNED(long) 185512027Sjungma@eit.uni-kl.de 185612027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_UNSIGNED(char) 185712027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_UNSIGNED(short) 185812027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_UNSIGNED(int) 185912027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_UNSIGNED(long) 186012027Sjungma@eit.uni-kl.de 186112027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD_SIGNED 186212027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD_UNSIGNED 186312027Sjungma@eit.uni-kl.de 186412027Sjungma@eit.uni-kl.de#define DEFN_TRACE_METHOD_LONG_LONG(tp) \ 186512027Sjungma@eit.uni-kl.devoid \ 186612027Sjungma@eit.uni-kl.devcd_trace_file::trace( const sc_dt::tp& object_, \ 186712027Sjungma@eit.uni-kl.de const std::string& name_, \ 186812027Sjungma@eit.uni-kl.de int width_ ) \ 186912027Sjungma@eit.uni-kl.de{ \ 187012027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) \ 187112027Sjungma@eit.uni-kl.de traces.push_back( new vcd_ ## tp ## _trace( object_, \ 187212027Sjungma@eit.uni-kl.de name_, \ 187312027Sjungma@eit.uni-kl.de obtain_name(), \ 187412027Sjungma@eit.uni-kl.de width_ ) ); \ 187512027Sjungma@eit.uni-kl.de} 187612027Sjungma@eit.uni-kl.de 187712027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_LONG_LONG(int64) 187812027Sjungma@eit.uni-kl.deDEFN_TRACE_METHOD_LONG_LONG(uint64) 187912027Sjungma@eit.uni-kl.de 188012027Sjungma@eit.uni-kl.de#undef DEFN_TRACE_METHOD_LONG_LONG 188112027Sjungma@eit.uni-kl.de 188212027Sjungma@eit.uni-kl.devoid 188312027Sjungma@eit.uni-kl.devcd_trace_file::trace( const unsigned& object_, 188412027Sjungma@eit.uni-kl.de const std::string& name_, 188512027Sjungma@eit.uni-kl.de const char** enum_literals_ ) 188612027Sjungma@eit.uni-kl.de{ 188712027Sjungma@eit.uni-kl.de if( add_trace_check(name_) ) 188812027Sjungma@eit.uni-kl.de traces.push_back( new vcd_enum_trace( object_, 188912027Sjungma@eit.uni-kl.de name_, 189012027Sjungma@eit.uni-kl.de obtain_name(), 189112027Sjungma@eit.uni-kl.de enum_literals_ ) ); 189212027Sjungma@eit.uni-kl.de} 189312027Sjungma@eit.uni-kl.de 189412027Sjungma@eit.uni-kl.de 189512027Sjungma@eit.uni-kl.devoid 189612027Sjungma@eit.uni-kl.devcd_trace_file::write_comment(const std::string& comment) 189712027Sjungma@eit.uni-kl.de{ 189812027Sjungma@eit.uni-kl.de if(!fp) open_fp(); 189912027Sjungma@eit.uni-kl.de //no newline in comments allowed, as some viewers may crash 190012027Sjungma@eit.uni-kl.de std::fputs("$comment\n", fp); 190112027Sjungma@eit.uni-kl.de std::fputs(comment.c_str(), fp); 190212027Sjungma@eit.uni-kl.de std::fputs("\n$end\n\n", fp); 190312027Sjungma@eit.uni-kl.de} 190412027Sjungma@eit.uni-kl.de 190512027Sjungma@eit.uni-kl.devoid 190612027Sjungma@eit.uni-kl.devcd_trace_file::cycle(bool this_is_a_delta_cycle) 190712027Sjungma@eit.uni-kl.de{ 190812027Sjungma@eit.uni-kl.de unsigned this_time_units_high, this_time_units_low; 190912027Sjungma@eit.uni-kl.de 191012027Sjungma@eit.uni-kl.de // Just to make g++ shut up in the optimized mode 191112027Sjungma@eit.uni-kl.de this_time_units_high = this_time_units_low = 0; 191212027Sjungma@eit.uni-kl.de 191312027Sjungma@eit.uni-kl.de // Trace delta cycles only when enabled 191412027Sjungma@eit.uni-kl.de if (!delta_cycles() && this_is_a_delta_cycle) return; 191512027Sjungma@eit.uni-kl.de 191612027Sjungma@eit.uni-kl.de // Check for initialization 191712027Sjungma@eit.uni-kl.de if( initialize() ) { 191812027Sjungma@eit.uni-kl.de return; 191912027Sjungma@eit.uni-kl.de }; 192012027Sjungma@eit.uni-kl.de 192112027Sjungma@eit.uni-kl.de 192212027Sjungma@eit.uni-kl.de double now_units = sc_time_stamp().to_seconds() / timescale_unit; 192312027Sjungma@eit.uni-kl.de unsigned now_units_high, now_units_low; 192412027Sjungma@eit.uni-kl.de double_to_special_int64(now_units, &now_units_high, &now_units_low ); 192512027Sjungma@eit.uni-kl.de 192612027Sjungma@eit.uni-kl.de bool now_later_than_previous_time = false; 192712027Sjungma@eit.uni-kl.de if( (now_units_low > previous_time_units_low 192812027Sjungma@eit.uni-kl.de && now_units_high == previous_time_units_high) 192912027Sjungma@eit.uni-kl.de || now_units_high > previous_time_units_high){ 193012027Sjungma@eit.uni-kl.de now_later_than_previous_time = true; 193112027Sjungma@eit.uni-kl.de } 193212027Sjungma@eit.uni-kl.de 193312027Sjungma@eit.uni-kl.de bool now_equals_previous_time = false; 193412027Sjungma@eit.uni-kl.de if(now_later_than_previous_time){ 193512027Sjungma@eit.uni-kl.de this_time_units_high = now_units_high; 193612027Sjungma@eit.uni-kl.de this_time_units_low = now_units_low; 193712027Sjungma@eit.uni-kl.de } else { 193812027Sjungma@eit.uni-kl.de if( now_units_low == previous_time_units_low 193912027Sjungma@eit.uni-kl.de && now_units_high == previous_time_units_high){ 194012027Sjungma@eit.uni-kl.de now_equals_previous_time = true; 194112027Sjungma@eit.uni-kl.de this_time_units_high = now_units_high; 194212027Sjungma@eit.uni-kl.de this_time_units_low = now_units_low; 194312027Sjungma@eit.uni-kl.de } 194412027Sjungma@eit.uni-kl.de } 194512027Sjungma@eit.uni-kl.de 194612027Sjungma@eit.uni-kl.de // Since VCD does not understand 0 time progression, we have to fake 194712027Sjungma@eit.uni-kl.de // delta cycles with progressing time by one unit 194812027Sjungma@eit.uni-kl.de if(this_is_a_delta_cycle){ 194912027Sjungma@eit.uni-kl.de this_time_units_high = previous_time_units_high; 195012027Sjungma@eit.uni-kl.de this_time_units_low = previous_time_units_low + 1; 195112027Sjungma@eit.uni-kl.de if(this_time_units_low == 1000000000){ 195212027Sjungma@eit.uni-kl.de this_time_units_high++; 195312027Sjungma@eit.uni-kl.de this_time_units_low=0; 195412027Sjungma@eit.uni-kl.de } 195512027Sjungma@eit.uni-kl.de static bool warned = false; 195612027Sjungma@eit.uni-kl.de if(!warned){ 195712027Sjungma@eit.uni-kl.de SC_REPORT_INFO( SC_ID_TRACING_VCD_DELTA_CYCLE_ 195812027Sjungma@eit.uni-kl.de , sc_time( timescale_unit, SC_SEC ) 195912027Sjungma@eit.uni-kl.de .to_string().c_str() ); 196012027Sjungma@eit.uni-kl.de warned = true; 196112027Sjungma@eit.uni-kl.de } 196212027Sjungma@eit.uni-kl.de } 196312027Sjungma@eit.uni-kl.de 196412027Sjungma@eit.uni-kl.de 196512027Sjungma@eit.uni-kl.de // Not a delta cycle and time has not progressed 196612027Sjungma@eit.uni-kl.de if( ! this_is_a_delta_cycle && now_equals_previous_time && 196712027Sjungma@eit.uni-kl.de ( now_units_high != 0 || now_units_low != 0 ) ) { 196812027Sjungma@eit.uni-kl.de // Don't print the message at time zero 196912027Sjungma@eit.uni-kl.de static bool warned = false; 197012027Sjungma@eit.uni-kl.de if( ! warned ) { 197112027Sjungma@eit.uni-kl.de std::stringstream ss; 197212027Sjungma@eit.uni-kl.de ss << "units count: " << now_units_low << "\n" 197312027Sjungma@eit.uni-kl.de "\tWaveform viewers will only show the states of the last one.\n" 197412027Sjungma@eit.uni-kl.de "\tUse `tracefile->set_time_unit(double, sc_time_unit);'" 197512027Sjungma@eit.uni-kl.de " to increase the time resolution."; 197612027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_TRACING_VCD_DUPLICATE_TIME_ 197712027Sjungma@eit.uni-kl.de , ss.str().c_str() ); 197812027Sjungma@eit.uni-kl.de // warned = true; 197912027Sjungma@eit.uni-kl.de } 198012027Sjungma@eit.uni-kl.de } 198112027Sjungma@eit.uni-kl.de 198212027Sjungma@eit.uni-kl.de // Not a delta cycle and time has gone backward 198312027Sjungma@eit.uni-kl.de // This will happen with large number of delta cycles between two real 198412027Sjungma@eit.uni-kl.de // advances of time 198512027Sjungma@eit.uni-kl.de if(!this_is_a_delta_cycle && !now_equals_previous_time && 198612027Sjungma@eit.uni-kl.de !now_later_than_previous_time){ 198712027Sjungma@eit.uni-kl.de static bool warned = false; 198812027Sjungma@eit.uni-kl.de if(!warned) { 198912027Sjungma@eit.uni-kl.de std::stringstream ss; 199012027Sjungma@eit.uni-kl.de ss << "units count (" 199112027Sjungma@eit.uni-kl.de << previous_time_units_low << "->" << now_units_low << ")\n" 199212027Sjungma@eit.uni-kl.de "\tThis can occur when delta cycling is activated." 199312027Sjungma@eit.uni-kl.de " Cycles with falling time are not shown.\n" 199412027Sjungma@eit.uni-kl.de "\tUse `tracefile->set_time_unit(double, sc_time_unit);'" 199512027Sjungma@eit.uni-kl.de " to increase the time resolution."; 199612027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_TRACING_VCD_DUPLICATE_TIME_ 199712027Sjungma@eit.uni-kl.de , ss.str().c_str() ); 199812027Sjungma@eit.uni-kl.de // warned = true; 199912027Sjungma@eit.uni-kl.de } 200012027Sjungma@eit.uni-kl.de // Note that we don't set this_time_units_high/low to any value only 200112027Sjungma@eit.uni-kl.de // in this case because we are not going to do any tracing. In the 200212027Sjungma@eit.uni-kl.de // optimized mode, the compiler complains because of this. Therefore, 200312027Sjungma@eit.uni-kl.de // we include the lines at the very beginning of this function to make 200412027Sjungma@eit.uni-kl.de // the compiler shut up. 200512027Sjungma@eit.uni-kl.de return; 200612027Sjungma@eit.uni-kl.de } 200712027Sjungma@eit.uni-kl.de 200812027Sjungma@eit.uni-kl.de // Now do the actual printing 200912027Sjungma@eit.uni-kl.de bool time_printed = false; 201012027Sjungma@eit.uni-kl.de vcd_trace* const* const l_traces = &traces[0]; 201112027Sjungma@eit.uni-kl.de for (int i = 0; i < (int)traces.size(); i++) { 201212027Sjungma@eit.uni-kl.de vcd_trace* t = l_traces[i]; 201312027Sjungma@eit.uni-kl.de if(t->changed()){ 201412027Sjungma@eit.uni-kl.de if(time_printed == false){ 201512027Sjungma@eit.uni-kl.de char buf[200]; 201612027Sjungma@eit.uni-kl.de if(this_time_units_high){ 201712027Sjungma@eit.uni-kl.de std::sprintf(buf, "#%u%09u", this_time_units_high, this_time_units_low); 201812027Sjungma@eit.uni-kl.de } 201912027Sjungma@eit.uni-kl.de else{ 202012027Sjungma@eit.uni-kl.de std::sprintf(buf, "#%u", this_time_units_low); 202112027Sjungma@eit.uni-kl.de } 202212027Sjungma@eit.uni-kl.de std::fputs(buf, fp); 202312027Sjungma@eit.uni-kl.de std::fputc('\n', fp); 202412027Sjungma@eit.uni-kl.de time_printed = true; 202512027Sjungma@eit.uni-kl.de } 202612027Sjungma@eit.uni-kl.de 202712027Sjungma@eit.uni-kl.de // Write the variable 202812027Sjungma@eit.uni-kl.de t->write(fp); 202912027Sjungma@eit.uni-kl.de std::fputc('\n', fp); 203012027Sjungma@eit.uni-kl.de } 203112027Sjungma@eit.uni-kl.de } 203212027Sjungma@eit.uni-kl.de // Put another newline after all values are printed 203312027Sjungma@eit.uni-kl.de if(time_printed) std::fputc('\n', fp); 203412027Sjungma@eit.uni-kl.de 203512027Sjungma@eit.uni-kl.de if(time_printed){ 203612027Sjungma@eit.uni-kl.de // We update previous_time_units only when we print time because 203712027Sjungma@eit.uni-kl.de // this field stores the previous time that was printed, not the 203812027Sjungma@eit.uni-kl.de // previous time this function was called 203912027Sjungma@eit.uni-kl.de previous_time_units_high = this_time_units_high; 204012027Sjungma@eit.uni-kl.de previous_time_units_low = this_time_units_low; 204112027Sjungma@eit.uni-kl.de } 204212027Sjungma@eit.uni-kl.de} 204312027Sjungma@eit.uni-kl.de 204412027Sjungma@eit.uni-kl.de#if 0 204512027Sjungma@eit.uni-kl.devoid 204612027Sjungma@eit.uni-kl.devcd_trace_file::create_vcd_name(std::string* p_destination) 204712027Sjungma@eit.uni-kl.de{ 204812027Sjungma@eit.uni-kl.de obtain_name.swap( *p_destination ); 204912027Sjungma@eit.uni-kl.de} 205012027Sjungma@eit.uni-kl.de#endif 205112027Sjungma@eit.uni-kl.de 205212027Sjungma@eit.uni-kl.de// Create a VCD name for a variable 205312027Sjungma@eit.uni-kl.destd::string 205412027Sjungma@eit.uni-kl.devcd_trace_file::obtain_name() 205512027Sjungma@eit.uni-kl.de{ 205612027Sjungma@eit.uni-kl.de const char first_type_used = 'a'; 205712027Sjungma@eit.uni-kl.de const int used_types_count = 'z' - 'a' + 1; 205812027Sjungma@eit.uni-kl.de int result; 205912027Sjungma@eit.uni-kl.de 206012027Sjungma@eit.uni-kl.de result = vcd_name_index; 206112027Sjungma@eit.uni-kl.de char char6 = (char)(vcd_name_index % used_types_count); 206212027Sjungma@eit.uni-kl.de 206312027Sjungma@eit.uni-kl.de result = result / used_types_count; 206412027Sjungma@eit.uni-kl.de char char5 = (char)(result % used_types_count); 206512027Sjungma@eit.uni-kl.de 206612027Sjungma@eit.uni-kl.de result = result / used_types_count; 206712027Sjungma@eit.uni-kl.de char char4 = (char)(result % used_types_count); 206812027Sjungma@eit.uni-kl.de 206912027Sjungma@eit.uni-kl.de result = result / used_types_count; 207012027Sjungma@eit.uni-kl.de char char3 = (char)(result % used_types_count); 207112027Sjungma@eit.uni-kl.de 207212027Sjungma@eit.uni-kl.de result = result / used_types_count; 207312027Sjungma@eit.uni-kl.de char char2 = (char)(result % used_types_count); 207412027Sjungma@eit.uni-kl.de 207512027Sjungma@eit.uni-kl.de char buf[20]; 207612027Sjungma@eit.uni-kl.de std::sprintf(buf, "%c%c%c%c%c", 207712027Sjungma@eit.uni-kl.de char2 + first_type_used, 207812027Sjungma@eit.uni-kl.de char3 + first_type_used, 207912027Sjungma@eit.uni-kl.de char4 + first_type_used, 208012027Sjungma@eit.uni-kl.de char5 + first_type_used, 208112027Sjungma@eit.uni-kl.de char6 + first_type_used); 208212027Sjungma@eit.uni-kl.de vcd_name_index++; 208312027Sjungma@eit.uni-kl.de return std::string(buf); 208412027Sjungma@eit.uni-kl.de} 208512027Sjungma@eit.uni-kl.de 208612027Sjungma@eit.uni-kl.devcd_trace_file::~vcd_trace_file() 208712027Sjungma@eit.uni-kl.de{ 208812027Sjungma@eit.uni-kl.de for( int i = 0; i < (int)traces.size(); i++ ) { 208912027Sjungma@eit.uni-kl.de vcd_trace* t = traces[i]; 209012027Sjungma@eit.uni-kl.de delete t; 209112027Sjungma@eit.uni-kl.de } 209212027Sjungma@eit.uni-kl.de} 209312027Sjungma@eit.uni-kl.de 209412027Sjungma@eit.uni-kl.de 209512027Sjungma@eit.uni-kl.de// Functions specific to VCD tracing 209612027Sjungma@eit.uni-kl.de 209712027Sjungma@eit.uni-kl.destatic char 209812027Sjungma@eit.uni-kl.demap_sc_logic_state_to_vcd_state(char in_char) 209912027Sjungma@eit.uni-kl.de{ 210012027Sjungma@eit.uni-kl.de char out_char; 210112027Sjungma@eit.uni-kl.de 210212027Sjungma@eit.uni-kl.de switch(in_char){ 210312027Sjungma@eit.uni-kl.de case 'U': 210412027Sjungma@eit.uni-kl.de case 'X': 210512027Sjungma@eit.uni-kl.de case 'W': 210612027Sjungma@eit.uni-kl.de case 'D': 210712027Sjungma@eit.uni-kl.de out_char = 'x'; 210812027Sjungma@eit.uni-kl.de break; 210912027Sjungma@eit.uni-kl.de case '0': 211012027Sjungma@eit.uni-kl.de case 'L': 211112027Sjungma@eit.uni-kl.de out_char = '0'; 211212027Sjungma@eit.uni-kl.de break; 211312027Sjungma@eit.uni-kl.de case '1': 211412027Sjungma@eit.uni-kl.de case 'H': 211512027Sjungma@eit.uni-kl.de out_char = '1'; 211612027Sjungma@eit.uni-kl.de break; 211712027Sjungma@eit.uni-kl.de case 'Z': 211812027Sjungma@eit.uni-kl.de out_char = 'z'; 211912027Sjungma@eit.uni-kl.de break; 212012027Sjungma@eit.uni-kl.de default: 212112027Sjungma@eit.uni-kl.de out_char = '?'; 212212027Sjungma@eit.uni-kl.de } 212312027Sjungma@eit.uni-kl.de 212412027Sjungma@eit.uni-kl.de return out_char; 212512027Sjungma@eit.uni-kl.de} 212612027Sjungma@eit.uni-kl.de 212712027Sjungma@eit.uni-kl.de 212812027Sjungma@eit.uni-kl.de 212912027Sjungma@eit.uni-kl.de 213012027Sjungma@eit.uni-kl.destatic 213112027Sjungma@eit.uni-kl.devoid 213212027Sjungma@eit.uni-kl.deremove_vcd_name_problems(vcd_trace const* vcd, std::string& name) 213312027Sjungma@eit.uni-kl.de{ 213412027Sjungma@eit.uni-kl.de static bool warned = false; 213512027Sjungma@eit.uni-kl.de bool braces_removed = false; 213612027Sjungma@eit.uni-kl.de for (unsigned int i = 0; i< name.length(); i++) { 213712027Sjungma@eit.uni-kl.de if (name[i] == '[') { 213812027Sjungma@eit.uni-kl.de name[i] = '('; 213912027Sjungma@eit.uni-kl.de braces_removed = true; 214012027Sjungma@eit.uni-kl.de } 214112027Sjungma@eit.uni-kl.de else if (name[i] == ']') { 214212027Sjungma@eit.uni-kl.de name[i] = ')'; 214312027Sjungma@eit.uni-kl.de braces_removed = true; 214412027Sjungma@eit.uni-kl.de } 214512027Sjungma@eit.uni-kl.de } 214612027Sjungma@eit.uni-kl.de 214712027Sjungma@eit.uni-kl.de if(braces_removed && !warned){ 214812027Sjungma@eit.uni-kl.de std::stringstream ss; 214912027Sjungma@eit.uni-kl.de ss << vcd->name << ":\n" 215012027Sjungma@eit.uni-kl.de "\tTraced objects found with name containing [], which may be\n" 215112027Sjungma@eit.uni-kl.de "\tinterpreted by the waveform viewer in unexpected ways.\n" 215212027Sjungma@eit.uni-kl.de "\tSo the [] is automatically replaced by ()."; 215312027Sjungma@eit.uni-kl.de 215412027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_TRACING_OBJECT_NAME_FILTERED_ 215512027Sjungma@eit.uni-kl.de , ss.str().c_str() ); 215612027Sjungma@eit.uni-kl.de } 215712027Sjungma@eit.uni-kl.de} 215812027Sjungma@eit.uni-kl.de 215912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 216012027Sjungma@eit.uni-kl.de 216112027Sjungma@eit.uni-kl.desc_trace_file* 216212027Sjungma@eit.uni-kl.desc_create_vcd_trace_file(const char * name) 216312027Sjungma@eit.uni-kl.de{ 216412027Sjungma@eit.uni-kl.de sc_trace_file * tf = new vcd_trace_file(name); 216512027Sjungma@eit.uni-kl.de return tf; 216612027Sjungma@eit.uni-kl.de} 216712027Sjungma@eit.uni-kl.de 216812027Sjungma@eit.uni-kl.devoid 216912027Sjungma@eit.uni-kl.desc_close_vcd_trace_file( sc_trace_file* tf ) 217012027Sjungma@eit.uni-kl.de{ 217112027Sjungma@eit.uni-kl.de vcd_trace_file* vcd_tf = static_cast<vcd_trace_file*>(tf); 217212027Sjungma@eit.uni-kl.de delete vcd_tf; 217312027Sjungma@eit.uni-kl.de} 217412027Sjungma@eit.uni-kl.de 217512027Sjungma@eit.uni-kl.de} // namespace sc_core 2176