source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_transition.cpp @ 144

Last change on this file since 144 was 144, checked in by rosiere, 14 years ago

1) compatible gcc 4.4.3
2) Translation file in MORPHEO_PREFIX directory

  • Property svn:keywords set to Id
File size: 11.5 KB
Line 
1#ifdef SYSTEMC
2/*
3 * $Id: Multiplier_transition.cpp 144 2010-09-28 11:19:10Z rosiere $
4 *
5 * [ Description ]
6 *
7 */
8
9#include "Behavioural/Generic/Multiplier/include/Multiplier.h"
10
11namespace morpheo                    {
12namespace behavioural {
13namespace generic {
14namespace multiplier {
15
16
17#undef  FUNCTION
18#define FUNCTION "Multiplier::transition"
19  void Multiplier::transition (void)
20  {
21    log_begin(Multiplier,FUNCTION);
22   
23    // Test if stall
24    if (PORT_READ(in_MULTIPLIER_NSTALL))
25      {
26        // Pop a slot of array
27        for (uint32_t i=1;i<_pipeline->size();i++)
28          _pipeline->at(i-1)=_pipeline->at(i);
29
30        result_t data;
31       
32        switch (_param->_size_data)
33          {
34          case 8 :
35            {
36              if (_param->_sign) // 0 = signed, 1 = unsigned
37                {
38                  sc_uint<8> data_0 = static_cast<sc_uint<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
39                  sc_uint<8> data_1 = static_cast<sc_uint<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
40                  sc_uint<16> tmp    = (static_cast<sc_uint<16> >(data_0) * 
41                                        static_cast<sc_uint<16> >(data_1));
42                 
43                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
44                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>8));
45                 
46//                   std::cout << "uint8 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
47//                   std::cout << "uint8 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
48//                   std::cout << "uint8 : tmp    : " << std::hex << tmp << std::dec << std::endl;
49//                   std::cout << "uint8 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
50//                   std::cout << "uint8 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
51                 
52//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
53//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
54//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
55//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
56//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
57//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
58                }
59              else
60                {
61                  sc_int<8> data_0 = static_cast<sc_int<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
62                  sc_int<8> data_1 = static_cast<sc_int<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
63                  sc_int<16> tmp    = (static_cast<sc_int<16> >(data_0) * 
64                                       static_cast<sc_int<16> >(data_1));
65                 
66                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
67                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>8));
68                 
69//                   std::cout << "int8 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
70//                   std::cout << "int8 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
71//                   std::cout << "int8 : tmp    : " << std::hex << tmp << std::dec << std::endl;
72//                   std::cout << "int8 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
73//                   std::cout << "int8 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
74                 
75//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
76//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
77//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
78//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
79//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
80//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
81                }
82              break;
83            }
84          case 16 :
85            {
86              if (_param->_sign) // 0 = signed, 1 = unsigned
87                {
88                  sc_uint<16> data_0 = static_cast<sc_uint<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
89                  sc_uint<16> data_1 = static_cast<sc_uint<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
90                  sc_uint<32> tmp    = (static_cast<sc_uint<32> >(data_0) * 
91                                        static_cast<sc_uint<32> >(data_1));
92                 
93                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
94                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>16));
95                 
96//                   std::cout << "uint16 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
97//                   std::cout << "uint16 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
98//                   std::cout << "uint16 : tmp    : " << std::hex << tmp << std::dec << std::endl;
99//                   std::cout << "uint16 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
100//                   std::cout << "uint16 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
101                 
102//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
103//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
104//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
105//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
106//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
107//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
108                }
109              else
110                {
111                  sc_int<16> data_0 = static_cast<sc_int<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
112                  sc_int<16> data_1 = static_cast<sc_int<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
113                  sc_int<32> tmp    = (static_cast<sc_int<32> >(data_0) * 
114                                       static_cast<sc_int<32> >(data_1));
115                 
116                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
117                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>16));
118                 
119                  std::cout << "int16 : data_0 : " << std::hex << data_0   << std::dec << " - dec : " << data_0 << std::endl;
120                  std::cout << "int16 : data_1 : " << std::hex << data_1   << std::dec << " - dec : " << data_1 << std::endl;
121                  std::cout << "int16 : tmp    : " << std::hex << tmp      << std::dec << " - dec : " << tmp    << std::endl;
122                  std::cout << "int16 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
123                  std::cout << "int16 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
124                 
125//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
126//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
127//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
128//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
129//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
130//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
131                }
132              break;
133            }
134          case 32 :
135            {
136              if (_param->_sign) // 0 = signed, 1 = unsigned
137                {
138                  sc_uint<32> data_0 = static_cast<sc_uint<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
139                  sc_uint<32> data_1 = static_cast<sc_uint<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
140                  sc_uint<64> tmp    = (static_cast<sc_uint<64> >(data_0) * 
141                                        static_cast<sc_uint<64> >(data_1));
142                 
143                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
144                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>32));
145                 
146//                   std::cout << "uint32 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
147//                   std::cout << "uint32 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
148//                   std::cout << "uint32 : tmp    : " << std::hex << tmp << std::dec << std::endl;
149//                   std::cout << "uint32 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
150//                   std::cout << "uint32 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
151                 
152//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
153//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
154//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
155//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
156//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
157//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
158                }
159              else
160                {
161                  sc_int<32> data_0 = static_cast<sc_int<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
162                  sc_int<32> data_1 = static_cast<sc_int<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
163                  sc_int<64> tmp    = (static_cast<sc_int<64> >(data_0) * 
164                                       static_cast<sc_int<64> >(data_1));
165                 
166                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
167                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>32));
168                 
169//                   std::cout << "int32 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
170//                   std::cout << "int32 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
171//                   std::cout << "int32 : tmp    : " << std::hex << tmp << std::dec << std::endl;
172//                   std::cout << "int32 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
173//                   std::cout << "int32 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
174                 
175//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
176//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
177//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
178//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
179//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
180//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
181                }
182              break;
183            }
184          default :
185            {
186              data.LSB = 0;
187              data.MSB = 0;
188
189              break;
190            }
191          }
192       
193        _pipeline->at(_param->_latency-1) = data;
194       
195      }
196   
197#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
198    end_cycle ();
199#endif
200   
201    log_end(Multiplier,FUNCTION);
202  };
203
204}; // end namespace multiplier
205}; // end namespace generic
206
207}; // end namespace behavioural
208}; // end namespace morpheo             
209#endif
Note: See TracBrowser for help on using the repository browser.