source: sources/src/sc_object.cc@ 21

Last change on this file since 21 was 17, checked in by buchmann, 17 years ago

Fix :

  • add missing system header includes
File size: 7.2 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>
41
42#include "assert.h"
43#include "sc_object.h"
44//#include "sc_port.h"
45#include "internal.h"
46#include "sc_signal.h"
47#include "module_hierarchy.h"
48
49using namespace std;
50
51namespace sc_core {
52
53static void
54gen_name (const char *prefix, string &s)
55{
56 s = prefix;
57 static int i = 0;
58 char ic[10];
59 sprintf (ic,"%d",i++);
60 s += ic;
61}
62// ----------------------------------------------------------------------------
63static void
64build_complete_name (const char *name, string &out)
65{
66 out = "";
67 module_name_stack_t::const_iterator i;
68 for (i = module_name_stack.begin (); i != module_name_stack.end (); ++i) {
69 const string &module_name = *i;
70 out += (module_name + ".");
71// out += ".";
72 }
73// ASSERT(name != NULL);
74 if (name)
75 out += name;
76 else
77 out[out.length ()-1] = '\0';
78#if 0
79 cerr << "complete_name = " << out << endl;
80#endif
81}
82
83#if 0
84static
85void
86build_full_name_r (string &out, const sc_object *obj)
87{
88 if (obj == NULL)
89 {
90 out = "";
91 } else {
92 const sc_object *parent = obj->get_parent_object ();
93 build_full_name_r (out, parent);
94 out += obj->basename ();
95 out += ".";
96 }
97}
98
99static
100void
101build_full_name (string &out, const sc_object &obj)
102{
103 const sc_object *parent = obj.get_parent_object ();
104 build_full_name_r (out, parent);
105 out += obj.basename ();
106 cerr << "build_full_name = " << out << endl;
107}
108#endif
109
110typedef std::map<const sc_object* const,string> object2name_t;
111static object2name_t object2basename;
112static object2name_t object2fullname;
113
114struct object_infos_t {
115 const char *kind_string;
116};
117typedef std::map<const sc_object* const,object_infos_t> object2infos_t;
118static object2infos_t object2infos;
119
120// We initialize SC_BIND_PROXY_NIL there to make sure object2infos,
121// object2fullname, and object2basename are already initialized.
122// SC_BIND_PROXY_NIL should be declared into sc_module.cc but it prevents us
123// to force the initialization order.
124const char *SC_BIND_PROXY_NIL_string = "SC_BIND_PROXY_NIL";
125sc_bind_proxy SC_BIND_PROXY_NIL (SC_BIND_PROXY_NIL_string,NULL);
126
127// ----------------------------------------------------------------------------
128// FUNCTION : sc_gen_unique_name
129//
130// ----------------------------------------------------------------------------
131
132const char *
133sc_gen_unique_name (const char *basename_)
134{
135 string s;
136 gen_name (basename_,s);
137 return strdup (s.c_str ());
138}
139
140// ----------------------------------------------------------------------------
141// CLASS : sc_object
142//
143// ----------------------------------------------------------------------------
144
145const char* const sc_object::kind_string = "sc_object";
146
147void
148sc_object::set_kind (const char *k)
149{
150 object2infos[this].kind_string = k;
151}
152
153void
154sc_object::init ()
155{
156 set_kind ("sc_object");
157 add_child (*this);
158}
159
160sc_object::sc_object()
161{
162 string noname;
163 gen_name ("noname_",noname);
164#if 0
165 cerr << "object2basename[this] = " << noname << "\n";
166#endif
167 object2basename[this] = noname;
168 build_complete_name (noname.c_str(),object2fullname[this]);
169 init ();
170}
171
172sc_object::sc_object(const char *name_)
173{
174 const char *temp;
175 if (name_ == NULL) {
176 if (module_name_stack.empty())
177 {
178 cerr << "Internal error : module_name_stack is empty.";
179 exit (21092005);
180 }
181 string &module_name = module_name_stack.back ();
182 temp = module_name.c_str ();
183 } else {
184 temp = name_;
185 }
186#if 0
187 cerr << "object2basename[this] = " << temp << "\n";
188 cerr << "name temp = " << temp << endl;
189#endif
190 object2basename[this] = temp;
191 build_complete_name (name_,object2fullname[this]);
192 init ();
193}
194
195const char *
196sc_object::basename () const
197{
198 return object2basename[this].c_str ();
199}
200
201const char *
202sc_object::name () const
203{
204 object2name_t::iterator i = object2fullname.find (this);
205#ifdef DEBUG
206 if (i == object2fullname.end ()) {
207 cerr << "Internal error : can't find name of " << this << "\n";
208 exit (90);
209 }
210#endif
211 return i->second.c_str ();
212}
213
214void
215sc_object::rename (const char* newname) const
216{
217/*
218 object2name_t::iterator i = object2fullname.find (this);
219#ifdef DEBUG
220 if (i == object2fullname.end ()) {
221 cerr << "Internal error : can't find name of " << this << "\n";
222 exit (90);
223 }
224#endif
225 i->second = newname;
226 object2basename[this] = newname;
227*/
228 object2basename[this] = newname;
229 build_complete_name (newname,object2fullname[this]);
230/*
231 const std::vector<sc_object*>& childs = get_child_objects();
232 std::vector<sc_object*>::const_iterator it;
233 for (it = childs.begin (); it != childs.end (); ++it)
234 {
235 string out;
236 sc_object* obj = *it;
237 ASSERT(obj != NULL);
238 build_full_name (out, *obj);
239 }
240*/
241}
242const char *sc_object::kind () const
243{
244 object2infos_t::iterator i = object2infos.find (this);
245#ifdef DEBUG
246 if (i == object2infos.end ()) {
247 cerr << "Internal error : can't find kind of " << this << "\n";
248 exit (90);
249 }
250#endif
251 return i->second.kind_string;
252}
253
254sc_object::~sc_object ()
255{
256 if (save_on_exit)
257 {
258 sc_save_simulation (save_on_exit);
259 save_on_exit = NULL;
260 }
261 object2fullname.erase (this);
262 object2basename.erase (this);
263 object2infos.erase (this);
264}
265
266std::ostream&
267operator << (std::ostream& os, const sc_object& obj)
268{
269 return os << obj.name ();
270}
271
272/* virtual */
273const std::vector<sc_object*>&
274sc_object::get_child_objects() const
275{
276 return sc_core::get_child_objects (*this);
277}
278
279sc_object*
280sc_object::get_parent_object () const
281{
282 return sc_core::get_parent_object (*this);
283}
284
285} // end of sc_core namespace
286
Note: See TracBrowser for help on using the repository browser.