/*
 * Copyright 2018 Google, Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Authors: Gabe Black
 */

#ifndef __SYSTEMC_UTILS_VCD_HH__
#define __SYSTEMC_UTILS_VCD_HH__

#include <map>

#include "systemc/utils/tracefile.hh"

namespace sc_gem5
{

class VcdTraceValBase;

class VcdTraceScope
{
  private:
    std::vector<std::pair<std::string, VcdTraceValBase *>> values;
    std::map<std::string, VcdTraceScope *> scopes;

  public:
    void addValue(const std::string &name, VcdTraceValBase *value);
    void output(const std::string &name, std::ostream &os);
};

class VcdTraceFile : public TraceFile
{
  private:
    Tick lastPrintedTime;
    uint64_t deltasAtNow;

    static const int NextNameChars = 5;
    char _nextName[NextNameChars + 1];
    std::string nextSignalName();

    bool initialized;
    void initialize();

    std::vector<VcdTraceValBase *> traceVals;
    VcdTraceScope topScope;

  public:
    VcdTraceFile(const std::string &name) :
        TraceFile(name + ".vcd"), lastPrintedTime(0), deltasAtNow(0),
        initialized(false)
    {
        _nextName[NextNameChars] = '\0';
        for (int i = 0; i < NextNameChars; i++)
            _nextName[i] = 'a';
    }
    ~VcdTraceFile();

    void trace(bool delta) override;

    template<typename TV>
    void
    addNewTraceVal(const typename TV::TracedType *v, const std::string &name,
                   int width=1)
    {
        VcdTraceValBase *tv = new TV(v, nextSignalName(), width);
        traceVals.push_back(tv);
        topScope.addValue(name, tv);
    }

    void addTraceVal(const bool *v, const std::string &name) override;
    void addTraceVal(const float *v, const std::string &name) override;
    void addTraceVal(const double *v, const std::string &name) override;

    void addTraceVal(const sc_dt::sc_logic *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_int_base *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_uint_base *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_signed *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_unsigned *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_bv_base *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_lv_base *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_fxval *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_fxval_fast *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_fxnum *v,
                     const std::string &name) override;
    void addTraceVal(const sc_dt::sc_fxnum_fast *v,
                     const std::string &name) override;

    void addTraceVal(const sc_core::sc_event *v,
                     const std::string &name) override;
    void addTraceVal(const sc_core::sc_time *v,
                     const std::string &name) override;

    void addTraceVal(const unsigned char *v,
                     const std::string &name, int width) override;
    void addTraceVal(const char *v, const std::string &name,
                     int width) override;
    void addTraceVal(const unsigned short *v,
                     const std::string &name, int width) override;
    void addTraceVal(const short *v, const std::string &name,
                     int width) override;
    void addTraceVal(const unsigned int *v,
                     const std::string &name, int width) override;
    void addTraceVal(const int *v, const std::string &name,
                     int width) override;
    void addTraceVal(const unsigned long *v,
                     const std::string &name, int width) override;
    void addTraceVal(const long *v, const std::string &name,
                     int width) override;

    void addTraceVal(const sc_dt::int64 *v,
                     const std::string &name, int width) override;
    void addTraceVal(const sc_dt::uint64 *v,
                     const std::string &name, int width) override;

    void addTraceVal(const unsigned int *, const std::string &name,
                     const char **literals) override;

    void writeComment(const std::string &comment) override;
};

} // namespace sc_gem5

#endif // __SYSTEMC_UTILS_VCD_HH__
