source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Stat_List_unit/src/Stat_List_unit_genMoore.cpp @ 118

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

1) Stat List : scan all queue to find free register
2) Write_queue : test "genMealy" add bypass [0]
3) Functionnal_unit : add const parameters to add or not the pipeline_in
4) Load Store Unit : if load make an exception, free nb_check
5) Debug, change test to add model

  • Property svn:keywords set to Id
File size: 4.6 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Stat_List_unit_genMoore.cpp 118 2009-05-20 22:01:32Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Stat_List_unit/include/Stat_List_unit.h"
10#include <set>
11
12namespace morpheo                    {
13namespace behavioural {
14namespace core {
15namespace multi_ooo_engine {
16namespace ooo_engine {
17namespace rename_unit {
18namespace register_translation_unit {
19namespace stat_list_unit {
20
21#define STAT_LIST_SCAN_ALL
22
23#undef  FUNCTION
24#define FUNCTION "Stat_List_unit::genMoore"
25  void Stat_List_unit::genMoore (void)
26  {
27    log_begin(Stat_List_unit,FUNCTION);
28    log_function(Stat_List_unit,FUNCTION,_name.c_str());
29
30    uint32_t  gpr_ptr = reg_GPR_PTR_FREE;
31    uint32_t  spr_ptr = reg_SPR_PTR_FREE;
32#ifdef STAT_LIST_SCAN_ALL
33    std::set<Tgeneral_address_t> list_gpr_free;
34    std::set<Tspecial_address_t> list_spr_free;
35#endif
36
37    for (uint32_t i=0; i<_param->_nb_reg_free; i++)
38      {
39        log_printf(TRACE,Stat_List_unit,FUNCTION,"  * PUSH [%d]",i);
40         
41        uint32_t offset  = i*_param->_nb_bank_by_port_free;
42
43        // PUSH_GPR
44        {
45          bool     val      = false;
46          uint32_t bank_gpr = offset;
47
48#ifdef STAT_LIST_SCAN_ALL
49          for (uint32_t _gpr_ptr=0;  _gpr_ptr<_param->_nb_general_register_by_bank; ++_gpr_ptr)
50            {
51              gpr_ptr = (gpr_ptr+1)%_param->_nb_general_register_by_bank;
52#endif   
53              for (bank_gpr = offset; bank_gpr<offset+_param->_nb_bank_by_port_free; bank_gpr++)
54                if (gpr_stat_list[bank_gpr][gpr_ptr].can_free())
55                  {
56#ifdef STAT_LIST_SCAN_ALL
57                    Tgeneral_address_t num_reg = ((bank_gpr<<_param->_shift_gpr) | gpr_ptr);
58                    if (list_gpr_free.find(num_reg) == list_gpr_free.end())
59                      {
60                        list_gpr_free.insert(num_reg);
61#endif
62                        val = true;
63                        break;
64#ifdef STAT_LIST_SCAN_ALL
65                      }
66#endif
67                  }
68#ifdef STAT_LIST_SCAN_ALL
69              if (val)
70                break;
71            }
72#endif   
73
74          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * val      : %d",val);
75          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * bank_gpr : %d",bank_gpr);
76          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * gpr_ptr  : %d",gpr_ptr);
77          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * num_reg  : %d",((bank_gpr<<_param->_shift_gpr) | gpr_ptr));
78
79          internal_PUSH_GPR_VAL      [i] = val;
80          internal_PUSH_GPR_NUM_BANK [i] = bank_gpr;
81          internal_PUSH_GPR_NUM_REG  [i] = gpr_ptr ;
82
83          PORT_WRITE(out_PUSH_GPR_VAL [i], val);
84          if (val)
85            PORT_WRITE(out_PUSH_GPR_NUM_REG[i], ((bank_gpr<<_param->_shift_gpr) | gpr_ptr));
86        }
87
88        // PUSH_SPR
89        {
90          bool     val      = false;
91          uint32_t bank_spr = offset;
92
93#ifdef STAT_LIST_SCAN_ALL
94          for (uint32_t _spr_ptr=0;  _spr_ptr<_param->_nb_special_register_by_bank; ++_spr_ptr)
95            {
96              spr_ptr = (spr_ptr+1)%_param->_nb_special_register_by_bank;
97#endif   
98              for (bank_spr = offset; bank_spr<offset+_param->_nb_bank_by_port_free; bank_spr++)
99                if (spr_stat_list[bank_spr][spr_ptr].can_free())
100                  {
101#ifdef STAT_LIST_SCAN_ALL
102                    Tspecial_address_t num_reg = ((bank_spr<<_param->_shift_spr) | spr_ptr);
103                    if (list_spr_free.find(num_reg) == list_spr_free.end())
104                      {
105                        list_spr_free.insert(num_reg);
106#endif
107                        val = true;
108                        break;
109#ifdef STAT_LIST_SCAN_ALL
110                      }
111#endif
112                  }
113#ifdef STAT_LIST_SCAN_ALL
114              if (val)
115                break;
116            }
117#endif   
118
119          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * val      : %d",val);
120          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * bank_spr : %d",bank_spr);
121          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * spr_ptr  : %d",spr_ptr);
122          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * num_reg  : %d",((bank_spr<<_param->_shift_spr) | spr_ptr));
123
124          internal_PUSH_SPR_VAL      [i] = val;
125          internal_PUSH_SPR_NUM_BANK [i] = bank_spr;
126          internal_PUSH_SPR_NUM_REG  [i] = spr_ptr ;
127
128          PORT_WRITE(out_PUSH_SPR_VAL [i], val);
129          if (val)
130            PORT_WRITE(out_PUSH_SPR_NUM_REG[i], ((bank_spr<<_param->_shift_spr) | spr_ptr));
131        }
132
133
134      }
135   
136    log_end(Stat_List_unit,FUNCTION);
137  };
138
139}; // end namespace stat_list_unit
140}; // end namespace register_translation_unit
141}; // end namespace rename_unit
142}; // end namespace ooo_engine
143}; // end namespace multi_ooo_engine
144}; // end namespace core
145
146}; // end namespace behavioural
147}; // end namespace morpheo             
148#endif
Note: See TracBrowser for help on using the repository browser.