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 @ 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: 5.8 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Read_unit_to_Execution_unit_genMealy.cpp 88 2008-12-10 18:31:39Z rosiere $
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][_param->_max_nb_execute_unit_port];
27
28    for (uint32_t i=0; i<_param->_nb_execute_unit; i++)
29      for (uint32_t j=0; j<_param->_nb_execute_unit_port[i]; j++)
30        execute_unit_use[i][j] = false;
31
32    for (uint32_t i=0; i<_param->_nb_read_unit; i++)
33      for (uint32_t j=0; j<_param->_nb_read_unit_port[i]; j++)
34        {
35          bool       ack = false;
36         
37          log_printf(TRACE,Read_unit_to_Execution_unit,FUNCTION,"Test Read_unit[%d][%d]",i,j);
38         
39          if (PORT_READ(in_READ_UNIT_OUT_VAL [i][j]) == true)
40            {
41              log_printf(TRACE,Read_unit_to_Execution_unit,FUNCTION," * have a valid entry.");
42             
43              Tcontext_t context_id    = (_param->_have_port_context_id   )?PORT_READ(in_READ_UNIT_OUT_CONTEXT_ID    [i][j]):0;
44              Tcontext_t front_end_id  = (_param->_have_port_front_end_id )?PORT_READ(in_READ_UNIT_OUT_FRONT_END_ID  [i][j]):0;
45              Tcontext_t ooo_engine_id = (_param->_have_port_ooo_engine_id)?PORT_READ(in_READ_UNIT_OUT_OOO_ENGINE_ID [i][j]):0;
46              Tcontext_t num_thread    = get_num_thread(context_id   , _param->_size_context_id   ,
47                                                        front_end_id , _param->_size_front_end_id ,
48                                                        ooo_engine_id, _param->_size_ooo_engine_id);
49              Ttype_t    type          = PORT_READ(in_READ_UNIT_OUT_TYPE [i][j]);
50             
51#ifdef DEBUG_TEST
52              if (_destination[i][num_thread][type].empty())
53                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)+"].");
54#endif
55             
56              // find a free execute_unit
57              for (std::list<destination_t>::iterator it=_destination[i][num_thread][type].begin();
58                   (it != _destination[i][num_thread][type].end()) and (ack == false);
59                   it++)
60                {
61                  uint32_t dest = (*it).grp;
62                  uint32_t port = (*it).elt;
63                 
64                  log_printf(TRACE,Read_unit_to_Execution_unit,FUNCTION,"   * Test destination [%d][%d].",dest,port);
65                 
66                  if (execute_unit_use [dest][port] == false)
67                    {
68                      log_printf(TRACE,Read_unit_to_Execution_unit,FUNCTION,"     * Is ok! Link.");
69                     
70                      // have find !!!
71                      ack                           = PORT_READ(in_EXECUTE_UNIT_IN_ACK [dest][port]);
72                      execute_unit_use [dest][port] = true;
73
74                      if (_param->_have_port_context_id)
75                      PORT_WRITE(out_EXECUTE_UNIT_IN_CONTEXT_ID            [dest][port], PORT_READ(in_READ_UNIT_OUT_CONTEXT_ID            [i][j]));
76                      if (_param->_have_port_front_end_id)
77                      PORT_WRITE(out_EXECUTE_UNIT_IN_FRONT_END_ID          [dest][port], PORT_READ(in_READ_UNIT_OUT_FRONT_END_ID          [i][j]));
78                      if (_param->_have_port_ooo_engine_id)
79                      PORT_WRITE(out_EXECUTE_UNIT_IN_OOO_ENGINE_ID         [dest][port], PORT_READ(in_READ_UNIT_OUT_OOO_ENGINE_ID         [i][j]));
80                      if (_param->_have_port_rob_ptr  )
81                      PORT_WRITE(out_EXECUTE_UNIT_IN_PACKET_ID             [dest][port], PORT_READ(in_READ_UNIT_OUT_PACKET_ID             [i][j]));
82                      PORT_WRITE(out_EXECUTE_UNIT_IN_OPERATION             [dest][port], PORT_READ(in_READ_UNIT_OUT_OPERATION             [i][j]));
83                      PORT_WRITE(out_EXECUTE_UNIT_IN_TYPE                  [dest][port], PORT_READ(in_READ_UNIT_OUT_TYPE                  [i][j]));
84                      PORT_WRITE(out_EXECUTE_UNIT_IN_HAS_IMMEDIAT          [dest][port], PORT_READ(in_READ_UNIT_OUT_HAS_IMMEDIAT          [i][j]));
85                      PORT_WRITE(out_EXECUTE_UNIT_IN_DATA_RC               [dest][port], PORT_READ(in_READ_UNIT_OUT_DATA_RC               [i][j]));
86                      PORT_WRITE(out_EXECUTE_UNIT_IN_WRITE_RD              [dest][port], PORT_READ(in_READ_UNIT_OUT_WRITE_RD              [i][j]));
87                      PORT_WRITE(out_EXECUTE_UNIT_IN_WRITE_RE              [dest][port], PORT_READ(in_READ_UNIT_OUT_WRITE_RE              [i][j]));
88                      PORT_WRITE(out_EXECUTE_UNIT_IN_NUM_REG_RE            [dest][port], PORT_READ(in_READ_UNIT_OUT_NUM_REG_RE            [i][j]));
89                      PORT_WRITE(out_EXECUTE_UNIT_IN_STORE_QUEUE_PTR_WRITE [dest][port], PORT_READ(in_READ_UNIT_OUT_STORE_QUEUE_PTR_WRITE [i][j]));
90                      if (_param->_have_port_load_queue_ptr)
91                      PORT_WRITE(out_EXECUTE_UNIT_IN_LOAD_QUEUE_PTR_WRITE  [dest][port], PORT_READ(in_READ_UNIT_OUT_LOAD_QUEUE_PTR_WRITE  [i][j]));
92                      PORT_WRITE(out_EXECUTE_UNIT_IN_IMMEDIAT              [dest][port], PORT_READ(in_READ_UNIT_OUT_IMMEDIAT              [i][j]));
93                      PORT_WRITE(out_EXECUTE_UNIT_IN_DATA_RA               [dest][port], PORT_READ(in_READ_UNIT_OUT_DATA_RA               [i][j]));
94                      PORT_WRITE(out_EXECUTE_UNIT_IN_DATA_RB               [dest][port], PORT_READ(in_READ_UNIT_OUT_DATA_RB               [i][j]));
95                      PORT_WRITE(out_EXECUTE_UNIT_IN_NUM_REG_RD            [dest][port], PORT_READ(in_READ_UNIT_OUT_NUM_REG_RD            [i][j]));
96                    }
97                }
98            }
99          PORT_WRITE(out_READ_UNIT_OUT_ACK [i][j], ack);
100        }
101
102    for (uint32_t i=0; i<_param->_nb_execute_unit; i++)
103      for (uint32_t j=0; j<_param->_nb_execute_unit_port[i]; j++)
104        PORT_WRITE(out_EXECUTE_UNIT_IN_VAL[i][j], execute_unit_use[i][j]);
105
106    log_printf(FUNC,Read_unit_to_Execution_unit,FUNCTION,"End");
107  };
108
109}; // end namespace read_unit_to_execution_unit
110}; // end namespace network
111}; // end namespace execute_loop
112}; // end namespace multi_execute_loop
113}; // end namespace core
114
115}; // end namespace behavioural
116}; // end namespace morpheo             
117#endif
Note: See TracBrowser for help on using the repository browser.