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