/*
 * 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_SIMPLE_OBJECT_PRINTER_HH__
#define __SYSTEMC_SIMPLE_OBJECT_PRINTER_HH__

#include <string>

// This include brings in the gem5 statistics classes and DPRINTF mechanism
// which is not necessary, but shows that if they're gem5 aware, models can
// take advantage of these sorts of gem5 mechanisms.
#include "base/statistics.hh"
#include "base/trace.hh"

// Include the standard top level "systemc" header. For models which aren't
// aware of gem5, systemc/ext would be in their include path directly and the
// include wouldn't need the systemc/ext prefix.
#include "systemc/ext/systemc"

// This class is a garden variety sc_module, except that it uses DPRINTFN in
// one of its methods, and maintains a gem5 statistic.
class Printer : public sc_core::sc_module
{
  public:
    sc_core::sc_in<const char *> input;
    std::string prefix;

    SC_CTOR(Printer)
    {
        SC_THREAD(print);
    }

    void
    print()
    {
        int i = 0;
        while (true) {
            wait(input.value_changed_event());

            // DPRINTFN works as expected here because sc_objects have a name()
            // method which DPRINTFN relies on. Normally name() would come from
            // a SimObject whose members were in scope, but it doesn't have to.
            DPRINTFN("Word %d: %s%s\n", i++, prefix, input.read());

            // Manage the gem5 statistic like normal.
            numWords++;
        }
    }

    Stats::Scalar numWords;

    // Gem5 statistics should be set up during the "end_of_elabortion"
    // callback.
    void
    end_of_elaboration() override
    {
        numWords
            .name(std::string(name()) + ".numWords")
            .desc("number of words printed")
            ;
    }
};

#endif // __SYSTEMC_SIMPLE_OBJECT_PRINTER_HH__
