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