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 @ 123

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

1) Fix performance
2) add auto generation to SPECINT2000
3) add reset in genMoore and genMealy

  • Property svn:keywords set to Id
File size: 5.2 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Stat_List_unit_genMoore.cpp 123 2009-06-08 20:43:30Z 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    if (PORT_READ(in_NRESET))
31      {
32    uint32_t  gpr_ptr = reg_GPR_PTR_FREE;
33    uint32_t  spr_ptr = reg_SPR_PTR_FREE;
34#ifdef STAT_LIST_SCAN_ALL
35    std::set<Tgeneral_address_t> list_gpr_free;
36    std::set<Tspecial_address_t> list_spr_free;
37#endif
38
39    for (uint32_t i=0; i<_param->_nb_reg_free; i++)
40      {
41        log_printf(TRACE,Stat_List_unit,FUNCTION,"  * PUSH [%d]",i);
42         
43        uint32_t offset  = i*_param->_nb_bank_by_port_free;
44
45        // PUSH_GPR
46        {
47          bool     val      = false;
48          uint32_t bank_gpr = offset;
49
50#ifdef STAT_LIST_SCAN_ALL
51          for (uint32_t _gpr_ptr=0;  _gpr_ptr<_param->_nb_general_register_by_bank; ++_gpr_ptr)
52            {
53              gpr_ptr = (gpr_ptr+1)%_param->_nb_general_register_by_bank;
54#endif   
55              for (bank_gpr = offset; bank_gpr<offset+_param->_nb_bank_by_port_free; bank_gpr++)
56                if (gpr_stat_list[bank_gpr][gpr_ptr].can_free())
57                  {
58#ifdef STAT_LIST_SCAN_ALL
59                    Tgeneral_address_t num_reg = ((bank_gpr<<_param->_shift_gpr) | gpr_ptr);
60                    if (list_gpr_free.find(num_reg) == list_gpr_free.end())
61                      {
62                        list_gpr_free.insert(num_reg);
63#endif
64                        val = true;
65                        break;
66#ifdef STAT_LIST_SCAN_ALL
67                      }
68#endif
69                  }
70#ifdef STAT_LIST_SCAN_ALL
71              if (val)
72                break;
73            }
74#endif   
75
76          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * val      : %d",val);
77          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * bank_gpr : %d",bank_gpr);
78          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * gpr_ptr  : %d",gpr_ptr);
79          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * num_reg  : %d",((bank_gpr<<_param->_shift_gpr) | gpr_ptr));
80
81          internal_PUSH_GPR_VAL      [i] = val;
82          internal_PUSH_GPR_NUM_BANK [i] = bank_gpr;
83          internal_PUSH_GPR_NUM_REG  [i] = gpr_ptr ;
84
85          if (val)
86            PORT_WRITE(out_PUSH_GPR_NUM_REG[i], ((bank_gpr<<_param->_shift_gpr) | gpr_ptr));
87        }
88
89        // PUSH_SPR
90        {
91          bool     val      = false;
92          uint32_t bank_spr = offset;
93
94#ifdef STAT_LIST_SCAN_ALL
95          for (uint32_t _spr_ptr=0;  _spr_ptr<_param->_nb_special_register_by_bank; ++_spr_ptr)
96            {
97              spr_ptr = (spr_ptr+1)%_param->_nb_special_register_by_bank;
98#endif   
99              for (bank_spr = offset; bank_spr<offset+_param->_nb_bank_by_port_free; bank_spr++)
100                if (spr_stat_list[bank_spr][spr_ptr].can_free())
101                  {
102#ifdef STAT_LIST_SCAN_ALL
103                    Tspecial_address_t num_reg = ((bank_spr<<_param->_shift_spr) | spr_ptr);
104                    if (list_spr_free.find(num_reg) == list_spr_free.end())
105                      {
106                        list_spr_free.insert(num_reg);
107#endif
108                        val = true;
109                        break;
110#ifdef STAT_LIST_SCAN_ALL
111                      }
112#endif
113                  }
114#ifdef STAT_LIST_SCAN_ALL
115              if (val)
116                break;
117            }
118#endif   
119
120          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * val      : %d",val);
121          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * bank_spr : %d",bank_spr);
122          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * spr_ptr  : %d",spr_ptr);
123          log_printf(TRACE,Stat_List_unit,FUNCTION,"    * num_reg  : %d",((bank_spr<<_param->_shift_spr) | spr_ptr));
124
125          internal_PUSH_SPR_VAL      [i] = val;
126          internal_PUSH_SPR_NUM_BANK [i] = bank_spr;
127          internal_PUSH_SPR_NUM_REG  [i] = spr_ptr ;
128
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    else
137      {
138        for (uint32_t i=0; i<_param->_nb_reg_free; i++)
139          {
140            internal_PUSH_GPR_VAL      [i] = 0;
141//          internal_PUSH_GPR_NUM_BANK [i] = bank_gpr;
142//          internal_PUSH_GPR_NUM_REG  [i] = gpr_ptr ;
143            internal_PUSH_SPR_VAL      [i] = 0;
144//          internal_PUSH_SPR_NUM_BANK [i] = bank_spr;
145//          internal_PUSH_SPR_NUM_REG  [i] = spr_ptr ;
146          }
147      }
148
149    for (uint32_t i=0; i<_param->_nb_reg_free; i++)
150      {
151        PORT_WRITE(out_PUSH_GPR_VAL [i], internal_PUSH_GPR_VAL      [i]);
152        PORT_WRITE(out_PUSH_SPR_VAL [i], internal_PUSH_SPR_VAL      [i]);
153      }
154 
155    log_end(Stat_List_unit,FUNCTION);
156  };
157
158}; // end namespace stat_list_unit
159}; // end namespace register_translation_unit
160}; // end namespace rename_unit
161}; // end namespace ooo_engine
162}; // end namespace multi_ooo_engine
163}; // end namespace core
164
165}; // end namespace behavioural
166}; // end namespace morpheo             
167#endif
Note: See TracBrowser for help on using the repository browser.