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