source: trunk/IPs/systemC/processor/Morpheo/Behavioural/src/Signal_link.cpp @ 128

Last change on this file since 128 was 128, checked in by rosiere, 15 years ago

1) Correct bug in link two signal
2) Fix error detected with valgrind
3) modif distexe script

  • Property svn:keywords set to Id
File size: 4.3 KB
Line 
1/*
2 * $Id: Signal_link.cpp 128 2009-06-26 08:43:23Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/include/Signal.h"
9
10
11namespace morpheo              {
12namespace behavioural          {
13
14#undef  FUNCTION
15#define FUNCTION "Signal::link"
16  void Signal::link (Signal * signal_dest,
17                     bool     signal_dest_is_port)
18  {
19    // signal_dest_is_port == 1 when the signal dest is in a top level interface. (else, signal_dest is type "INTERNAL")
20   
21    log_printf(FUNC,Behavioural,FUNCTION,"Begin");
22
23    Signal * signal_src = this;
24
25    // Test
26    if (signal_src ->_is_allocate == false)
27      throw (ERRORMORPHEO (FUNCTION,"Signal \""+_name+"\", can't map with signal \""+        get_name()+"\", because the first signal is not already allocate."));
28    if (signal_dest->_is_allocate == false)
29      throw (ERRORMORPHEO (FUNCTION,"Signal \""+_name+"\", can't map with signal \""+signal_dest->get_name()+"\", because the second signal is not already allocate."));
30
31    // Test if type is compatible
32    if (_type_info != signal_dest->_type_info)
33      throw (ERRORMORPHEO (FUNCTION,toString(_("Signal \"%s\" can't been linked with signal \"%s\" : incompatible type (%s != %s)."),
34                                             _name.c_str(),
35                                             signal_dest->get_name().c_str(),
36                                             toString(_type_info).c_str(),
37                                             toString(signal_dest->_type_info).c_str())));
38
39    // List of all case
40    //
41    //            src         dest
42    // COMPONENT {IN } ----- {SIG} SIGNAL
43    // COMPONENT {OUT} ----- {SIG} SIGNAL
44    //
45    // COMPONENT {IN } ----- {IN } PORT
46    // COMPONENT {OUT} ----- {OUT} PORT
47
48    // list valid case
49
50    if (not (    signal_dest_is_port and (((signal_src->_direction == IN ) and (signal_dest->_direction == IN      )) or
51                                          ((signal_src->_direction == OUT) and (signal_dest->_direction == OUT     )))) and
52        not (not signal_dest_is_port and (((signal_src->_direction == IN ) and (signal_dest->_direction == INTERNAL)) or
53                                          ((signal_src->_direction == OUT) and (signal_dest->_direction == INTERNAL)))))
54      throw (ERRORMORPHEO (FUNCTION,"Signal \""+_name+"\" can't been linked with signal \""+signal_dest->get_name()+"\" : illegal direction ("+toString(signal_src->_direction)+" with "+toString(signal_dest->_direction)+")."));
55
56
57    // Multi consumer is authorized , no to multi producer!
58    bool source_have_multi_consumer      = (signal_src ->_connect_to_signal != NULL);
59//     bool destination_have_multi_producer = (signal_dest->_connect_from_signal != NULL) and (signal_dest_is_port == false);
60//     if (destination_have_multi_producer)
61// //       throw (ERRORMORPHEO (FUNCTION,"Signal \""+_name+"\" can't been linked with signal \""+signal_dest->get_name()+"\" : destination have multi producer."));
62//       log_printf(INFO,Behavioural,FUNCTION,"Signal \"%s\" can't been linked with signal \"%s\" : destination have multi producer.",_name.c_str(),signal_dest->get_name().c_str());
63
64    // update info source
65    signal_src ->_connect_to_signal       = signal_dest;
66    signal_src ->_is_map_as_component_src = true;
67
68    // update info destination
69    if (signal_dest_is_port == true)
70      signal_dest->_is_map_as_toplevel_dest = true; // because toplevel port can't be a source
71    else
72      // signal_dest is a internal signal
73      if (signal_src->_direction == OUT)
74        signal_dest->_is_map_as_component_dest = true;
75      else
76        signal_dest->_is_map_as_component_src  = true;
77   
78    // an internal signal and port can't be a source.
79    // also, to fill the connect_to_signal's field
80    if (signal_dest->_direction == INTERNAL)
81      if (signal_src->_direction == OUT)
82        signal_dest->_connect_from_signal = signal_src;
83      else
84        signal_dest->_connect_to_signal   = signal_src;
85    else
86      signal_dest->_connect_from_signal   = signal_src;
87   
88    // vhdl_testbench : to read an output producte by a internal component
89    // TODO : à vérifier !!!!!!!!!!!!
90    if ((signal_dest_is_port == true) and
91        (signal_src ->_direction == OUT))
92      signal_dest->_sc_signal_map = signal_src ->_sc_signal_map;
93
94    // A signal can be connect once
95    if (not source_have_multi_consumer)
96      connect (signal_dest);
97
98    log_printf(FUNC,Behavioural,FUNCTION,"End");
99  };
100
101}; // end namespace behavioural         
102}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.