113373Sgabeblack@google.com/* 213373Sgabeblack@google.com * Copyright 2018 Google, Inc. 313373Sgabeblack@google.com * 413373Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 513373Sgabeblack@google.com * modification, are permitted provided that the following conditions are 613373Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 713373Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 813373Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 913373Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1013373Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1113373Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1213373Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1313373Sgabeblack@google.com * this software without specific prior written permission. 1413373Sgabeblack@google.com * 1513373Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1613373Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1713373Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1813373Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1913373Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2013373Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2113373Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2213373Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2313373Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2413373Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2513373Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2613373Sgabeblack@google.com * 2713373Sgabeblack@google.com * Authors: Gabe Black 2813373Sgabeblack@google.com */ 2913373Sgabeblack@google.com 3013373Sgabeblack@google.com#ifndef __SYSTEMC_SIMPLE_OBJECT_PRINTER_HH__ 3113373Sgabeblack@google.com#define __SYSTEMC_SIMPLE_OBJECT_PRINTER_HH__ 3213373Sgabeblack@google.com 3313373Sgabeblack@google.com#include <string> 3413373Sgabeblack@google.com 3513373Sgabeblack@google.com// This include brings in the gem5 statistics classes and DPRINTF mechanism 3613373Sgabeblack@google.com// which is not necessary, but shows that if they're gem5 aware, models can 3713373Sgabeblack@google.com// take advantage of these sorts of gem5 mechanisms. 3813373Sgabeblack@google.com#include "base/statistics.hh" 3913373Sgabeblack@google.com#include "base/trace.hh" 4013373Sgabeblack@google.com 4113373Sgabeblack@google.com// Include the standard top level "systemc" header. For models which aren't 4213373Sgabeblack@google.com// aware of gem5, systemc/ext would be in their include path directly and the 4313373Sgabeblack@google.com// include wouldn't need the systemc/ext prefix. 4413373Sgabeblack@google.com#include "systemc/ext/systemc" 4513373Sgabeblack@google.com 4613373Sgabeblack@google.com// This class is a garden variety sc_module, except that it uses DPRINTFN in 4713373Sgabeblack@google.com// one of its methods, and maintains a gem5 statistic. 4813373Sgabeblack@google.comclass Printer : public sc_core::sc_module 4913373Sgabeblack@google.com{ 5013373Sgabeblack@google.com public: 5113373Sgabeblack@google.com sc_core::sc_in<const char *> input; 5213373Sgabeblack@google.com std::string prefix; 5313373Sgabeblack@google.com 5413373Sgabeblack@google.com SC_CTOR(Printer) 5513373Sgabeblack@google.com { 5613373Sgabeblack@google.com SC_THREAD(print); 5713373Sgabeblack@google.com } 5813373Sgabeblack@google.com 5913373Sgabeblack@google.com void 6013373Sgabeblack@google.com print() 6113373Sgabeblack@google.com { 6213373Sgabeblack@google.com int i = 0; 6313373Sgabeblack@google.com while (true) { 6413373Sgabeblack@google.com wait(input.value_changed_event()); 6513373Sgabeblack@google.com 6613373Sgabeblack@google.com // DPRINTFN works as expected here because sc_objects have a name() 6713373Sgabeblack@google.com // method which DPRINTFN relies on. Normally name() would come from 6813373Sgabeblack@google.com // a SimObject whose members were in scope, but it doesn't have to. 6913373Sgabeblack@google.com DPRINTFN("Word %d: %s%s\n", i++, prefix, input.read()); 7013373Sgabeblack@google.com 7113373Sgabeblack@google.com // Manage the gem5 statistic like normal. 7213373Sgabeblack@google.com numWords++; 7313373Sgabeblack@google.com } 7413373Sgabeblack@google.com } 7513373Sgabeblack@google.com 7613373Sgabeblack@google.com Stats::Scalar numWords; 7713373Sgabeblack@google.com 7813373Sgabeblack@google.com // Gem5 statistics should be set up during the "end_of_elabortion" 7913373Sgabeblack@google.com // callback. 8013373Sgabeblack@google.com void 8113373Sgabeblack@google.com end_of_elaboration() override 8213373Sgabeblack@google.com { 8313373Sgabeblack@google.com numWords 8413373Sgabeblack@google.com .name(std::string(name()) + ".numWords") 8513373Sgabeblack@google.com .desc("number of words printed") 8613373Sgabeblack@google.com ; 8713373Sgabeblack@google.com } 8813373Sgabeblack@google.com}; 8913373Sgabeblack@google.com 9013373Sgabeblack@google.com#endif // __SYSTEMC_SIMPLE_OBJECT_PRINTER_HH__ 91