source: trunk/communication/dspin_dhccp_param/caba/source/include/dspin_dhccp_param.h @ 497

Last change on this file since 497 was 497, checked in by cfuguet, 11 years ago

Modification in dspin_dhccp_param class:

  • The SET index width sent in the CLACK command has been reduced to 6 bits.
File size: 16.2 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
62/*
63 * M2P command packets
64 *
65 * MULTICAST UPDATE
66 *
67 * flit 1
68 * ----------------------------------------------------------------------------------------------
69 * EOP:0 | DEST(14 bits) | X(4 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b0X   | BC:0
70 * ----------------------------------------------------------------------------------------------
71 *                                                                           | X: 0 DATA   |
72 *                                                                           |    1 INST   |
73 * flit 2
74 * ----------------------------------------------------------------------------------------------
75 * EOP:0 | X | WORD_INDEX(4 bits)  |                                             NLINE (34 bits)
76 * ----------------------------------------------------------------------------------------------
77 *
78 * flit 3
79 * ----------------------------------------------------------------------------------------------
80 * EOP:0 | X(3 bits)  | BE(4 bits) |                                              WDATA(32 bits)
81 * ----------------------------------------------------------------------------------------------
82 *
83 * flit N
84 * ----------------------------------------------------------------------------------------------
85 * EOP:1 | X(3 bits)  | BE(4 bits) |                                              WDATA(32 bits)
86 * ----------------------------------------------------------------------------------------------
87 *
88 * MULTICAST INVALIDATE
89 *
90 * flit 1
91 * ----------------------------------------------------------------------------------------------
92 * EOP:0 | DEST(14 bits) | X(4 bits) | MEMC_ID(14 bits) | UPDT_INDEX(4 bits) | TYPE:0b1X  | BC:0
93 * ----------------------------------------------------------------------------------------------
94 *                                                                           | X: 0 DATA  |
95 *                                                                           |    1 INST  |
96 * flit 2
97 * ----------------------------------------------------------------------------------------------
98 * EOP:1 | X(5 bits) |                                                           NLINE (34 bits)
99 * ----------------------------------------------------------------------------------------------
100 *
101 * BROADCAST INVALIDATE
102 *
103 * flit 1
104 *       | BOUNDING BOX(20 bits)            |
105 * ----------------------------------------------------------------------------------------------
106 * EOP:0 | XMIN   | XMAX   | YMIN   | YMAX  | MEMC_ID(14 bits) | NETWORK_RESERVED(4 bits) | BC:1
107 * ----------------------------------------------------------------------------------------------
108 *
109 * flit 2
110 * ----------------------------------------------------------------------------------------------
111 * EOP:1 |        X(5 bits)       |                                              NLINE (34 bits)
112 * ----------------------------------------------------------------------------------------------
113 *
114 * M2P clack commands
115 *
116 * CLEANUP ACKNOWLEDGEMENT
117 *
118 * flit 1
119 * ----------------------------------------------------------------------------------------------
120 * EOP:1 | DEST(14 bits) | X(5 bits) | SET_INDEX(16 bits) | WAY_INDEX(2 bits) | TYPE:0bX   | BC:0
121 * ----------------------------------------------------------------------------------------------
122 *                                                                            | X: 0 CLACK |
123 *                                                                            |      DATA  |
124 *                                                                            |    1 CLACK |
125 *                                                                            |      INST  |
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  m2p_flit_width               = 40;
143    static const uint8_t  p2m_flit_width               = 33;
144    static const uint8_t  clack_flit_width             = 40;
145
146    static const uint8_t  UPDT_INDEX_WIDTH             = 4;
147    static const uint8_t  NLINE_WIDTH                  = 34;
148    static const uint8_t  SRCID_WIDTH                  = 14;
149    static const uint8_t  GLOBALID_WIDTH               = 10;
150    static const uint8_t  WORD_INDEX_WIDTH             = 4;
151    static const uint8_t  BE_WIDTH                     = 4;
152    static const uint8_t  DATA_WIDTH                   = 32;
153    static const uint8_t  SET_INDEX_WIDTH              = 6;
154    static const uint8_t  WAY_INDEX_WIDTH              = 2;
155    static const uint8_t  BROADCAST_BOX_WIDTH          = 20;
156    static const uint8_t  M2P_TYPE_WIDTH               = 2;
157    static const uint8_t  P2M_TYPE_WIDTH               = 2;
158    static const uint8_t  CLACK_TYPE_WIDTH             = 1;
159
160    static const uint8_t  P2M_TYPE_SHIFT               = 1;
161    static const uint64_t P2M_TYPE_MASK                = ((1ULL<<P2M_TYPE_WIDTH)-1);
162    static const uint8_t  P2M_EOP_SHIFT                = 32;
163    static const uint64_t P2M_EOP_MASK                 = 1;
164    static const uint8_t  P2M_BC_SHIFT                 = 0;
165    static const uint64_t P2M_BC_MASK                  = 1;
166
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
178    static const uint8_t  MULTI_ACK_DEST_SHIFT         = CLEANUP_DEST_SHIFT;
179    static const uint64_t MULTI_ACK_DEST_MASK          = CLEANUP_DEST_MASK;
180    static const uint8_t  MULTI_ACK_UPDT_INDEX_SHIFT   = 3;
181    static const uint64_t MULTI_ACK_UPDT_INDEX_MASK    = ((1ULL<<UPDT_INDEX_WIDTH)-1);
182
183    static const uint8_t  M2P_TYPE_SHIFT               = 1;
184    static const uint64_t M2P_TYPE_MASK                = ((1ULL<<M2P_TYPE_WIDTH)-1);
185    static const uint8_t  M2P_EOP_SHIFT                = 39;
186    static const uint64_t M2P_EOP_MASK                 = 1;
187    static const uint8_t  M2P_BC_SHIFT                 = 0;
188    static const uint64_t M2P_BC_MASK                  = 1;
189
190    static const uint8_t  MULTI_INVAL_DEST_SHIFT       = 25;
191    static const uint64_t MULTI_INVAL_DEST_MASK        = ((1ULL<<SRCID_WIDTH)-1);
192    static const uint8_t  MULTI_INVAL_SRCID_SHIFT      = 7;
193    static const uint64_t MULTI_INVAL_SRCID_MASK       = ((1ULL<<SRCID_WIDTH)-1);
194    static const uint8_t  MULTI_INVAL_UPDT_INDEX_SHIFT = 3;
195    static const uint64_t MULTI_INVAL_UPDT_INDEX_MASK  = ((1ULL<<UPDT_INDEX_WIDTH)-1);
196    static const uint8_t  MULTI_INVAL_NLINE_SHIFT      = 0;
197    static const uint64_t MULTI_INVAL_NLINE_MASK       = ((1ULL<<NLINE_WIDTH)-1);
198
199    static const uint8_t  MULTI_UPDT_DEST_SHIFT        = MULTI_INVAL_DEST_SHIFT;
200    static const uint64_t MULTI_UPDT_DEST_MASK         = MULTI_INVAL_DEST_MASK;
201    static const uint8_t  MULTI_UPDT_SRCID_SHIFT       = MULTI_INVAL_SRCID_SHIFT;
202    static const uint64_t MULTI_UPDT_SRCID_MASK        = MULTI_INVAL_SRCID_MASK;
203    static const uint8_t  MULTI_UPDT_UPDT_INDEX_SHIFT  = MULTI_INVAL_UPDT_INDEX_SHIFT;
204    static const uint64_t MULTI_UPDT_UPDT_INDEX_MASK   = MULTI_INVAL_UPDT_INDEX_MASK;
205    static const uint8_t  MULTI_UPDT_WORD_INDEX_SHIFT  = 34;
206    static const uint64_t MULTI_UPDT_WORD_INDEX_MASK   = ((1ULL<<WORD_INDEX_WIDTH)-1);
207    static const uint8_t  MULTI_UPDT_NLINE_SHIFT       = MULTI_INVAL_NLINE_SHIFT;
208    static const uint64_t MULTI_UPDT_NLINE_MASK        = MULTI_INVAL_NLINE_MASK;
209    static const uint8_t  MULTI_UPDT_BE_SHIFT          = 32;
210    static const uint64_t MULTI_UPDT_BE_MASK           = ((1ULL<<BE_WIDTH)-1);
211    static const uint8_t  MULTI_UPDT_DATA_SHIFT        = 0;
212    static const uint64_t MULTI_UPDT_DATA_MASK         = ((1ULL<<DATA_WIDTH)-1);
213
214    static const uint8_t  BROADCAST_BOX_SHIFT          = 19;
215    static const uint64_t BROADCAST_BOX_MASK           = ((1ULL<<BROADCAST_BOX_WIDTH)-1);
216    static const uint8_t  BROADCAST_SRCID_SHIFT        = 5;
217    static const uint64_t BROADCAST_SRCID_MASK         = MULTI_INVAL_SRCID_MASK;
218    static const uint8_t  BROADCAST_NLINE_SHIFT        = 0;
219    static const uint64_t BROADCAST_NLINE_MASK         = MULTI_INVAL_NLINE_MASK;
220
221    static const uint8_t  CLACK_TYPE_SHIFT             = 1;
222    static const uint64_t CLACK_TYPE_MASK              = ((1ULL<<CLACK_TYPE_WIDTH)-1);
223    static const uint8_t  CLACK_EOP_SHIFT              = 39;
224    static const uint64_t CLACK_EOP_MASK               = 1;
225    static const uint8_t  CLACK_BC_SHIFT               = 0;
226    static const uint64_t CLACK_BC_MASK                = 1;
227    static const uint8_t  CLACK_DEST_SHIFT             = 25;
228    static const uint64_t CLACK_DEST_MASK              = ((1ULL<<SRCID_WIDTH)-1);
229    static const uint8_t  CLACK_SET_SHIFT              = 4;
230    static const uint64_t CLACK_SET_MASK               = ((1ULL<<SET_INDEX_WIDTH)-1);
231    static const uint8_t  CLACK_WAY_SHIFT              = 2;
232    static const uint64_t CLACK_WAY_MASK               = ((1ULL<<WAY_INDEX_WIDTH)-1);
233
234    /*
235     * P2M command types
236     */
237    enum
238    {
239      TYPE_MULTI_ACK    = 0,
240      TYPE_CLEANUP      = 2,
241      TYPE_CLEANUP_DATA = TYPE_CLEANUP,
242      TYPE_CLEANUP_INST = 3
243    };
244
245    /*
246     * M2P command types
247     */
248    enum
249    {
250      TYPE_MULTI_UPDT       = 0,
251      TYPE_MULTI_UPDT_DATA  = TYPE_MULTI_UPDT,
252      TYPE_MULTI_UPDT_INST  = 1,
253      TYPE_MULTI_INVAL      = 2,
254      TYPE_MULTI_INVAL_DATA = TYPE_MULTI_INVAL,
255      TYPE_MULTI_INVAL_INST = 3
256    };
257
258    /*
259     * CLACK command types
260     */
261    enum
262    {
263      TYPE_CLACK      = 0,
264      TYPE_CLACK_DATA = TYPE_CLACK,
265      TYPE_CLACK_INST = 1
266    };
267
268    enum flit_field_e
269    {
270      P2M_TYPE,
271      P2M_EOP,
272      P2M_BC,
273
274      CLEANUP_DEST,
275      CLEANUP_SRCID,
276      CLEANUP_NLINE_MSB,
277      CLEANUP_WAY_INDEX,
278      CLEANUP_NLINE_LSB,
279
280      MULTI_ACK_DEST,
281      MULTI_ACK_UPDT_INDEX,
282
283      M2P_TYPE,
284      M2P_EOP,
285      M2P_BC,
286
287      MULTI_INVAL_DEST,
288      MULTI_INVAL_SRCID,
289      MULTI_INVAL_UPDT_INDEX,
290      MULTI_INVAL_NLINE,
291
292      MULTI_UPDT_DEST,
293      MULTI_UPDT_SRCID,
294      MULTI_UPDT_UPDT_INDEX,
295      MULTI_UPDT_WORD_INDEX,
296      MULTI_UPDT_NLINE,
297      MULTI_UPDT_BE,
298      MULTI_UPDT_DATA,
299
300      CLACK_TYPE,
301
302      CLACK_DEST,
303      CLACK_SET,
304      CLACK_WAY,
305
306      BROADCAST_BOX,
307      BROADCAST_SRCID,
308      BROADCAST_NLINE
309    };
310
311    static uint64_t dspin_get(uint64_t flit, flit_field_e field)
312    {
313      switch(field)
314      {
315        GET_FIELD(flit,P2M_TYPE);
316        GET_FIELD(flit,P2M_EOP);
317        GET_FIELD(flit,P2M_BC);
318        GET_FIELD(flit,CLEANUP_DEST);
319        GET_FIELD(flit,CLEANUP_SRCID);
320        GET_FIELD(flit,CLEANUP_NLINE_MSB);
321        GET_FIELD(flit,CLEANUP_WAY_INDEX);
322        GET_FIELD(flit,CLEANUP_NLINE_LSB);
323        GET_FIELD(flit,MULTI_ACK_DEST);
324        GET_FIELD(flit,MULTI_ACK_UPDT_INDEX);
325        GET_FIELD(flit,M2P_TYPE);
326        GET_FIELD(flit,M2P_EOP);
327        GET_FIELD(flit,M2P_BC);
328        GET_FIELD(flit,MULTI_INVAL_DEST);
329        GET_FIELD(flit,MULTI_INVAL_SRCID);
330        GET_FIELD(flit,MULTI_INVAL_UPDT_INDEX);
331        GET_FIELD(flit,MULTI_INVAL_NLINE);
332        GET_FIELD(flit,MULTI_UPDT_DEST);
333        GET_FIELD(flit,MULTI_UPDT_SRCID);
334        GET_FIELD(flit,MULTI_UPDT_UPDT_INDEX);
335        GET_FIELD(flit,MULTI_UPDT_WORD_INDEX);
336        GET_FIELD(flit,MULTI_UPDT_NLINE);
337        GET_FIELD(flit,MULTI_UPDT_BE);
338        GET_FIELD(flit,MULTI_UPDT_DATA);
339        GET_FIELD(flit,CLACK_TYPE);
340        GET_FIELD(flit,CLACK_DEST);
341        GET_FIELD(flit,CLACK_SET);
342        GET_FIELD(flit,CLACK_WAY);
343        GET_FIELD(flit,BROADCAST_BOX);
344        GET_FIELD(flit,BROADCAST_SRCID);
345        GET_FIELD(flit,BROADCAST_NLINE);
346
347        default: assert(false && "Incorrect DHCCP DSPIN field");
348      }
349    }
350
351    static void dspin_set(uint64_t &flit, uint64_t value, flit_field_e field)
352    {
353      switch(field)
354      {
355        SET_FIELD(flit,value,P2M_TYPE);
356        SET_FIELD(flit,value,P2M_EOP);
357        SET_FIELD(flit,value,P2M_BC);
358        SET_FIELD(flit,value,CLEANUP_DEST);
359        SET_FIELD(flit,value,CLEANUP_SRCID);
360        SET_FIELD(flit,value,CLEANUP_NLINE_MSB);
361        SET_FIELD(flit,value,CLEANUP_WAY_INDEX);
362        SET_FIELD(flit,value,CLEANUP_NLINE_LSB);
363        SET_FIELD(flit,value,MULTI_ACK_DEST);
364        SET_FIELD(flit,value,MULTI_ACK_UPDT_INDEX);
365        SET_FIELD(flit,value,M2P_TYPE);
366        SET_FIELD(flit,value,M2P_EOP);
367        SET_FIELD(flit,value,M2P_BC);
368        SET_FIELD(flit,value,MULTI_INVAL_DEST);
369        SET_FIELD(flit,value,MULTI_INVAL_SRCID);
370        SET_FIELD(flit,value,MULTI_INVAL_UPDT_INDEX);
371        SET_FIELD(flit,value,MULTI_INVAL_NLINE);
372        SET_FIELD(flit,value,MULTI_UPDT_DEST);
373        SET_FIELD(flit,value,MULTI_UPDT_SRCID);
374        SET_FIELD(flit,value,MULTI_UPDT_UPDT_INDEX);
375        SET_FIELD(flit,value,MULTI_UPDT_WORD_INDEX);
376        SET_FIELD(flit,value,MULTI_UPDT_NLINE);
377        SET_FIELD(flit,value,MULTI_UPDT_BE);
378        SET_FIELD(flit,value,MULTI_UPDT_DATA);
379        SET_FIELD(flit,value,CLACK_TYPE);
380        SET_FIELD(flit,value,CLACK_DEST);
381        SET_FIELD(flit,value,CLACK_SET);
382        SET_FIELD(flit,value,CLACK_WAY);
383        SET_FIELD(flit,value,BROADCAST_BOX);
384        SET_FIELD(flit,value,BROADCAST_SRCID);
385        SET_FIELD(flit,value,BROADCAST_NLINE);
386
387        default: assert(false && "Incorrect DHCCP DSPIN field");
388      }
389    }
390};
391
392#undef GET_FIELD
393#undef SET_FIELD
394
395}} // end namespace soclib::caba
396
397#endif
398// Local Variables:
399// tab-width: 2
400// c-basic-offset: 2
401// c-file-offsets:((innamespace . 0)(inline-open . 0))
402// indent-tabs-mode: nil
403// End:
404
405// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=2:softtabstop=2
Note: See TracBrowser for help on using the repository browser.