source: branches/ODCCP/communication/dspin_dhccp_param/caba/source/include/dspin_dhccp_param.h @ 460

Last change on this file since 460 was 460, checked in by devigne, 11 years ago

Introducing merged components between the last trunk TSAR version
and the ODCCP modifications

File size: 16.6 KB
Line 
1/* -*- c++ -*-
2 * File         : dspin_dhccp_param.h
3 * Date         : 01/03/2013
4 * Copyright    : UPMC / LIP6
5 * Authors      : Cesar Fuguet
6 *
7 * SOCLIB_LGPL_HEADER_BEGIN
8 *
9 * This file is part of SoCLib, GNU LGPLv2.1.
10 *
11 * SoCLib is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU Lesser General Public License as published
13 * by the Free Software Foundation; version 2.1 of the License.
14 *
15 * SoCLib is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with SoCLib; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 * 02110-1301 USA
24 *
25 * SOCLIB_LGPL_HEADER_END
26 */
27
28
29#ifndef DSPIN_DHCCP_PARAMS_H
30#define DSPIN_DHCCP_PARAMS_H
31
32#include <inttypes.h>
33#include <assert.h>
34
35namespace soclib { namespace caba {
36
37/*
38 * L1 cache to Memory Cache command packets
39 *
40 * CLEANUP
41 *
42 * flit 1
43 * ----------------------------------------------------------------------------------------------
44 * EOP:0 |    DEST    |   SRCID   | NLINE MSB(2 bits)| X | WAY_INDEX(2 bits) | TYPE:0b1X | BC:0
45 *       |  (10 bits) | (14 bits) |                  |   |                   |           |
46 * ----------------------------------------------------------------------------------------------
47 *                                                                                 | X: 0 DATA  |
48 *                                                                                 |    1 INST  |
49 * flit 2
50 * ----------------------------------------------------------------------------------------------
51 * EOP:0/1 |                                                                       NLINE(32 bits)
52 * ----------------------------------------------------------------------------------------------
53 *
54 * flit N for data
55 * ----------------------------------------------------------------------------------------------
56 * EOP:0/1 |                                                                       WDATA(32 bits)
57 * ----------------------------------------------------------------------------------------------
58 *
59 * MULTICAST ACKNOWLEDGEMENT
60 *
61 * flit 1
62 * ----------------------------------------------------------------------------------------------
63 * EOP:1 |     DEST(10 bits)     |       X(15 bits)       | UPDT_INDEX(4 bits) | TYPE:0b00 | BC:0
64 * ----------------------------------------------------------------------------------------------
65 */
66
67/*
68 * Memory Cache to L1 cache command packets
69 *
70 * CLEANUP ACKNOWLEDGEMENT
71 *
72 * flit 1
73 * ----------------------------------------------------------------------------------------------
74 * EOP:1 | DEST(14 bits) | X(3 bits) | SET_INDEX(16 bits) | WAY_INDEX(2 bits) | TYPE:0b10X | BC:0
75 * ----------------------------------------------------------------------------------------------
76 *                                                                            | X: 0 DATA  |
77 *                                                                            |    1 INST  |
78 *
79 * MULTICAST UPDATE
80 *
81 * flit 1
82 * ----------------------------------------------------------------------------------------------
83 * EOP:0 | DEST(14 bits) | X(3 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b00X  | BC:0
84 * ----------------------------------------------------------------------------------------------
85 *                                                                           | X: 0 DATA   |
86 *                                                                           |    1 INST   |
87 * flit 2
88 * ----------------------------------------------------------------------------------------------
89 * EOP:0 | X | WORD_INDEX(4 bits)  |                                             NLINE (34 bits)
90 * ----------------------------------------------------------------------------------------------
91 *
92 * flit 3
93 * ----------------------------------------------------------------------------------------------
94 * EOP:0 | X(3 bits)  | BE(4 bits) |                                              WDATA(32 bits)
95 * ----------------------------------------------------------------------------------------------
96 *
97 * flit N
98 * ----------------------------------------------------------------------------------------------
99 * EOP:1 | X(3 bits)  | BE(4 bits) |                                              WDATA(32 bits)
100 * ----------------------------------------------------------------------------------------------
101 *
102 * MULTICAST INVALIDATE
103 *
104 * flit 1
105 * ----------------------------------------------------------------------------------------------
106 * EOP:0 | DEST(14 bits) | X(3 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b01X | BC:0
107 * ----------------------------------------------------------------------------------------------
108 *                                                                           | X: 0 DATA  |
109 *                                                                           |    1 INST  |
110 * flit 2
111 * ----------------------------------------------------------------------------------------------
112 * EOP:1 | X(5 bits) |                                                           NLINE (34 bits)
113 * ----------------------------------------------------------------------------------------------
114 *
115 * BROADCAST INVALIDATE
116 *
117 * flit 1
118 *       | BOUNDING BOX(20 bits)            |
119 * ----------------------------------------------------------------------------------------------
120 * EOP:0 | XMIN   | XMAX   | YMIN   | YMAX  | MEMC_ID(14 bits) | NETWORK_RESERVED(4 bits) | BC:1
121 * ----------------------------------------------------------------------------------------------
122 *
123 * flit 2
124 * ----------------------------------------------------------------------------------------------
125 * EOP:1 |        X(5 bits)       |                                              NLINE (34 bits)
126 * ----------------------------------------------------------------------------------------------
127 */
128
129/*
130 * Utility MACROS
131 */
132#define GET_FIELD(x,y)\
133    case y: return ((x >> y##_SHIFT) & y##_MASK)
134
135#define SET_FIELD(x,y,z)\
136    case z: x |= ((y & z##_MASK) << z##_SHIFT);break
137
138class DspinDhccpParam
139{
140  public:
141
142    static const uint8_t  from_memc_flit_width            = 40;
143    static const uint8_t  from_l1_flit_width              = 33;
144
145    static const uint8_t  UPDT_INDEX_WIDTH                = 4;
146    static const uint8_t  NLINE_WIDTH                     = 34;
147    static const uint8_t  SRCID_WIDTH                     = 14;
148    static const uint8_t  GLOBALID_WIDTH                  = 10;
149    static const uint8_t  WORD_INDEX_WIDTH                = 4;
150    static const uint8_t  BE_WIDTH                        = 4;
151    static const uint8_t  DATA_WIDTH                      = 32;
152    static const uint8_t  SET_INDEX_WIDTH                 = 16;
153    static const uint8_t  WAY_INDEX_WIDTH                 = 2;
154    static const uint8_t  BROADCAST_BOX_WIDTH             = 20;
155    static const uint8_t  MC_TYPE_WIDTH                   = 3;
156    static const uint8_t  L1_TYPE_WIDTH                   = 2;
157
158    static const uint8_t  FROM_L1_TYPE_SHIFT              = 1;
159    static const uint64_t FROM_L1_TYPE_MASK               = ((1ULL<<L1_TYPE_WIDTH)-1);
160    static const uint8_t  FROM_L1_EOP_SHIFT               = 32;
161    static const uint64_t FROM_L1_EOP_MASK                = 1;
162    static const uint8_t  FROM_L1_BC_SHIFT                = 0;
163    static const uint64_t FROM_L1_BC_MASK                 = 1;
164
165    static const uint8_t  CLEANUP_NCC_SHIFT               = 5;
166    static const uint64_t CLEANUP_NCC_MASK                = 1;
167    static const uint8_t  CLEANUP_DEST_SHIFT              = 22;
168    static const uint64_t CLEANUP_DEST_MASK               = ((1ULL<<GLOBALID_WIDTH)-1);
169    static const uint8_t  CLEANUP_SRCID_SHIFT             = 8;
170    static const uint64_t CLEANUP_SRCID_MASK              = ((1ULL<<SRCID_WIDTH)-1);
171    static const uint8_t  CLEANUP_NLINE_MSB_SHIFT         = 6;
172    static const uint64_t CLEANUP_NLINE_MSB_MASK          = ((1ULL<< 2)-1);
173    static const uint8_t  CLEANUP_WAY_INDEX_SHIFT         = 3;
174    static const uint64_t CLEANUP_WAY_INDEX_MASK          = ((1ULL<<WAY_INDEX_WIDTH)-1);
175    static const uint8_t  CLEANUP_NLINE_LSB_SHIFT         = 0;
176    static const uint64_t CLEANUP_NLINE_LSB_MASK          = ((1ULL<<32)-1);
177    static const uint8_t  CLEANUP_DATA_UPDT_SHIFT         = 0;
178    static const uint64_t CLEANUP_DATA_UPDT_MASK          = ((1ULL<<32)-1);
179
180    static const uint8_t  MULTI_ACK_DEST_SHIFT            = CLEANUP_DEST_SHIFT;
181    static const uint64_t MULTI_ACK_DEST_MASK             = CLEANUP_DEST_MASK;
182    static const uint8_t  MULTI_ACK_UPDT_INDEX_SHIFT      = 3;
183    static const uint64_t MULTI_ACK_UPDT_INDEX_MASK       = ((1ULL<<UPDT_INDEX_WIDTH)-1);
184
185    static const uint8_t  FROM_MC_TYPE_SHIFT              = 1;
186    static const uint64_t FROM_MC_TYPE_MASK               = ((1ULL<<MC_TYPE_WIDTH)-1);
187    static const uint8_t  FROM_MC_EOP_SHIFT               = 39;
188    static const uint64_t FROM_MC_EOP_MASK                = 1;
189    static const uint8_t  FROM_MC_BC_SHIFT                = 0;
190    static const uint64_t FROM_MC_BC_MASK                 = 1;
191
192    static const uint8_t  MULTI_INVAL_DEST_SHIFT          = 25;
193    static const uint64_t MULTI_INVAL_DEST_MASK           = ((1ULL<<SRCID_WIDTH)-1);
194    static const uint8_t  MULTI_INVAL_SRCID_SHIFT         = 8;
195    static const uint64_t MULTI_INVAL_SRCID_MASK          = ((1ULL<<SRCID_WIDTH)-1);
196    static const uint8_t  MULTI_INVAL_UPDT_INDEX_SHIFT    = 4;
197    static const uint64_t MULTI_INVAL_UPDT_INDEX_MASK     = ((1ULL<<UPDT_INDEX_WIDTH)-1);
198    static const uint8_t  MULTI_INVAL_NLINE_SHIFT         = 0;
199    static const uint64_t MULTI_INVAL_NLINE_MASK          = ((1ULL<<NLINE_WIDTH)-1);
200
201    static const uint8_t  MULTI_UPDT_DEST_SHIFT           = MULTI_INVAL_DEST_SHIFT;
202    static const uint64_t MULTI_UPDT_DEST_MASK            = MULTI_INVAL_DEST_MASK;
203    static const uint8_t  MULTI_UPDT_SRCID_SHIFT          = MULTI_INVAL_SRCID_SHIFT;
204    static const uint64_t MULTI_UPDT_SRCID_MASK           = MULTI_INVAL_SRCID_MASK;
205    static const uint8_t  MULTI_UPDT_UPDT_INDEX_SHIFT     = MULTI_INVAL_UPDT_INDEX_SHIFT;
206    static const uint64_t MULTI_UPDT_UPDT_INDEX_MASK      = MULTI_INVAL_UPDT_INDEX_MASK;
207    static const uint8_t  MULTI_UPDT_WORD_INDEX_SHIFT     = 34;
208    static const uint64_t MULTI_UPDT_WORD_INDEX_MASK      = ((1ULL<<WORD_INDEX_WIDTH)-1);
209    static const uint8_t  MULTI_UPDT_NLINE_SHIFT          = MULTI_INVAL_NLINE_SHIFT;
210    static const uint64_t MULTI_UPDT_NLINE_MASK           = MULTI_INVAL_NLINE_MASK;
211    static const uint8_t  MULTI_UPDT_BE_SHIFT             = 32;
212    static const uint64_t MULTI_UPDT_BE_MASK              = ((1ULL<<BE_WIDTH)-1);
213    static const uint8_t  MULTI_UPDT_DATA_SHIFT           = 0;
214    static const uint64_t MULTI_UPDT_DATA_MASK            = ((1ULL<<DATA_WIDTH)-1);
215
216    static const uint8_t  CLEANUP_ACK_DEST_SHIFT          = MULTI_INVAL_DEST_SHIFT;
217    static const uint64_t CLEANUP_ACK_DEST_MASK           = MULTI_INVAL_DEST_MASK;
218    static const uint8_t  CLEANUP_ACK_SET_SHIFT           = 6;
219    static const uint64_t CLEANUP_ACK_SET_MASK            = ((1ULL<<SET_INDEX_WIDTH)-1);
220    static const uint8_t  CLEANUP_ACK_WAY_SHIFT           = 4;
221    static const uint64_t CLEANUP_ACK_WAY_MASK            = ((1ULL<<WAY_INDEX_WIDTH)-1);
222
223    static const uint8_t  BROADCAST_BOX_SHIFT             = 19;
224    static const uint64_t BROADCAST_BOX_MASK              = ((1ULL<<BROADCAST_BOX_WIDTH)-1);
225    static const uint8_t  BROADCAST_SRCID_SHIFT           = 5;
226    static const uint64_t BROADCAST_SRCID_MASK            = MULTI_INVAL_SRCID_MASK;
227    static const uint8_t  BROADCAST_NLINE_SHIFT           = 0;
228    static const uint64_t BROADCAST_NLINE_MASK            = MULTI_INVAL_NLINE_MASK;
229
230    /*
231     * L1 cache to Memory Cache command types
232     */
233    enum
234    {
235      TYPE_MULTI_ACK    = 0,
236      TYPE_CLEANUP      = 2,
237      TYPE_CLEANUP_DATA = TYPE_CLEANUP,
238      TYPE_CLEANUP_INST = 3
239    };
240
241    /*
242     * Memory Cache to L1 cache command types
243     */
244    enum
245    {
246      TYPE_MULTI_UPDT       = 0,
247      TYPE_MULTI_UPDT_DATA  = TYPE_MULTI_UPDT,
248      TYPE_MULTI_UPDT_INST  = 1,
249      TYPE_MULTI_INVAL      = 2,
250      TYPE_MULTI_INVAL_DATA = TYPE_MULTI_INVAL,
251      TYPE_MULTI_INVAL_INST = 3,
252      TYPE_CLEANUP_ACK      = 4,
253      TYPE_CLEANUP_ACK_DATA = TYPE_CLEANUP_ACK,
254      TYPE_CLEANUP_ACK_INST = 5
255    };
256
257    enum flit_field_e
258    {
259      FROM_L1_TYPE,
260      FROM_L1_EOP,
261      FROM_L1_BC,
262
263      CLEANUP_NCC,
264      CLEANUP_DEST,
265      CLEANUP_SRCID,
266      CLEANUP_NLINE_MSB,
267      CLEANUP_WAY_INDEX,
268      CLEANUP_NLINE_LSB,
269      CLEANUP_DATA_UPDT,
270
271      MULTI_ACK_DEST,
272      MULTI_ACK_UPDT_INDEX,
273
274      FROM_MC_TYPE,
275      FROM_MC_EOP,
276      FROM_MC_BC,
277
278      MULTI_INVAL_DEST,
279      MULTI_INVAL_SRCID,
280      MULTI_INVAL_UPDT_INDEX,
281      MULTI_INVAL_NLINE,
282
283      MULTI_UPDT_DEST,
284      MULTI_UPDT_SRCID,
285      MULTI_UPDT_UPDT_INDEX,
286      MULTI_UPDT_WORD_INDEX,
287      MULTI_UPDT_NLINE,
288      MULTI_UPDT_BE,
289      MULTI_UPDT_DATA,
290
291      CLEANUP_ACK_DEST,
292      CLEANUP_ACK_SET,
293      CLEANUP_ACK_WAY,
294
295      BROADCAST_BOX,
296      BROADCAST_SRCID,
297      BROADCAST_NLINE
298    };
299
300    static uint64_t dspin_get(uint64_t flit, flit_field_e field)
301    {
302      switch(field)
303      {
304        GET_FIELD(flit,FROM_L1_TYPE);
305        GET_FIELD(flit,FROM_L1_EOP);
306        GET_FIELD(flit,FROM_L1_BC);
307        GET_FIELD(flit,CLEANUP_NCC);
308        GET_FIELD(flit,CLEANUP_DEST);
309        GET_FIELD(flit,CLEANUP_SRCID);
310        GET_FIELD(flit,CLEANUP_NLINE_MSB);
311        GET_FIELD(flit,CLEANUP_WAY_INDEX);
312        GET_FIELD(flit,CLEANUP_NLINE_LSB);
313        GET_FIELD(flit,CLEANUP_DATA_UPDT);
314        GET_FIELD(flit,MULTI_ACK_DEST);
315        GET_FIELD(flit,MULTI_ACK_UPDT_INDEX);
316        GET_FIELD(flit,FROM_MC_TYPE);
317        GET_FIELD(flit,FROM_MC_EOP);
318        GET_FIELD(flit,FROM_MC_BC);
319        GET_FIELD(flit,MULTI_INVAL_DEST);
320        GET_FIELD(flit,MULTI_INVAL_SRCID);
321        GET_FIELD(flit,MULTI_INVAL_UPDT_INDEX);
322        GET_FIELD(flit,MULTI_INVAL_NLINE);
323        GET_FIELD(flit,MULTI_UPDT_DEST);
324        GET_FIELD(flit,MULTI_UPDT_SRCID);
325        GET_FIELD(flit,MULTI_UPDT_UPDT_INDEX);
326        GET_FIELD(flit,MULTI_UPDT_WORD_INDEX);
327        GET_FIELD(flit,MULTI_UPDT_NLINE);
328        GET_FIELD(flit,MULTI_UPDT_BE);
329        GET_FIELD(flit,MULTI_UPDT_DATA);
330        GET_FIELD(flit,CLEANUP_ACK_DEST);
331        GET_FIELD(flit,CLEANUP_ACK_SET);
332        GET_FIELD(flit,CLEANUP_ACK_WAY);
333        GET_FIELD(flit,BROADCAST_BOX);
334        GET_FIELD(flit,BROADCAST_SRCID);
335        GET_FIELD(flit,BROADCAST_NLINE);
336
337        default: assert(false && "Incorrect DHCCP DSPIN field");
338      }
339    }
340
341    static void dspin_set(uint64_t &flit, uint64_t value, flit_field_e field)
342    {
343      switch(field)
344      {
345        SET_FIELD(flit,value,FROM_L1_TYPE);
346        SET_FIELD(flit,value,FROM_L1_EOP);
347        SET_FIELD(flit,value,FROM_L1_BC);
348        SET_FIELD(flit,value,CLEANUP_NCC);
349        SET_FIELD(flit,value,CLEANUP_DEST);
350        SET_FIELD(flit,value,CLEANUP_SRCID);
351        SET_FIELD(flit,value,CLEANUP_NLINE_MSB);
352        SET_FIELD(flit,value,CLEANUP_WAY_INDEX);
353        SET_FIELD(flit,value,CLEANUP_NLINE_LSB);
354        SET_FIELD(flit,value,CLEANUP_DATA_UPDT);
355        SET_FIELD(flit,value,MULTI_ACK_DEST);
356        SET_FIELD(flit,value,MULTI_ACK_UPDT_INDEX);
357        SET_FIELD(flit,value,FROM_MC_TYPE);
358        SET_FIELD(flit,value,FROM_MC_EOP);
359        SET_FIELD(flit,value,FROM_MC_BC);
360        SET_FIELD(flit,value,MULTI_INVAL_DEST);
361        SET_FIELD(flit,value,MULTI_INVAL_SRCID);
362        SET_FIELD(flit,value,MULTI_INVAL_UPDT_INDEX);
363        SET_FIELD(flit,value,MULTI_INVAL_NLINE);
364        SET_FIELD(flit,value,MULTI_UPDT_DEST);
365        SET_FIELD(flit,value,MULTI_UPDT_SRCID);
366        SET_FIELD(flit,value,MULTI_UPDT_UPDT_INDEX);
367        SET_FIELD(flit,value,MULTI_UPDT_WORD_INDEX);
368        SET_FIELD(flit,value,MULTI_UPDT_NLINE);
369        SET_FIELD(flit,value,MULTI_UPDT_BE);
370        SET_FIELD(flit,value,MULTI_UPDT_DATA);
371        SET_FIELD(flit,value,CLEANUP_ACK_DEST);
372        SET_FIELD(flit,value,CLEANUP_ACK_SET);
373        SET_FIELD(flit,value,CLEANUP_ACK_WAY);
374        SET_FIELD(flit,value,BROADCAST_BOX);
375        SET_FIELD(flit,value,BROADCAST_SRCID);
376        SET_FIELD(flit,value,BROADCAST_NLINE);
377
378        default: assert(false && "Incorrect DHCCP DSPIN field");
379      }
380    }
381};
382
383#undef GET_FIELD
384#undef SET_FIELD
385
386}} // end namespace soclib::caba
387
388#endif
389// Local Variables:
390// tab-width: 2
391// c-basic-offset: 2
392// c-file-offsets:((innamespace . 0)(inline-open . 0))
393// indent-tabs-mode: nil
394// End:
395
396// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=2:softtabstop=2
Note: See TracBrowser for help on using the repository browser.