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