object.cc revision 13126
12SN/A/* 21762SN/A * Copyright 2018 Google, Inc. 32SN/A * 42SN/A * Redistribution and use in source and binary forms, with or without 52SN/A * modification, are permitted provided that the following conditions are 62SN/A * met: redistributions of source code must retain the above copyright 72SN/A * notice, this list of conditions and the following disclaimer; 82SN/A * redistributions in binary form must reproduce the above copyright 92SN/A * notice, this list of conditions and the following disclaimer in the 102SN/A * documentation and/or other materials provided with the distribution; 112SN/A * neither the name of the copyright holders nor the names of its 122SN/A * contributors may be used to endorse or promote products derived from 132SN/A * this software without specific prior written permission. 142SN/A * 152SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262SN/A * 272665SN/A * Authors: Gabe Black 282665SN/A */ 292665SN/A 302665SN/A#include "systemc/core/object.hh" 312665SN/A 322SN/A#include <algorithm> 332SN/A 341722SN/A#include "base/logging.hh" 355480Snate@binkert.org#include "systemc/core/module.hh" 362SN/A#include "systemc/core/scheduler.hh" 372SN/A 3811793Sbrandon.potter@amd.comnamespace sc_gem5 3911793Sbrandon.potter@amd.com{ 40146SN/A 412SN/Anamespace 422SN/A{ 432158SN/A 44146SN/AObjectsIt 451805SN/AfindObjectIn(Objects &objects, const std::string &name) 46146SN/A{ 471717SN/A ObjectsIt it; 482680SN/A for (it = objects.begin(); it != objects.end(); it++) 498232Snate@binkert.org if (!strcmp((*it)->name(), name.c_str())) 508741Sgblack@eecs.umich.edu break; 518741Sgblack@eecs.umich.edu 528741Sgblack@eecs.umich.edu return it; 532521SN/A} 5411264Sandreas.sandberg@arm.com 555478SN/Avoid 563348SN/AaddObject(Objects *objects, sc_core::sc_object *object) 573348SN/A{ 582521SN/A objects->emplace(objects->end(), object); 595480Snate@binkert.org} 601805SN/A 612SN/Avoid 622SN/ApopObject(Objects *objects, const std::string &name) 632107SN/A{ 642SN/A ObjectsIt it = findObjectIn(*objects, name); 655480Snate@binkert.org assert(it != objects->end()); 669808Sstever@gmail.com std::swap(objects->back(), *it); 679808Sstever@gmail.com objects->pop_back(); 688806Sgblack@eecs.umich.edu} 692SN/A 702521SN/A} // anonymous namespace 712521SN/A 722SN/AObject::Object(sc_core::sc_object *_sc_obj) : Object(_sc_obj, "object") {} 732SN/A 742SN/AObject::Object(sc_core::sc_object *_sc_obj, const char *obj_name) : 75926SN/A _sc_obj(_sc_obj), _basename(obj_name ? obj_name : ""), parent(nullptr) 76926SN/A{ 77926SN/A if (_basename == "") 78926SN/A _basename = "object"; 79926SN/A 80926SN/A Module *p = currentModule(); 81926SN/A if (!p) 824395SN/A p = callbackModule(); 831805SN/A 842SN/A Module *n = newModule(); 852SN/A if (n) { 861634SN/A // We are a module in the process of being constructed. 875480Snate@binkert.org n->finish(this); 881634SN/A } 892549SN/A 905714Shsul@eecs.umich.edu if (p) { 911634SN/A // We're "within" a parent module, ie we're being created while its 921634SN/A // constructor or end_of_elaboration callback is running. 931634SN/A parent = p->obj()->_sc_obj; 948931Sandreas.hansson@arm.com } else if (scheduler.current()) { 951634SN/A // Our parent is the currently running process. 968741Sgblack@eecs.umich.edu parent = scheduler.current(); 978806Sgblack@eecs.umich.edu } 988806Sgblack@eecs.umich.edu if (parent) { 998741Sgblack@eecs.umich.edu addObject(&parent->_gem5_object->children, _sc_obj); 1001634SN/A } else { 1011634SN/A // We're a top level object. 1022512SN/A addObject(&topLevelObjects, _sc_obj); 1035480Snate@binkert.org } 1042SN/A 1052SN/A addObject(&allObjects, _sc_obj); 1062512SN/A 1072512SN/A _name = _basename; 1082512SN/A sc_core::sc_object *sc_p = parent; 1092512SN/A while (sc_p) { 110540SN/A _name = std::string(sc_p->basename()) + std::string(".") + _name; 1112641SN/A sc_p = sc_p->get_parent_object(); 1122522SN/A } 1132641SN/A} 1142512SN/A 1154986SN/AObject::Object(sc_core::sc_object *_sc_obj, const Object &arg) : 1162521SN/A Object(_sc_obj, arg._basename.c_str()) 1172641SN/A{} 118873SN/A 119873SN/AObject & 120873SN/AObject::operator = (const Object &) 121873SN/A{ 122873SN/A return *this; 1232630SN/A} 124873SN/A 125873SN/AObject::~Object() 1262630SN/A{ 127873SN/A // Promote all children to be top level objects. 128873SN/A for (auto child: children) { 1292630SN/A addObject(&topLevelObjects, child); 130873SN/A child->_gem5_object->parent = nullptr; 131873SN/A } 1322630SN/A children.clear(); 133873SN/A 134873SN/A if (parent) 1352512SN/A popObject(&parent->_gem5_object->children, _name); 1362512SN/A else 1372512SN/A popObject(&topLevelObjects, _name); 1384870SN/A popObject(&allObjects, _name); 139873SN/A} 1405480Snate@binkert.org 1412630SN/Aconst char * 142873SN/AObject::name() const 143873SN/A{ 144873SN/A return _name.c_str(); 145873SN/A} 146873SN/A 1475478SN/Aconst char * 148873SN/AObject::basename() const 149873SN/A{ 1502630SN/A return _basename.c_str(); 151873SN/A} 152873SN/A 1532630SN/Avoid 154873SN/AObject::print(std::ostream &out) const 155873SN/A{ 1562630SN/A out << name(); 157873SN/A} 158873SN/A 1592630SN/Avoid 160873SN/AObject::dump(std::ostream &out) const 161873SN/A{ 1622630SN/A out << "name = " << name() << "\n"; 163873SN/A out << "kind = " << _sc_obj->kind() << "\n"; 164873SN/A} 1652630SN/A 166873SN/Aconst std::vector<sc_core::sc_object *> & 167873SN/AObject::get_child_objects() const 1682630SN/A{ 169873SN/A return children; 170873SN/A} 1712630SN/A 172873SN/Aconst std::vector<sc_core::sc_event *> & 173873SN/AObject::get_child_events() const 1742630SN/A{ 175873SN/A return events; 176873SN/A} 1772630SN/A 178873SN/Asc_core::sc_object *Object::get_parent_object() const 179873SN/A{ 1802630SN/A return parent; 181873SN/A} 182873SN/A 1832114SN/Abool 1842114SN/AObject::add_attribute(sc_core::sc_attr_base &attr) 1852114SN/A{ 1862114SN/A return cltn.push_back(&attr); 1872630SN/A} 1882114SN/A 1892114SN/Asc_core::sc_attr_base * 190873SN/AObject::get_attribute(const std::string &attr) 1915480Snate@binkert.org{ 1922630SN/A return cltn[attr]; 193873SN/A} 194873SN/A 1954870SN/Asc_core::sc_attr_base * 1962SN/AObject::remove_attribute(const std::string &attr) 1972512SN/A{ 1982SN/A return cltn.remove(attr); 1992SN/A} 2002512SN/A 2015480Snate@binkert.orgvoid 2022SN/AObject::remove_all_attributes() 2032641SN/A{ 2042641SN/A cltn.remove_all(); 205430SN/A} 2062630SN/A 2072641SN/Aint 2082SN/AObject::num_attributes() const 209430SN/A{ 210430SN/A return cltn.size(); 2112SN/A} 212430SN/A 2132SN/Asc_core::sc_attr_cltn & 214430SN/AObject::attr_cltn() 2152SN/A{ 216430SN/A return cltn; 2172SN/A} 218430SN/A 2192SN/Aconst sc_core::sc_attr_cltn & 220430SN/AObject::attr_cltn() const 2212SN/A{ 222430SN/A return cltn; 2232SN/A} 224430SN/A 2252SN/Asc_core::sc_simcontext * 226430SN/AObject::simcontext() const 2272SN/A{ 2282SN/A warn("%s not implemented.\n", __PRETTY_FUNCTION__); 2292SN/A return nullptr; 2302SN/A} 2312SN/A 2322SN/AEventsIt 233430SN/AObject::addChildEvent(sc_core::sc_event *e) 2342SN/A{ 235430SN/A return events.emplace(events.end(), e); 2365478SN/A} 237430SN/A 2382SN/Avoid 239430SN/AObject::delChildEvent(sc_core::sc_event *e) 2402114SN/A{ 2412114SN/A EventsIt it = std::find(events.begin(), events.end(), e); 2427823Ssteve.reinhardt@amd.com assert(it != events.end()); 2432114SN/A std::swap(*it, events.back()); 2442114SN/A events.pop_back(); 2452114SN/A} 2462114SN/A 2472114SN/A 2482SN/AObjects topLevelObjects; 2492SN/AObjects allObjects; 2504870SN/A 2512SN/Aconst std::vector<sc_core::sc_object *> & 2522512SN/AgetTopLevelScObjects() 253545SN/A{ 254545SN/A return topLevelObjects; 2552SN/A} 25610905Sandreas.sandberg@arm.com 2572SN/Asc_core::sc_object * 258222SN/AfindObject(const char *name, const Objects &objects) 259222SN/A{ 260222SN/A ObjectsIt it = findObjectIn(allObjects, name); 261222SN/A return it == allObjects.end() ? nullptr : *it; 262222SN/A} 263222SN/A 264222SN/A} // namespace sc_gem5 265222SN/A