source: branches/with_autoconf/src/module_hierarchy.cc @ 54

Last change on this file since 54 was 20, checked in by nipo, 16 years ago

Sync up with trunk changes

File size: 3.6 KB
Line 
1/*------------------------------------------------------------\
2|                                                             |
3| Tool    :                  systemcass                       |
4|                                                             |
5| File    :                 module_hierarchy.cc               |
6|                                                             |
7| Author  :                 Buchmann Richard                  |
8|                                                             |
9| Date    :                   15_12_2005                      |
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#include "module_hierarchy.h"
37#include "sc_module.h"
38#include <cassert>
39#include <map>
40#ifdef HAVE_CONFIG_H
41#include "config.h"
42#endif
43#include <cstdlib>
44#include <cstring>
45
46using namespace std;
47
48namespace sc_core {
49
50typedef vector<sc_object*> sc_object_list_t;
51typedef map<const sc_object*,sc_object_list_t> sc_object2sc_object_list_t;
52typedef map<const sc_object*,sc_object *>      sc_object2sc_object_t;
53
54sc_object_list_t            top_level_objects;
55sc_object2sc_object_list_t  object2childs;
56sc_object2sc_object_t       object2parent;
57
58void
59set_parent (sc_module &mod, sc_module *parent)
60{
61  object2parent[&mod] = parent; 
62  sc_object_list_t &obj_list = (parent == NULL)?top_level_objects:object2childs[parent];
63  obj_list.push_back (&mod);
64}
65
66void
67add_child (sc_object &obj)
68{
69  sc_object_list_t *obj_list;
70  if (modules_stack.empty ())
71  {
72    obj_list = &top_level_objects;
73  } else {
74    const sc_module *parent    = modules_stack.top ();
75    if (parent == NULL)
76      return; //obj_list = &top_level_objects;
77    else {
78      assert(parent != &obj);
79      const sc_object *pobj      = (const sc_module *) parent;
80      obj_list = &(object2childs[pobj]);
81    }
82  }
83  obj_list->push_back (&obj);
84}
85
86const std::vector<sc_object*>& 
87sc_get_top_level_objects()
88{
89  return top_level_objects;
90}
91
92const sc_object*
93sc_find_object (const char* name)
94{
95  sc_object2sc_object_list_t::iterator i = object2childs.begin ();
96  while (i != object2childs.end ())
97  {
98    const sc_object *obj = i->first;
99    const char      *n   = obj->name ();
100    if (strcmp (name, n) == 0)
101      return obj;
102    ++i;
103  }
104  return NULL;
105}
106 
107const std::vector<sc_object*>& 
108get_child_objects (const sc_object &obj)
109{
110  sc_object_list_t &l = object2childs[&obj];
111  /*
112   * If the object is not in the objects list,
113   * get_child_objects returns an empty list.
114   */
115  return l;   
116}
117
118sc_object*
119get_parent_object (const sc_object &obj)
120{
121  return object2parent[&obj];
122}
123
124} // end of namespace sc_core
125
126
Note: See TracBrowser for help on using the repository browser.