source: sources/src/sc_object.cc @ 52

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

Code formatting in all source files.

File size: 6.3 KB
Line 
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
37#include <cstdio>
38#include <cstring> //strdup
39#include <string>
40#include <map>
41#include <cassert>
42
43#include "sc_object.h"
44#include "internal.h"
45#include "sc_signal.h"
46#include "module_hierarchy.h"
47
48#ifdef HAVE_CONFIG_H
49#include "config.h"
50#endif
51
52
53using namespace std;
54
55namespace sc_core {
56
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;
63}
64
65
66static void build_complete_name (const char *name, string &out) {
67    out = "";
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    }
79}
80
81
82typedef std::map<const sc_object * const, string> object2name_t;
83static object2name_t object2basename;
84static object2name_t object2fullname;
85
86struct object_infos_t {
87    const char * kind_string;
88};
89
90typedef std::map<const sc_object * const, object_infos_t> object2infos_t;
91static object2infos_t object2infos;
92
93
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.
98const char * SC_BIND_PROXY_NIL_string = "SC_BIND_PROXY_NIL";
99sc_bind_proxy SC_BIND_PROXY_NIL(SC_BIND_PROXY_NIL_string, NULL);
100
101
102// ----------------------------------------------------------------------------
103//  FUNCTION : sc_gen_unique_name
104//                                               
105// ----------------------------------------------------------------------------
106const char * sc_gen_unique_name(const char * basename_) {
107    string s;
108    gen_name(basename_,s);
109    return strdup (s.c_str());
110}
111
112
113// ----------------------------------------------------------------------------
114//  CLASS : sc_object
115//                                               
116// ----------------------------------------------------------------------------
117
118const char * const sc_object::kind_string = "sc_object";
119
120void sc_object::set_kind(const char * k) {
121    object2infos[this].kind_string = k;
122}
123
124
125void sc_object::init() {
126    set_kind("sc_object");
127    add_child(*this);
128}
129
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();
137}
138
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();
151    }
152    else {
153        temp = name_;
154    }
155    object2basename[this] = temp;
156    build_complete_name(name_, object2fullname[this]);
157    init();
158}
159
160
161const char * sc_object::basename() const {
162    return object2basename[this].c_str();
163}
164
165
166const char * sc_object::name() const {
167    object2name_t::iterator i = object2fullname.find(this);
168#ifdef CONFIG_DEBUG
169    if (i == object2fullname.end()) {
170        cerr << "Internal error : can't find name of " << this << "\n";
171        exit (90);
172    }
173#endif
174    return i->second.c_str();
175}
176
177
178void sc_object::rename(const char * newname) const {
179    object2basename[this] = newname;
180    build_complete_name (newname,object2fullname[this]);
181}
182
183
184const char * sc_object::kind() const {
185    object2infos_t::iterator i = object2infos.find(this);
186#ifdef CONFIG_DEBUG
187    if (i == object2infos.end()) {
188        cerr << "Internal error : can't find kind of " << this << "\n";
189        exit(90);
190    }
191#endif
192    return i->second.kind_string;
193}
194
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);
204}
205
206
207std::ostream & operator << (std::ostream & os, const sc_object & obj) {
208    return os << obj.name ();
209}
210
211
212/* virtual */ 
213const std::vector<sc_object *> & sc_object::get_child_objects() const {
214    return sc_core::get_child_objects(*this);
215}
216
217
218sc_object * sc_object::get_parent_object() const {
219    return sc_core::get_parent_object(*this);
220}
221
222
223} // end of sc_core namespace
224
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.