source: trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Component_vhdl_instance.cpp @ 44

Last change on this file since 44 was 44, checked in by rosiere, 17 years ago

Modification des classes d'encapsulation des interfaces.
Stable sur tous les composants actuels

File size: 4.9 KB
Line 
1#ifdef VHDL
2/*
3 * $Id$
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/include/Component.h"
10
11namespace morpheo              {
12namespace behavioural          {
13
14#undef  FUNCTION
15#define FUNCTION "Component::vhdl_instance"
16  void Component::vhdl_instance (Vhdl * & vhdl)
17  {
18    log_printf(FUNC,Behavioural,FUNCTION,"Begin");
19
20    uint32_t             cpt = 0;
21    map<Signal *,string> tab;
22
23    // buffer all output
24    {
25      vhdl->set_body ("------------------------------------------------------");
26      vhdl->set_body ("-- Output's Buffer");
27      vhdl->set_body ("------------------------------------------------------");
28
29      // for each interface
30      list<Interface_fifo *>         * list_interface = (_entity)->get_interfaces_list()->get_interface_list();
31      list<Interface_fifo *>::iterator j              = list_interface->begin();
32      if (not list_interface->empty())
33        {
34          while (j != list_interface->end())
35            {
36              // for each signal
37              list<Signal *>         * list_signal = (*j)->get_signal_list();
38              list<Signal *>::iterator k           = list_signal->begin();
39              if (not list_signal->empty())
40                {
41                  while (k != list_signal->end())
42                    {
43                      Signal * signal = (*k);
44
45                      // test if is connect with external interface or with an another component AND if this port is mapped.
46                      if ( (signal->get_direction() == OUT) and
47                           (signal->get_connect_from_signal () != NULL) )
48                        {
49                          // Create name
50                          string signal_name = "signal_"+toString(cpt++);
51                         
52                          tab [signal                           ] = signal_name;
53                          tab [signal->get_connect_from_signal()] = signal_name;
54                         
55                          // Add a new signal and the affectation
56                          vhdl->set_signal (signal_name, signal->get_size());
57                          vhdl->set_body   (signal->get_name()+" <= "+signal_name+";");
58                        }
59                      else
60                        {
61                          tab [signal                   ] = signal->get_name();
62                        }
63                      ++k;
64                    }
65                }
66              ++j;
67            }
68        }
69      vhdl->set_body ("");
70      vhdl->set_body ("------------------------------------------------------");
71      vhdl->set_body ("");
72    }
73
74    vhdl->set_library_work (_entity->get_name() + "_Pack");
75
76    // for each entity
77    list<Entity *>         * list_component = _list_component;
78    list<Entity *>::iterator i              = list_component->begin();
79    if (not list_component->empty())
80      {
81        while (i != list_component->end())
82          {
83            vhdl->set_library_work ((*i)->get_name() + "_Pack");
84
85            list<string> list_port_map;
86           
87            // for each interface
88            list<Interface_fifo *>         * list_interface = (*i)->get_interfaces_list()->get_interface_list();
89            list<Interface_fifo *>::iterator j              = list_interface->begin();
90            if (not list_interface->empty())
91              {
92                while (j != list_interface->end())
93                  {
94                    // for each signal
95                    list<Signal *>         * list_signal = (*j)->get_signal_list();
96                    list<Signal *>::iterator k           = list_signal->begin();
97                    if (not list_signal->empty())
98                      {
99                        while (k != list_signal->end())
100                          {
101                            // test if is connect with external interface or with an another component.
102                            Signal * signal_src  = (*k);
103
104                            if (signal_src->presence_vhdl () == true)
105                              {
106                                Signal * signal_dest = signal_src->get_connect_to_signal();
107                                string   name_src    = signal_src->get_name();
108                                string   name_dest;
109                               
110//                              // Test if destination signal is a interface port ?
111//                              if (_entity->find_signal(signal_dest) == false)
112//                                {
113                                    // find if signal is already link
114                                    map<Signal *,string>::iterator it = tab.find(signal_dest); 
115                                    if (tab.find(signal_dest) == tab.end())
116                                      {
117                                        // Create name
118                                        name_dest = "signal_"+toString(cpt++);
119                                       
120                                        tab [signal_src ] = name_dest;
121                                        tab [signal_dest] = name_dest;
122                                       
123                                        // Add a new signal
124                                        vhdl->set_signal (name_dest, signal_src->get_size());
125                                      }
126                                    else
127                                      {
128                                        // find !!!!
129                                        name_dest = (*it).second;
130                                        tab [signal_src ] = name_dest;
131                                      }
132//                                }
133//                              else
134//                                {
135//                                  cout << "Kane à dit : " << signal_dest->get_name() << endl;
136//                                  // Test if output
137//                                  if (signal_dest->get_direction() == OUT)
138//                                    {
139//                                      // Take buffer's signal
140//                                      map<Signal *,string>::iterator it = tab.find(signal_dest);
141//                                      name_dest        = (*it).second;
142
143//                                      cout << " * OUT - name : " << name_dest << endl;
144//                                    }
145//                                  else
146//                                    {
147//                                      name_dest = signal_dest->get_name();
148//                                      cout << " * IN  - name : " << name_dest << endl;
149//                                    }                             
150//                                }
151                               
152                                vhdl->set_body_component_port_map (list_port_map, name_src, name_dest);
153                              }
154                            ++k;
155                          }
156                      }
157                    ++j;
158                  }
159              }
160            vhdl->set_body_component ("instance_"+(*i)->get_name(),(*i)->get_name(),list_port_map);
161            ++i;
162          }
163      }
164    log_printf(FUNC,Behavioural,FUNCTION,"End");
165  };
166
167}; // end namespace behavioural
168}; // end namespace morpheo
169#endif
Note: See TracBrowser for help on using the repository browser.