source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Network/Read_unit_to_Execution_unit/src/Read_unit_to_Execution_unit_genMealy.cpp @ 77

Last change on this file since 77 was 77, checked in by rosiere, 16 years ago
  • Add two component :
    • network between read unit and execute unit
    • network between execute unit and write unit
  • remove parameters "nb_operation" and "nb_type"
  • in write_queue add the special case : load_speculative
File size: 5.3 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id$
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Network/Read_unit_to_Execution_unit/include/Read_unit_to_Execution_unit.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace core {
14namespace multi_execute_loop {
15namespace execute_loop {
16namespace network {
17namespace read_unit_to_execution_unit {
18
19
20#undef  FUNCTION
21#define FUNCTION "Read_unit_to_Execution_unit::genMealy"
22  void Read_unit_to_Execution_unit::genMealy (void)
23  {
24    log_printf(FUNC,Read_unit_to_Execution_unit,FUNCTION,"Begin");
25
26    bool execute_unit_use [_param->_nb_execute_unit];
27
28    for (uint32_t i=0; i<_param->_nb_execute_unit; i++)
29      execute_unit_use[i] = (PORT_READ(in_EXECUTE_UNIT_IN_ACK [i]) == 0);
30
31    for (uint32_t i=0; i<_param->_nb_read_unit; i++)
32      {
33        bool       ack = false;
34
35        log_printf(TRACE,Read_unit_to_Execution_unit,FUNCTION,"Test Read_unit[%d]",i);
36
37        if (PORT_READ(in_READ_UNIT_OUT_VAL [i]) == true)
38          {
39            log_printf(TRACE,Read_unit_to_Execution_unit,FUNCTION," * have a valid entry.");
40           
41            Tcontext_t context_id    = (_param->_have_port_context_id   )?PORT_READ(in_READ_UNIT_OUT_CONTEXT_ID    [i]):0;
42            Tcontext_t front_end_id  = (_param->_have_port_front_end_id )?PORT_READ(in_READ_UNIT_OUT_FRONT_END_ID  [i]):0;
43            Tcontext_t ooo_engine_id = (_param->_have_port_ooo_engine_id)?PORT_READ(in_READ_UNIT_OUT_OOO_ENGINE_ID [i]):0;
44            Tcontext_t num_thread    = get_num_thread(context_id   , _param->_size_context_id   ,
45                                                      front_end_id , _param->_size_front_end_id ,
46                                                      ooo_engine_id, _param->_size_ooo_engine_id);
47            Ttype_t    type          = PORT_READ(in_READ_UNIT_OUT_TYPE [i]);
48           
49#ifdef DEBUG_TEST
50            if (_destination[i][num_thread][type].empty())
51              throw ERRORMORPHEO(FUNCTION,"Invalid Operation : They have no execute_unit to receive a operation from the read_unit ["+toString(i)+"], thread ["+toString(num_thread)+"] and a operation's type ["+toString_type(type)+"].");
52#endif
53
54            // find a free execute_unit
55            for (std::list<uint32_t>::iterator it=_destination[i][num_thread][type].begin();
56                 (it != _destination[i][num_thread][type].end()) and (ack == false);
57                 it++)
58              {
59                uint32_t dest = *it;
60
61                log_printf(TRACE,Read_unit_to_Execution_unit,FUNCTION,"   * Test destination [%d].",dest);
62                           
63                if (execute_unit_use [dest] == false)
64                  {
65                    log_printf(TRACE,Read_unit_to_Execution_unit,FUNCTION,"     * Is ok! Link.");
66                    // have find !!!
67                    ack                     = true;
68                    execute_unit_use [dest] = true;
69
70                    if (_param->_have_port_context_id)
71                    PORT_WRITE(out_EXECUTE_UNIT_IN_CONTEXT_ID            [dest], PORT_READ(in_READ_UNIT_OUT_CONTEXT_ID            [i]));
72                    if (_param->_have_port_front_end_id)
73                    PORT_WRITE(out_EXECUTE_UNIT_IN_FRONT_END_ID          [dest], PORT_READ(in_READ_UNIT_OUT_FRONT_END_ID          [i]));
74                    if (_param->_have_port_ooo_engine_id)
75                    PORT_WRITE(out_EXECUTE_UNIT_IN_OOO_ENGINE_ID         [dest], PORT_READ(in_READ_UNIT_OUT_OOO_ENGINE_ID         [i]));
76                    if (_param->_have_port_packet_id)
77                    PORT_WRITE(out_EXECUTE_UNIT_IN_PACKET_ID             [dest], PORT_READ(in_READ_UNIT_OUT_PACKET_ID             [i]));
78                    PORT_WRITE(out_EXECUTE_UNIT_IN_OPERATION             [dest], PORT_READ(in_READ_UNIT_OUT_OPERATION             [i]));
79                    PORT_WRITE(out_EXECUTE_UNIT_IN_TYPE                  [dest], PORT_READ(in_READ_UNIT_OUT_TYPE                  [i]));
80                    PORT_WRITE(out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE [dest], PORT_READ(in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE [i]));
81                    PORT_WRITE(out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE  [dest], PORT_READ(in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE  [i]));
82                    PORT_WRITE(out_EXECUTE_UNIT_IN_HAS_IMMEDIAT          [dest], PORT_READ(in_READ_UNIT_OUT_HAS_IMMEDIAT          [i]));
83                    PORT_WRITE(out_EXECUTE_UNIT_IN_IMMEDIAT              [dest], PORT_READ(in_READ_UNIT_OUT_IMMEDIAT              [i]));
84                    PORT_WRITE(out_EXECUTE_UNIT_IN_DATA_RA               [dest], PORT_READ(in_READ_UNIT_OUT_DATA_RA               [i]));
85                    PORT_WRITE(out_EXECUTE_UNIT_IN_DATA_RB               [dest], PORT_READ(in_READ_UNIT_OUT_DATA_RB               [i]));
86                    PORT_WRITE(out_EXECUTE_UNIT_IN_DATA_RC               [dest], PORT_READ(in_READ_UNIT_OUT_DATA_RC               [i]));
87                    PORT_WRITE(out_EXECUTE_UNIT_IN_WRITE_RD              [dest], PORT_READ(in_READ_UNIT_OUT_WRITE_RD              [i]));
88                    PORT_WRITE(out_EXECUTE_UNIT_IN_NUM_REG_RD            [dest], PORT_READ(in_READ_UNIT_OUT_NUM_REG_RD            [i]));
89                    PORT_WRITE(out_EXECUTE_UNIT_IN_WRITE_RE              [dest], PORT_READ(in_READ_UNIT_OUT_WRITE_RE              [i]));
90                    PORT_WRITE(out_EXECUTE_UNIT_IN_NUM_REG_RE            [dest], PORT_READ(in_READ_UNIT_OUT_NUM_REG_RE            [i]));
91                  }
92              }
93          }
94        PORT_WRITE(out_READ_UNIT_OUT_ACK [i], ack);
95      }
96
97    for (uint32_t i=0; i<_param->_nb_execute_unit; i++)
98      {
99        PORT_WRITE(out_EXECUTE_UNIT_IN_VAL[i], execute_unit_use[i]); 
100      }
101
102    log_printf(FUNC,Read_unit_to_Execution_unit,FUNCTION,"End");
103  };
104
105}; // end namespace read_unit_to_execution_unit
106}; // end namespace network
107}; // end namespace execute_loop
108}; // end namespace multi_execute_loop
109}; // end namespace core
110
111}; // end namespace behavioural
112}; // end namespace morpheo             
113#endif
Note: See TracBrowser for help on using the repository browser.