module.hh revision 13035:bafbdba2352a
112837Sgabeblack@google.com/* 212837Sgabeblack@google.com * Copyright 2018 Google, Inc. 312837Sgabeblack@google.com * 412837Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 512837Sgabeblack@google.com * modification, are permitted provided that the following conditions are 612837Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 712837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 812837Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 912837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1012837Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1112837Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1212837Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1312837Sgabeblack@google.com * this software without specific prior written permission. 1412837Sgabeblack@google.com * 1512837Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1612837Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1712837Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1812837Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1912837Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2012837Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2112837Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2212837Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2312837Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2412837Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2512837Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2612837Sgabeblack@google.com * 2712837Sgabeblack@google.com * Authors: Gabe Black 2812837Sgabeblack@google.com */ 2912837Sgabeblack@google.com 3012901Sgabeblack@google.com#ifndef __SYSTEMC_CORE_MODULE_HH__ 3113135Sgabeblack@google.com#define __SYSTEMC_CORE_MODULE_HH__ 3212901Sgabeblack@google.com 3312901Sgabeblack@google.com#include <cassert> 3412837Sgabeblack@google.com#include <map> 3512982Sgabeblack@google.com#include <set> 3612951Sgabeblack@google.com#include <sstream> 3712953Sgabeblack@google.com#include <string> 3812837Sgabeblack@google.com 3912951Sgabeblack@google.com#include "systemc/core/object.hh" 4013135Sgabeblack@google.com#include "systemc/ext/core/sc_module.hh" 4112837Sgabeblack@google.com 4212952Sgabeblack@google.comnamespace sc_gem5 4312952Sgabeblack@google.com{ 4412952Sgabeblack@google.com 4512952Sgabeblack@google.comclass UniqueNameGen 4612952Sgabeblack@google.com{ 4712952Sgabeblack@google.com private: 4813135Sgabeblack@google.com std::map<std::string, int> counts; 4913135Sgabeblack@google.com std::string buf; 5013135Sgabeblack@google.com 5113135Sgabeblack@google.com public: 5213135Sgabeblack@google.com const char * 5313135Sgabeblack@google.com gen(std::string seed) 5413135Sgabeblack@google.com { 5513135Sgabeblack@google.com std::ostringstream os; 5612993Sgabeblack@google.com os << seed << "_" << counts[seed]++; 5712993Sgabeblack@google.com buf = os.str(); 5812952Sgabeblack@google.com return buf.c_str(); 5912952Sgabeblack@google.com } 6012952Sgabeblack@google.com}; 6112952Sgabeblack@google.com 6212952Sgabeblack@google.comclass Module 6313135Sgabeblack@google.com{ 6413135Sgabeblack@google.com private: 6513135Sgabeblack@google.com const char *_name; 6613135Sgabeblack@google.com sc_core::sc_module *_sc_mod; 6713135Sgabeblack@google.com Object *_obj; 6813135Sgabeblack@google.com 6913135Sgabeblack@google.com UniqueNameGen nameGen; 7013135Sgabeblack@google.com 7112993Sgabeblack@google.com public: 7212993Sgabeblack@google.com 7312952Sgabeblack@google.com Module(const char *name); 7412952Sgabeblack@google.com ~Module(); 7512952Sgabeblack@google.com 7612952Sgabeblack@google.com void finish(Object *this_obj); 7712952Sgabeblack@google.com 7813135Sgabeblack@google.com const char *name() const { return _name; } 7913135Sgabeblack@google.com 8013135Sgabeblack@google.com sc_core::sc_module * 8113135Sgabeblack@google.com sc_mod() const 8213135Sgabeblack@google.com { 8313135Sgabeblack@google.com assert(_sc_mod); 8413135Sgabeblack@google.com return _sc_mod; 8513135Sgabeblack@google.com } 8612993Sgabeblack@google.com 8713060Sgabeblack@google.com void 8812993Sgabeblack@google.com sc_mod(sc_core::sc_module *sc_mod) 8912952Sgabeblack@google.com { 9012952Sgabeblack@google.com assert(!_sc_mod); 9113035Sgabeblack@google.com _sc_mod = sc_mod; 9213035Sgabeblack@google.com } 9312952Sgabeblack@google.com 9412952Sgabeblack@google.com Object * 9512837Sgabeblack@google.com obj() 9612837Sgabeblack@google.com { 9712837Sgabeblack@google.com assert(_obj); 9813091Sgabeblack@google.com return _obj; 9912951Sgabeblack@google.com } 10012951Sgabeblack@google.com 10112837Sgabeblack@google.com void pop(); 10213091Sgabeblack@google.com 10312951Sgabeblack@google.com const char *uniqueName(const char *seed) { return nameGen.gen(seed); } 10412951Sgabeblack@google.com}; 10512837Sgabeblack@google.com 10613091Sgabeblack@google.comModule *currentModule(); 10712837Sgabeblack@google.comModule *newModule(); 10812982Sgabeblack@google.com 10912837Sgabeblack@google.comextern std::set<Module *> allModules; 11013091Sgabeblack@google.com 11112837Sgabeblack@google.com} // namespace sc_gem5 11212837Sgabeblack@google.com 11312837Sgabeblack@google.com#endif //__SYSTEMC_CORE_MODULE_HH__ 11412837Sgabeblack@google.com