object.cc revision 13126
19852Sandreas.hansson@arm.com/* 28999Suri.wiener@arm.com * Copyright 2018 Google, Inc. 38999Suri.wiener@arm.com * 48999Suri.wiener@arm.com * Redistribution and use in source and binary forms, with or without 58999Suri.wiener@arm.com * modification, are permitted provided that the following conditions are 68999Suri.wiener@arm.com * met: redistributions of source code must retain the above copyright 78999Suri.wiener@arm.com * notice, this list of conditions and the following disclaimer; 88999Suri.wiener@arm.com * redistributions in binary form must reproduce the above copyright 98999Suri.wiener@arm.com * notice, this list of conditions and the following disclaimer in the 108999Suri.wiener@arm.com * documentation and/or other materials provided with the distribution; 118999Suri.wiener@arm.com * neither the name of the copyright holders nor the names of its 128999Suri.wiener@arm.com * contributors may be used to endorse or promote products derived from 138999Suri.wiener@arm.com * this software without specific prior written permission. 148999Suri.wiener@arm.com * 158999Suri.wiener@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 168999Suri.wiener@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 178999Suri.wiener@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 188999Suri.wiener@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 198999Suri.wiener@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 208999Suri.wiener@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 218999Suri.wiener@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 228999Suri.wiener@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 238999Suri.wiener@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 248999Suri.wiener@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 258999Suri.wiener@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 268999Suri.wiener@arm.com * 278999Suri.wiener@arm.com * Authors: Gabe Black 288999Suri.wiener@arm.com */ 298999Suri.wiener@arm.com 308999Suri.wiener@arm.com#include "systemc/core/object.hh" 318999Suri.wiener@arm.com 328999Suri.wiener@arm.com#include <algorithm> 338999Suri.wiener@arm.com 348999Suri.wiener@arm.com#include "base/logging.hh" 358999Suri.wiener@arm.com#include "systemc/core/module.hh" 368999Suri.wiener@arm.com#include "systemc/core/scheduler.hh" 378999Suri.wiener@arm.com 3811418Ssascha.bischoff@arm.comnamespace sc_gem5 398999Suri.wiener@arm.com{ 408999Suri.wiener@arm.com 418999Suri.wiener@arm.comnamespace 428999Suri.wiener@arm.com{ 438999Suri.wiener@arm.com 448999Suri.wiener@arm.comObjectsIt 459852Sandreas.hansson@arm.comfindObjectIn(Objects &objects, const std::string &name) 469852Sandreas.hansson@arm.com{ 479852Sandreas.hansson@arm.com ObjectsIt it; 489852Sandreas.hansson@arm.com for (it = objects.begin(); it != objects.end(); it++) 499852Sandreas.hansson@arm.com if (!strcmp((*it)->name(), name.c_str())) 509852Sandreas.hansson@arm.com break; 519852Sandreas.hansson@arm.com 529852Sandreas.hansson@arm.com return it; 539852Sandreas.hansson@arm.com} 549852Sandreas.hansson@arm.com 558999Suri.wiener@arm.comvoid 568999Suri.wiener@arm.comaddObject(Objects *objects, sc_core::sc_object *object) 578999Suri.wiener@arm.com{ 588999Suri.wiener@arm.com objects->emplace(objects->end(), object); 598999Suri.wiener@arm.com} 6013714Sandreas.sandberg@arm.com 6113714Sandreas.sandberg@arm.comvoid 6213714Sandreas.sandberg@arm.compopObject(Objects *objects, const std::string &name) 638999Suri.wiener@arm.com{ 648999Suri.wiener@arm.com ObjectsIt it = findObjectIn(*objects, name); 6512202Sgabeblack@google.com assert(it != objects->end()); 669528Ssascha.bischoff@arm.com std::swap(objects->back(), *it); 678999Suri.wiener@arm.com objects->pop_back(); 688999Suri.wiener@arm.com} 698999Suri.wiener@arm.com 708999Suri.wiener@arm.com} // anonymous namespace 718999Suri.wiener@arm.com 7212202Sgabeblack@google.comObject::Object(sc_core::sc_object *_sc_obj) : Object(_sc_obj, "object") {} 7313709Sandreas.sandberg@arm.com 7412202Sgabeblack@google.comObject::Object(sc_core::sc_object *_sc_obj, const char *obj_name) : 7512202Sgabeblack@google.com _sc_obj(_sc_obj), _basename(obj_name ? obj_name : ""), parent(nullptr) 7612202Sgabeblack@google.com{ 7712202Sgabeblack@google.com if (_basename == "") 7812202Sgabeblack@google.com _basename = "object"; 7912202Sgabeblack@google.com 8012202Sgabeblack@google.com Module *p = currentModule(); 8112202Sgabeblack@google.com if (!p) 8212202Sgabeblack@google.com p = callbackModule(); 838999Suri.wiener@arm.com 848999Suri.wiener@arm.com Module *n = newModule(); 858999Suri.wiener@arm.com if (n) { 868999Suri.wiener@arm.com // We are a module in the process of being constructed. 878999Suri.wiener@arm.com n->finish(this); 888999Suri.wiener@arm.com } 898999Suri.wiener@arm.com 909852Sandreas.hansson@arm.com if (p) { 919852Sandreas.hansson@arm.com // We're "within" a parent module, ie we're being created while its 928999Suri.wiener@arm.com // constructor or end_of_elaboration callback is running. 938999Suri.wiener@arm.com parent = p->obj()->_sc_obj; 948999Suri.wiener@arm.com } else if (scheduler.current()) { 958999Suri.wiener@arm.com // Our parent is the currently running process. 968999Suri.wiener@arm.com parent = scheduler.current(); 978999Suri.wiener@arm.com } 988999Suri.wiener@arm.com if (parent) { 998999Suri.wiener@arm.com addObject(&parent->_gem5_object->children, _sc_obj); 1008999Suri.wiener@arm.com } else { 1018999Suri.wiener@arm.com // We're a top level object. 1028999Suri.wiener@arm.com addObject(&topLevelObjects, _sc_obj); 1038999Suri.wiener@arm.com } 1048999Suri.wiener@arm.com 10512202Sgabeblack@google.com addObject(&allObjects, _sc_obj); 10612202Sgabeblack@google.com 1078999Suri.wiener@arm.com _name = _basename; 1088999Suri.wiener@arm.com sc_core::sc_object *sc_p = parent; 1098999Suri.wiener@arm.com while (sc_p) { 1108999Suri.wiener@arm.com _name = std::string(sc_p->basename()) + std::string(".") + _name; 1118999Suri.wiener@arm.com sc_p = sc_p->get_parent_object(); 1128999Suri.wiener@arm.com } 1138999Suri.wiener@arm.com} 1148999Suri.wiener@arm.com 1158999Suri.wiener@arm.comObject::Object(sc_core::sc_object *_sc_obj, const Object &arg) : 1168999Suri.wiener@arm.com Object(_sc_obj, arg._basename.c_str()) 1178999Suri.wiener@arm.com{} 1188999Suri.wiener@arm.com 11910176Ssascha.bischoff@arm.comObject & 1208999Suri.wiener@arm.comObject::operator = (const Object &) 1218999Suri.wiener@arm.com{ 1228999Suri.wiener@arm.com return *this; 1238999Suri.wiener@arm.com} 1248999Suri.wiener@arm.com 1258999Suri.wiener@arm.comObject::~Object() 12612202Sgabeblack@google.com{ 12712202Sgabeblack@google.com // Promote all children to be top level objects. 1288999Suri.wiener@arm.com for (auto child: children) { 12913870Sgabeblack@google.com addObject(&topLevelObjects, child); 13013870Sgabeblack@google.com child->_gem5_object->parent = nullptr; 13113870Sgabeblack@google.com } 13213870Sgabeblack@google.com children.clear(); 13313870Sgabeblack@google.com 13413870Sgabeblack@google.com if (parent) 13513870Sgabeblack@google.com popObject(&parent->_gem5_object->children, _name); 13613870Sgabeblack@google.com else 13713870Sgabeblack@google.com popObject(&topLevelObjects, _name); 13813870Sgabeblack@google.com popObject(&allObjects, _name); 13913870Sgabeblack@google.com} 14013870Sgabeblack@google.com 14113870Sgabeblack@google.comconst char * 14213870Sgabeblack@google.comObject::name() const 14313870Sgabeblack@google.com{ 14413870Sgabeblack@google.com return _name.c_str(); 14513870Sgabeblack@google.com} 1468999Suri.wiener@arm.com 1478999Suri.wiener@arm.comconst char * 1489854Sandreas.hansson@arm.comObject::basename() const 1499854Sandreas.hansson@arm.com{ 1509854Sandreas.hansson@arm.com return _basename.c_str(); 1519854Sandreas.hansson@arm.com} 1529854Sandreas.hansson@arm.com 1539854Sandreas.hansson@arm.comvoid 1549854Sandreas.hansson@arm.comObject::print(std::ostream &out) const 1559854Sandreas.hansson@arm.com{ 1569854Sandreas.hansson@arm.com out << name(); 1579854Sandreas.hansson@arm.com} 1589854Sandreas.hansson@arm.com 1598999Suri.wiener@arm.comvoid 1608999Suri.wiener@arm.comObject::dump(std::ostream &out) const 1618999Suri.wiener@arm.com{ 1628999Suri.wiener@arm.com out << "name = " << name() << "\n"; 1639854Sandreas.hansson@arm.com out << "kind = " << _sc_obj->kind() << "\n"; 1648999Suri.wiener@arm.com} 1658999Suri.wiener@arm.com 1669853Sandreas.hansson@arm.comconst std::vector<sc_core::sc_object *> & 1678999Suri.wiener@arm.comObject::get_child_objects() const 1688999Suri.wiener@arm.com{ 1698999Suri.wiener@arm.com return children; 1708999Suri.wiener@arm.com} 1718999Suri.wiener@arm.com 1728999Suri.wiener@arm.comconst std::vector<sc_core::sc_event *> & 1738999Suri.wiener@arm.comObject::get_child_events() const 1748999Suri.wiener@arm.com{ 1758999Suri.wiener@arm.com return events; 1768999Suri.wiener@arm.com} 1778999Suri.wiener@arm.com 1788999Suri.wiener@arm.comsc_core::sc_object *Object::get_parent_object() const 1799853Sandreas.hansson@arm.com{ 1808999Suri.wiener@arm.com return parent; 1818999Suri.wiener@arm.com} 1828999Suri.wiener@arm.com 1838999Suri.wiener@arm.combool 1848999Suri.wiener@arm.comObject::add_attribute(sc_core::sc_attr_base &attr) 1859853Sandreas.hansson@arm.com{ 1869853Sandreas.hansson@arm.com return cltn.push_back(&attr); 1879853Sandreas.hansson@arm.com} 1889853Sandreas.hansson@arm.com 1899853Sandreas.hansson@arm.comsc_core::sc_attr_base * 1909853Sandreas.hansson@arm.comObject::get_attribute(const std::string &attr) 19110405Sandreas.hansson@arm.com{ 1929853Sandreas.hansson@arm.com return cltn[attr]; 1939853Sandreas.hansson@arm.com} 1949853Sandreas.hansson@arm.com 1959853Sandreas.hansson@arm.comsc_core::sc_attr_base * 1969853Sandreas.hansson@arm.comObject::remove_attribute(const std::string &attr) 1979853Sandreas.hansson@arm.com{ 1989853Sandreas.hansson@arm.com return cltn.remove(attr); 1999853Sandreas.hansson@arm.com} 2009853Sandreas.hansson@arm.com 2019853Sandreas.hansson@arm.comvoid 2029853Sandreas.hansson@arm.comObject::remove_all_attributes() 2039853Sandreas.hansson@arm.com{ 2049853Sandreas.hansson@arm.com cltn.remove_all(); 2059853Sandreas.hansson@arm.com} 2069853Sandreas.hansson@arm.com 2079853Sandreas.hansson@arm.comint 20810405Sandreas.hansson@arm.comObject::num_attributes() const 20910405Sandreas.hansson@arm.com{ 2109853Sandreas.hansson@arm.com return cltn.size(); 2119853Sandreas.hansson@arm.com} 2129853Sandreas.hansson@arm.com 2139853Sandreas.hansson@arm.comsc_core::sc_attr_cltn & 2149853Sandreas.hansson@arm.comObject::attr_cltn() 2159853Sandreas.hansson@arm.com{ 2169853Sandreas.hansson@arm.com return cltn; 2179853Sandreas.hansson@arm.com} 2189853Sandreas.hansson@arm.com 2199853Sandreas.hansson@arm.comconst sc_core::sc_attr_cltn & 2209853Sandreas.hansson@arm.comObject::attr_cltn() const 2219853Sandreas.hansson@arm.com{ 2229853Sandreas.hansson@arm.com return cltn; 22310405Sandreas.hansson@arm.com} 2249853Sandreas.hansson@arm.com 2259853Sandreas.hansson@arm.comsc_core::sc_simcontext * 2269853Sandreas.hansson@arm.comObject::simcontext() const 2279853Sandreas.hansson@arm.com{ 2289853Sandreas.hansson@arm.com warn("%s not implemented.\n", __PRETTY_FUNCTION__); 2299853Sandreas.hansson@arm.com return nullptr; 2309853Sandreas.hansson@arm.com} 2319853Sandreas.hansson@arm.com 2329853Sandreas.hansson@arm.comEventsIt 2339853Sandreas.hansson@arm.comObject::addChildEvent(sc_core::sc_event *e) 2349853Sandreas.hansson@arm.com{ 2359853Sandreas.hansson@arm.com return events.emplace(events.end(), e); 2369853Sandreas.hansson@arm.com} 2379853Sandreas.hansson@arm.com 2389853Sandreas.hansson@arm.comvoid 2399853Sandreas.hansson@arm.comObject::delChildEvent(sc_core::sc_event *e) 2409853Sandreas.hansson@arm.com{ 2419853Sandreas.hansson@arm.com EventsIt it = std::find(events.begin(), events.end(), e); 2429853Sandreas.hansson@arm.com assert(it != events.end()); 2439853Sandreas.hansson@arm.com std::swap(*it, events.back()); 2449853Sandreas.hansson@arm.com events.pop_back(); 2459853Sandreas.hansson@arm.com} 2469853Sandreas.hansson@arm.com 2479853Sandreas.hansson@arm.com 2489853Sandreas.hansson@arm.comObjects topLevelObjects; 2499853Sandreas.hansson@arm.comObjects allObjects; 2509853Sandreas.hansson@arm.com 2519853Sandreas.hansson@arm.comconst std::vector<sc_core::sc_object *> & 2529853Sandreas.hansson@arm.comgetTopLevelScObjects() 2539853Sandreas.hansson@arm.com{ 2549853Sandreas.hansson@arm.com return topLevelObjects; 2559853Sandreas.hansson@arm.com} 2569853Sandreas.hansson@arm.com 2579853Sandreas.hansson@arm.comsc_core::sc_object * 2589853Sandreas.hansson@arm.comfindObject(const char *name, const Objects &objects) 2599853Sandreas.hansson@arm.com{ 2609853Sandreas.hansson@arm.com ObjectsIt it = findObjectIn(allObjects, name); 2619853Sandreas.hansson@arm.com return it == allObjects.end() ? nullptr : *it; 2629853Sandreas.hansson@arm.com} 2639853Sandreas.hansson@arm.com 2649853Sandreas.hansson@arm.com} // namespace sc_gem5 2659853Sandreas.hansson@arm.com