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

Last change on this file since 88 was 88, checked in by rosiere, 16 years ago

Almost complete design
with Test and test platform

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