source: branches/ODCCP/communication/dspin_odccp_param/caba/source/include/dspin_odccp_param.h @ 453

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

Rename dspin_dhccp_param into dspin_odccp_param

File size: 16.6 KB
Line 
1/* -*- c++ -*-
2 * File         : dspin_odccp_param.h
3 * Date         : 01/03/2013
4 * Copyright    : UPMC / LIP6
5 * Authors      : Cesar Fuguet
6 * mainteiners  : Clément Devigne
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_ODCCP_PARAMS_H
30#define DSPIN_ODCCP_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 and N flits data if CLEANUP DATA
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 DspinOdccpParam
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 ODCCP 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 ODCCP 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.