source: sources/src/sc_object.cc @ 52

Last change on this file since 52 was 52, checked in by meunier, 12 years ago

Code formatting in all source files.

File size: 6.3 KB
RevLine 
[1]1/*------------------------------------------------------------\
2|                                                             |
3| Tool    :                  systemcass                       |
4|                                                             |
5| File    :                 sc_object.cc                      |
6|                                                             |
7| Author  :                 Buchmann Richard                  |
8|                                                             |
9| Date    :                   09_07_2004                      |
10|                                                             |
11\------------------------------------------------------------*/
12
13/*
14 * This file is part of the Disydent Project
15 * Copyright (C) Laboratoire LIP6 - Département ASIM
16 * Universite Pierre et Marie Curie
17 *
18 * Home page          : http://www-asim.lip6.fr/disydent
19 * E-mail             : mailto:richard.buchmann@lip6.fr
20 *
21 * This library is free software; you  can redistribute it and/or modify it
22 * under the terms  of the GNU Library General Public  License as published
23 * by the Free Software Foundation; either version 2 of the License, or (at
24 * your option) any later version.
25 *
26 * Disydent is distributed  in the hope  that it  will be
27 * useful, but WITHOUT  ANY WARRANTY; without even the  implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
29 * Public License for more details.
30 *
31 * You should have received a copy  of the GNU General Public License along
32 * with the GNU C Library; see the  file COPYING. If not, write to the Free
33 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
34 */
35
36
[12]37#include <cstdio>
[17]38#include <cstring> //strdup
[1]39#include <string>
40#include <map>
[52]41#include <cassert>
[1]42
43#include "sc_object.h"
44#include "internal.h"
45#include "sc_signal.h"
46#include "module_hierarchy.h"
[52]47
[27]48#ifdef HAVE_CONFIG_H
49#include "config.h"
50#endif
[1]51
[52]52
[1]53using namespace std;
54
55namespace sc_core {
56
[52]57static void gen_name (const char *prefix, string &s) {
58    s = prefix;
59    static int i = 0;
60    char ic[10];
61    sprintf (ic,"%d",i++);
62    s += ic;
[1]63}
64
[52]65
66static void build_complete_name (const char *name, string &out) {
[1]67    out = "";
[52]68    module_name_stack_t::const_iterator i;
69    for (i = module_name_stack.begin (); i != module_name_stack.end (); ++i) {
70        const string &module_name = *i;
71        out += (module_name + ".");
72    }
73    if (name) {
74        out += name;
75    }
76    else {
77        out[out.length ()-1] = '\0';
78    }
[1]79}
80
81
[52]82typedef std::map<const sc_object * const, string> object2name_t;
[1]83static object2name_t object2basename;
84static object2name_t object2fullname;
85
86struct object_infos_t {
[52]87    const char * kind_string;
[1]88};
[52]89
90typedef std::map<const sc_object * const, object_infos_t> object2infos_t;
[1]91static object2infos_t object2infos;
92
[52]93
[1]94// We initialize SC_BIND_PROXY_NIL there to make sure object2infos,
95// object2fullname, and object2basename are already initialized.
96// SC_BIND_PROXY_NIL should be declared into sc_module.cc but it prevents us
97// to force the initialization order.
[52]98const char * SC_BIND_PROXY_NIL_string = "SC_BIND_PROXY_NIL";
99sc_bind_proxy SC_BIND_PROXY_NIL(SC_BIND_PROXY_NIL_string, NULL);
[1]100
[52]101
[1]102// ----------------------------------------------------------------------------
103//  FUNCTION : sc_gen_unique_name
104//                                               
105// ----------------------------------------------------------------------------
[52]106const char * sc_gen_unique_name(const char * basename_) {
107    string s;
108    gen_name(basename_,s);
109    return strdup (s.c_str());
[1]110}
111
[52]112
[1]113// ----------------------------------------------------------------------------
114//  CLASS : sc_object
115//                                               
116// ----------------------------------------------------------------------------
117
[52]118const char * const sc_object::kind_string = "sc_object";
[1]119
[52]120void sc_object::set_kind(const char * k) {
121    object2infos[this].kind_string = k;
[1]122}
123
[52]124
125void sc_object::init() {
126    set_kind("sc_object");
127    add_child(*this);
[1]128}
129
[52]130
131sc_object::sc_object() {
132    string noname;
133    gen_name("noname_", noname);
134    object2basename[this] = noname;
135    build_complete_name(noname.c_str(), object2fullname[this]);
136    init();
[1]137}
138
[52]139
140sc_object::sc_object(const char * name_) {
141    const char * temp;
142    if (name_ == NULL) {
143#ifdef CONFIG_DEBUG
144        if (module_name_stack.empty()) {
145            cerr << "Internal error : module_name_stack is empty.";
146            exit(21092005);
147        }
148#endif
149        string & module_name = module_name_stack.back();
150        temp = module_name.c_str();
[1]151    }
[52]152    else {
153        temp = name_;
154    }
155    object2basename[this] = temp;
156    build_complete_name(name_, object2fullname[this]);
157    init();
[1]158}
159
[52]160
161const char * sc_object::basename() const {
162    return object2basename[this].c_str();
[1]163}
164
[52]165
166const char * sc_object::name() const {
167    object2name_t::iterator i = object2fullname.find(this);
[27]168#ifdef CONFIG_DEBUG
[52]169    if (i == object2fullname.end()) {
170        cerr << "Internal error : can't find name of " << this << "\n";
171        exit (90);
172    }
[1]173#endif
[52]174    return i->second.c_str();
[1]175}
[52]176
177
178void sc_object::rename(const char * newname) const {
179    object2basename[this] = newname;
180    build_complete_name (newname,object2fullname[this]);
[1]181}
[52]182
183
184const char * sc_object::kind() const {
185    object2infos_t::iterator i = object2infos.find(this);
[27]186#ifdef CONFIG_DEBUG
[52]187    if (i == object2infos.end()) {
188        cerr << "Internal error : can't find kind of " << this << "\n";
189        exit(90);
190    }
[1]191#endif
[52]192    return i->second.kind_string;
[1]193}
194
[52]195
196sc_object::~sc_object() {
197    if (save_on_exit) {
198        sc_save_simulation(save_on_exit);
199        save_on_exit = NULL;
200    }
201    object2fullname.erase(this);
202    object2basename.erase(this);
203    object2infos.erase(this);
[1]204}
205
[52]206
207std::ostream & operator << (std::ostream & os, const sc_object & obj) {
208    return os << obj.name ();
[1]209}
210
[52]211
[1]212/* virtual */ 
[52]213const std::vector<sc_object *> & sc_object::get_child_objects() const {
214    return sc_core::get_child_objects(*this);
[1]215}
216
[52]217
218sc_object * sc_object::get_parent_object() const {
219    return sc_core::get_parent_object(*this);
[1]220}
221
[52]222
[1]223} // end of sc_core namespace
224
[52]225
226/*
227# Local Variables:
228# tab-width: 4;
229# c-basic-offset: 4;
230# c-file-offsets:((innamespace . 0)(inline-open . 0));
231# indent-tabs-mode: nil;
232# End:
233#
234# vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
235*/
236
Note: See TracBrowser for help on using the repository browser.