source: branches/reconfiguration/communication/dspin_dhccp_param/caba/source/include/dspin_dhccp_param.h @ 867

Last change on this file since 867 was 867, checked in by cfuguet, 9 years ago

reconf: introducing TEST packet fields in the dhccp dspin params header

File size: 19.4 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:1 |                                                                         NLINE(32 bits)
52 * ----------------------------------------------------------------------------------------------
53 *
54 * MULTICAST ACKNOWLEDGEMENT
55 *
56 * flit 1
57 * ----------------------------------------------------------------------------------------------
58 * EOP:1 |     DEST(10 bits)     |       X(15 bits)       | UPDT_INDEX(4 bits) | TYPE:0b00 | BC:0
59 * ----------------------------------------------------------------------------------------------
60 *
61 * TEST
62 *
63 *
64 * flit 1
65 * ----------------------------------------------------------------------------------------------
66 * EOP:0 |    DEST     |    SRCID    |      X       |   TEST  |       X       | TYPE:0b11 | BC:0
67 *       |  (10 bits)  |  (14 bits)  |   (2 bits)   | (1 bit) |    (2 bits)   |           |
68 * ----------------------------------------------------------------------------------------------
69 *
70 * flit 2
71 * ----------------------------------------------------------------------------------------------
72 * EOP:1 |                                                                     SIGNATURE(32 bits)
73 * ----------------------------------------------------------------------------------------------
74 */
75
76/*
77 * M2P command packets
78 *
79 * MULTICAST UPDATE
80 *
81 * flit 1
82 * ----------------------------------------------------------------------------------------------
83 * EOP:0 | DEST(14 bits) | X(4 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b0X   | 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(4 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b1X  | 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 * TEST
129 *
130 * flit 1
131 * ----------------------------------------------------------------------------------------------
132 * EOP:0 |  DEST(14 bits)  | TEST: 1      | X(3 bits)  |  MEMC_ID(14 bits)  | X(10 bits)  | BC:0
133 * ----------------------------------------------------------------------------------------------
134 *
135 * flit 2
136 * ----------------------------------------------------------------------------------------------
137 * EOP:1 | SIGNATURE MSB(7 bits) |                                           SIGNATURE (32 bits)
138 * ----------------------------------------------------------------------------------------------
139 *
140 * CLACK commands
141 *
142 * CLEANUP ACKNOWLEDGEMENT
143 *
144 * flit 1
145 * ----------------------------------------------------------------------------------------------
146 * EOP:1 | DEST(14 bits) | X(5 bits) | SET_INDEX(16 bits) | WAY_INDEX(2 bits) | TYPE:0bX   | BC:0
147 * ----------------------------------------------------------------------------------------------
148 *                                                                            | X: 0 CLACK |
149 *                                                                            |      DATA  |
150 *                                                                            |    1 CLACK |
151 *                                                                            |      INST  |
152 * TEST
153 *
154 * flit 1
155 * ----------------------------------------------------------------------------------------------
156 * EOP:0 |  DEST(14 bits)  | TEST:1  | X(3 bits)  |  MEMC_ID(14 bits)  | X(10 bits)  | BC:0
157 * ----------------------------------------------------------------------------------------------
158 *
159 * flit 2
160 * ----------------------------------------------------------------------------------------------
161 * EOP:1 | SIGNATURE MSB(7 bits) |                                           SIGNATURE (32 bits)
162 * ----------------------------------------------------------------------------------------------
163 *
164 *
165 */
166
167/*
168 * Utility MACROS
169 */
170#define GET_FIELD(x,y)\
171    case y: return ((x >> y##_SHIFT) & y##_MASK)
172
173#define SET_FIELD(x,y,z)\
174    case z: x |= ((y & z##_MASK) << z##_SHIFT);break
175
176class DspinDhccpParam
177{
178  public:
179
180    static const uint8_t  m2p_flit_width               = 40;
181    static const uint8_t  p2m_flit_width               = 33;
182    static const uint8_t  clack_flit_width             = 40;
183
184    static const uint8_t  UPDT_INDEX_WIDTH             = 4;
185    static const uint8_t  NLINE_WIDTH                  = 34;
186    static const uint8_t  SRCID_WIDTH                  = 14;
187    static const uint8_t  GLOBALID_WIDTH               = 10;
188    static const uint8_t  WORD_INDEX_WIDTH             = 4;
189    static const uint8_t  BE_WIDTH                     = 4;
190    static const uint8_t  DATA_WIDTH                   = 32;
191    static const uint8_t  SET_INDEX_WIDTH              = 6;
192    static const uint8_t  WAY_INDEX_WIDTH              = 2;
193    static const uint8_t  BROADCAST_BOX_WIDTH          = 20;
194    static const uint8_t  M2P_TYPE_WIDTH               = 2;
195    static const uint8_t  P2M_TYPE_WIDTH               = 2;
196    static const uint8_t  CLACK_TYPE_WIDTH             = 1;
197
198    static const uint8_t  P2M_TYPE_SHIFT               = 1;
199    static const uint64_t P2M_TYPE_MASK                = ((1ULL<<P2M_TYPE_WIDTH)-1);
200    static const uint8_t  P2M_EOP_SHIFT                = 32;
201    static const uint64_t P2M_EOP_MASK                 = 1;
202    static const uint8_t  P2M_BC_SHIFT                 = 0;
203    static const uint64_t P2M_BC_MASK                  = 1;
204
205    static const uint8_t  CLEANUP_DEST_SHIFT           = 22;
206    static const uint64_t CLEANUP_DEST_MASK            = ((1ULL<<GLOBALID_WIDTH)-1);
207    static const uint8_t  CLEANUP_SRCID_SHIFT          = 8;
208    static const uint64_t CLEANUP_SRCID_MASK           = ((1ULL<<SRCID_WIDTH)-1);
209    static const uint8_t  CLEANUP_NLINE_MSB_SHIFT      = 6;
210    static const uint64_t CLEANUP_NLINE_MSB_MASK       = ((1ULL<< 2)-1);
211    static const uint8_t  CLEANUP_WAY_INDEX_SHIFT      = 3;
212    static const uint64_t CLEANUP_WAY_INDEX_MASK       = ((1ULL<<WAY_INDEX_WIDTH)-1);
213    static const uint8_t  CLEANUP_NLINE_LSB_SHIFT      = 0;
214    static const uint64_t CLEANUP_NLINE_LSB_MASK       = ((1ULL<<32)-1);
215
216    static const uint8_t  MULTI_ACK_DEST_SHIFT         = CLEANUP_DEST_SHIFT;
217    static const uint64_t MULTI_ACK_DEST_MASK          = CLEANUP_DEST_MASK;
218    static const uint8_t  MULTI_ACK_UPDT_INDEX_SHIFT   = 3;
219    static const uint64_t MULTI_ACK_UPDT_INDEX_MASK    = ((1ULL<<UPDT_INDEX_WIDTH)-1);
220
221    static const uint8_t  CC_TEST_DEST_SHIFT           = 22;
222    static const uint64_t CC_TEST_DEST_MASK            = ((1ULL<<GLOBALID_WIDTH)-1);
223    static const uint8_t  CC_TEST_SRCID_SHIFT          = 8;
224    static const uint64_t CC_TEST_SRCID_MASK           = ((1ULL<<SRCID_WIDTH)-1);
225    static const uint8_t  CC_TEST_TEST_SHIFT           = 5;
226    static const uint64_t CC_TEST_TEST_MASK            = 1;
227    static const uint8_t  CC_TEST_SIGNATURE_SHIFT      = 0;
228    static const uint64_t CC_TEST_SIGNATURE_MASK       = ((1ULL<<DATA_WIDTH)-1);
229
230    static const uint8_t  M2P_TYPE_SHIFT               = 1;
231    static const uint64_t M2P_TYPE_MASK                = ((1ULL<<M2P_TYPE_WIDTH)-1);
232    static const uint8_t  M2P_EOP_SHIFT                = 39;
233    static const uint64_t M2P_EOP_MASK                 = 1;
234    static const uint8_t  M2P_BC_SHIFT                 = 0;
235    static const uint64_t M2P_BC_MASK                  = 1;
236    static const uint8_t  M2P_TEST_SHIFT               = 24;
237    static const uint64_t M2P_TEST_MASK                = 1;
238
239    static const uint8_t  MULTI_INVAL_DEST_SHIFT       = 25;
240    static const uint64_t MULTI_INVAL_DEST_MASK        = ((1ULL<<SRCID_WIDTH)-1);
241    static const uint8_t  MULTI_INVAL_SRCID_SHIFT      = 7;
242    static const uint64_t MULTI_INVAL_SRCID_MASK       = ((1ULL<<SRCID_WIDTH)-1);
243    static const uint8_t  MULTI_INVAL_UPDT_INDEX_SHIFT = 3;
244    static const uint64_t MULTI_INVAL_UPDT_INDEX_MASK  = ((1ULL<<UPDT_INDEX_WIDTH)-1);
245    static const uint8_t  MULTI_INVAL_NLINE_SHIFT      = 0;
246    static const uint64_t MULTI_INVAL_NLINE_MASK       = ((1ULL<<NLINE_WIDTH)-1);
247
248    static const uint8_t  MULTI_UPDT_DEST_SHIFT        = MULTI_INVAL_DEST_SHIFT;
249    static const uint64_t MULTI_UPDT_DEST_MASK         = MULTI_INVAL_DEST_MASK;
250    static const uint8_t  MULTI_UPDT_SRCID_SHIFT       = MULTI_INVAL_SRCID_SHIFT;
251    static const uint64_t MULTI_UPDT_SRCID_MASK        = MULTI_INVAL_SRCID_MASK;
252    static const uint8_t  MULTI_UPDT_UPDT_INDEX_SHIFT  = MULTI_INVAL_UPDT_INDEX_SHIFT;
253    static const uint64_t MULTI_UPDT_UPDT_INDEX_MASK   = MULTI_INVAL_UPDT_INDEX_MASK;
254    static const uint8_t  MULTI_UPDT_WORD_INDEX_SHIFT  = 34;
255    static const uint64_t MULTI_UPDT_WORD_INDEX_MASK   = ((1ULL<<WORD_INDEX_WIDTH)-1);
256    static const uint8_t  MULTI_UPDT_NLINE_SHIFT       = MULTI_INVAL_NLINE_SHIFT;
257    static const uint64_t MULTI_UPDT_NLINE_MASK        = MULTI_INVAL_NLINE_MASK;
258    static const uint8_t  MULTI_UPDT_BE_SHIFT          = 32;
259    static const uint64_t MULTI_UPDT_BE_MASK           = ((1ULL<<BE_WIDTH)-1);
260    static const uint8_t  MULTI_UPDT_DATA_SHIFT        = 0;
261    static const uint64_t MULTI_UPDT_DATA_MASK         = ((1ULL<<DATA_WIDTH)-1);
262
263    static const uint8_t  BROADCAST_BOX_SHIFT          = 19;
264    static const uint64_t BROADCAST_BOX_MASK           = ((1ULL<<BROADCAST_BOX_WIDTH)-1);
265    static const uint8_t  BROADCAST_SRCID_SHIFT        = 5;
266    static const uint64_t BROADCAST_SRCID_MASK         = MULTI_INVAL_SRCID_MASK;
267    static const uint8_t  BROADCAST_NLINE_SHIFT        = 0;
268    static const uint64_t BROADCAST_NLINE_MASK         = MULTI_INVAL_NLINE_MASK;
269
270    static const uint8_t  CLACK_TYPE_SHIFT             = 1;
271    static const uint64_t CLACK_TYPE_MASK              = ((1ULL<<CLACK_TYPE_WIDTH)-1);
272    static const uint8_t  CLACK_EOP_SHIFT              = 39;
273    static const uint64_t CLACK_EOP_MASK               = 1;
274    static const uint8_t  CLACK_BC_SHIFT               = 0;
275    static const uint64_t CLACK_BC_MASK                = 1;
276    static const uint8_t  CLACK_DEST_SHIFT             = 25;
277    static const uint64_t CLACK_DEST_MASK              = ((1ULL<<SRCID_WIDTH)-1);
278    static const uint8_t  CLACK_SET_SHIFT              = 4;
279    static const uint64_t CLACK_SET_MASK               = ((1ULL<<SET_INDEX_WIDTH)-1);
280    static const uint8_t  CLACK_WAY_SHIFT              = 2;
281    static const uint64_t CLACK_WAY_MASK               = ((1ULL<<WAY_INDEX_WIDTH)-1);
282
283    /*
284     * P2M command types
285     */
286    enum
287    {
288      TYPE_MULTI_ACK    = 0,
289      TYPE_CLEANUP      = 2,
290      TYPE_CLEANUP_DATA = TYPE_CLEANUP,
291      TYPE_CLEANUP_INST = 3,
292      TYPE_TEST         = TYPE_CLEANUP_INST
293    };
294
295    /*
296     * M2P command types
297     */
298    enum
299    {
300      TYPE_MULTI_UPDT       = 0,
301      TYPE_MULTI_UPDT_DATA  = TYPE_MULTI_UPDT,
302      TYPE_MULTI_UPDT_INST  = 1,
303      TYPE_MULTI_INVAL      = 2,
304      TYPE_MULTI_INVAL_DATA = TYPE_MULTI_INVAL,
305      TYPE_MULTI_INVAL_INST = 3
306    };
307
308    /*
309     * CLACK command types
310     */
311    enum
312    {
313      TYPE_CLACK      = 0,
314      TYPE_CLACK_DATA = TYPE_CLACK,
315      TYPE_CLACK_INST = 1
316    };
317
318    enum flit_field_e
319    {
320      P2M_TYPE,
321      P2M_EOP,
322      P2M_BC,
323      P2M_TEST,
324
325      CLEANUP_DEST,
326      CLEANUP_SRCID,
327      CLEANUP_NLINE_MSB,
328      CLEANUP_WAY_INDEX,
329      CLEANUP_NLINE_LSB,
330
331      MULTI_ACK_DEST,
332      MULTI_ACK_UPDT_INDEX,
333
334      CC_TEST_DEST,
335      CC_TEST_SRCID,
336      CC_TEST_TEST,
337      CC_TEST_SIGNATURE,
338
339      M2P_TYPE,
340      M2P_EOP,
341      M2P_BC,
342      M2P_TEST,
343
344      MULTI_INVAL_DEST,
345      MULTI_INVAL_SRCID,
346      MULTI_INVAL_UPDT_INDEX,
347      MULTI_INVAL_NLINE,
348
349      MULTI_UPDT_DEST,
350      MULTI_UPDT_SRCID,
351      MULTI_UPDT_UPDT_INDEX,
352      MULTI_UPDT_WORD_INDEX,
353      MULTI_UPDT_NLINE,
354      MULTI_UPDT_BE,
355      MULTI_UPDT_DATA,
356
357      CLACK_TYPE,
358
359      CLACK_DEST,
360      CLACK_SET,
361      CLACK_WAY,
362
363      BROADCAST_BOX,
364      BROADCAST_SRCID,
365      BROADCAST_NLINE
366    };
367
368    static uint64_t dspin_get(uint64_t flit, flit_field_e field)
369    {
370      switch(field)
371      {
372        GET_FIELD(flit,P2M_TYPE);
373        GET_FIELD(flit,P2M_EOP);
374        GET_FIELD(flit,P2M_BC);
375        GET_FIELD(flit,CLEANUP_DEST);
376        GET_FIELD(flit,CLEANUP_SRCID);
377        GET_FIELD(flit,CLEANUP_NLINE_MSB);
378        GET_FIELD(flit,CLEANUP_WAY_INDEX);
379        GET_FIELD(flit,CLEANUP_NLINE_LSB);
380        GET_FIELD(flit,MULTI_ACK_DEST);
381        GET_FIELD(flit,MULTI_ACK_UPDT_INDEX);
382        GET_FIELD(flit,CC_TEST_DEST);
383        GET_FIELD(flit,CC_TEST_SRCID);
384        GET_FIELD(flit,CC_TEST_TEST);
385        GET_FIELD(flit,CC_TEST_SIGNATURE);
386        GET_FIELD(flit,M2P_TYPE);
387        GET_FIELD(flit,M2P_EOP);
388        GET_FIELD(flit,M2P_BC);
389        GET_FIELD(flit,M2P_TEST);
390        GET_FIELD(flit,MULTI_INVAL_DEST);
391        GET_FIELD(flit,MULTI_INVAL_SRCID);
392        GET_FIELD(flit,MULTI_INVAL_UPDT_INDEX);
393        GET_FIELD(flit,MULTI_INVAL_NLINE);
394        GET_FIELD(flit,MULTI_UPDT_DEST);
395        GET_FIELD(flit,MULTI_UPDT_SRCID);
396        GET_FIELD(flit,MULTI_UPDT_UPDT_INDEX);
397        GET_FIELD(flit,MULTI_UPDT_WORD_INDEX);
398        GET_FIELD(flit,MULTI_UPDT_NLINE);
399        GET_FIELD(flit,MULTI_UPDT_BE);
400        GET_FIELD(flit,MULTI_UPDT_DATA);
401        GET_FIELD(flit,CLACK_TYPE);
402        GET_FIELD(flit,CLACK_DEST);
403        GET_FIELD(flit,CLACK_SET);
404        GET_FIELD(flit,CLACK_WAY);
405        GET_FIELD(flit,BROADCAST_BOX);
406        GET_FIELD(flit,BROADCAST_SRCID);
407        GET_FIELD(flit,BROADCAST_NLINE);
408
409        default: assert(false && "Incorrect DHCCP DSPIN field");
410      }
411    }
412
413    static void dspin_set(uint64_t &flit, uint64_t value, flit_field_e field)
414    {
415      switch(field)
416      {
417        SET_FIELD(flit,value,P2M_TYPE);
418        SET_FIELD(flit,value,P2M_EOP);
419        SET_FIELD(flit,value,P2M_BC);
420        SET_FIELD(flit,value,CLEANUP_DEST);
421        SET_FIELD(flit,value,CLEANUP_SRCID);
422        SET_FIELD(flit,value,CLEANUP_NLINE_MSB);
423        SET_FIELD(flit,value,CLEANUP_WAY_INDEX);
424        SET_FIELD(flit,value,CLEANUP_NLINE_LSB);
425        SET_FIELD(flit,value,MULTI_ACK_DEST);
426        SET_FIELD(flit,value,MULTI_ACK_UPDT_INDEX);
427        SET_FIELD(flit,value,CC_TEST_DEST);
428        SET_FIELD(flit,value,CC_TEST_SRCID);
429        SET_FIELD(flit,value,CC_TEST_TEST);
430        SET_FIELD(flit,value,CC_TEST_SIGNATURE);
431        SET_FIELD(flit,value,M2P_TYPE);
432        SET_FIELD(flit,value,M2P_EOP);
433        SET_FIELD(flit,value,M2P_BC);
434        SET_FIELD(flit,value,M2P_TEST);
435        SET_FIELD(flit,value,MULTI_INVAL_DEST);
436        SET_FIELD(flit,value,MULTI_INVAL_SRCID);
437        SET_FIELD(flit,value,MULTI_INVAL_UPDT_INDEX);
438        SET_FIELD(flit,value,MULTI_INVAL_NLINE);
439        SET_FIELD(flit,value,MULTI_UPDT_DEST);
440        SET_FIELD(flit,value,MULTI_UPDT_SRCID);
441        SET_FIELD(flit,value,MULTI_UPDT_UPDT_INDEX);
442        SET_FIELD(flit,value,MULTI_UPDT_WORD_INDEX);
443        SET_FIELD(flit,value,MULTI_UPDT_NLINE);
444        SET_FIELD(flit,value,MULTI_UPDT_BE);
445        SET_FIELD(flit,value,MULTI_UPDT_DATA);
446        SET_FIELD(flit,value,CLACK_TYPE);
447        SET_FIELD(flit,value,CLACK_DEST);
448        SET_FIELD(flit,value,CLACK_SET);
449        SET_FIELD(flit,value,CLACK_WAY);
450        SET_FIELD(flit,value,BROADCAST_BOX);
451        SET_FIELD(flit,value,BROADCAST_SRCID);
452        SET_FIELD(flit,value,BROADCAST_NLINE);
453
454        default: assert(false && "Incorrect DHCCP DSPIN field");
455      }
456    }
457};
458
459#undef GET_FIELD
460#undef SET_FIELD
461
462}} // end namespace soclib::caba
463
464#endif
465// Local Variables:
466// tab-width: 2
467// c-basic-offset: 2
468// c-file-offsets:((innamespace . 0)(inline-open . 0))
469// indent-tabs-mode: nil
470// End:
471
472// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=2:softtabstop=2
Note: See TracBrowser for help on using the repository browser.