| 1 | /* -*- c++ -*- | 
|---|
| 2 | * File         : vci_mem_cache.h | 
|---|
| 3 | * Date         : 26/10/2008 | 
|---|
| 4 | * Copyright    : UPMC / LIP6 | 
|---|
| 5 | * Authors      : Alain Greiner / Eric Guthmuller | 
|---|
| 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 | * Maintainers: alain.greiner@lip6.fr | 
|---|
| 28 | *              eric.guthmuller@polytechnique.edu | 
|---|
| 29 | *              cesar.fuguet-tortolero@lip6.fr | 
|---|
| 30 | *              alexandre.joannou@lip6.fr | 
|---|
| 31 | */ | 
|---|
| 32 |  | 
|---|
| 33 | #ifndef SOCLIB_CABA_MEM_CACHE_H | 
|---|
| 34 | #define SOCLIB_CABA_MEM_CACHE_H | 
|---|
| 35 |  | 
|---|
| 36 | #include <inttypes.h> | 
|---|
| 37 | #include <systemc> | 
|---|
| 38 | #include <list> | 
|---|
| 39 | #include <cassert> | 
|---|
| 40 | #include "arithmetics.h" | 
|---|
| 41 | #include "alloc_elems.h" | 
|---|
| 42 | #include "caba_base_module.h" | 
|---|
| 43 | #include "vci_target.h" | 
|---|
| 44 | #include "vci_initiator.h" | 
|---|
| 45 | #include "generic_fifo.h" | 
|---|
| 46 | #include "mapping_table.h" | 
|---|
| 47 | #include "int_tab.h" | 
|---|
| 48 | #include "generic_llsc_global_table.h" | 
|---|
| 49 | #include "mem_cache_directory.h" | 
|---|
| 50 | #include "xram_transaction.h" | 
|---|
| 51 | #include "update_tab.h" | 
|---|
| 52 | #include "dspin_interface.h" | 
|---|
| 53 | #include "dspin_dhccp_param.h" | 
|---|
| 54 |  | 
|---|
| 55 | #define TRT_ENTRIES      4      // Number of entries in TRT | 
|---|
| 56 | #define UPT_ENTRIES      4      // Number of entries in UPT | 
|---|
| 57 | #define IVT_ENTRIES      4      // Number of entries in IVT | 
|---|
| 58 | #define HEAP_ENTRIES     1024   // Number of entries in HEAP | 
|---|
| 59 |  | 
|---|
| 60 | namespace soclib {  namespace caba { | 
|---|
| 61 |  | 
|---|
| 62 | using namespace sc_core; | 
|---|
| 63 |  | 
|---|
| 64 | template<typename vci_param_int, | 
|---|
| 65 | typename vci_param_ext, | 
|---|
| 66 | size_t   dspin_in_width, | 
|---|
| 67 | size_t   dspin_out_width> | 
|---|
| 68 | class VciMemCache | 
|---|
| 69 | : public soclib::caba::BaseModule | 
|---|
| 70 | { | 
|---|
| 71 | typedef typename vci_param_int::fast_addr_t  addr_t; | 
|---|
| 72 | typedef typename sc_dt::sc_uint<64>          wide_data_t; | 
|---|
| 73 | typedef uint32_t                             data_t; | 
|---|
| 74 | typedef uint32_t                             tag_t; | 
|---|
| 75 | typedef uint32_t                             be_t; | 
|---|
| 76 | typedef uint32_t                             copy_t; | 
|---|
| 77 |  | 
|---|
| 78 | /* States of the TGT_CMD fsm */ | 
|---|
| 79 | enum tgt_cmd_fsm_state_e | 
|---|
| 80 | { | 
|---|
| 81 | TGT_CMD_IDLE, | 
|---|
| 82 | TGT_CMD_READ, | 
|---|
| 83 | TGT_CMD_WRITE, | 
|---|
| 84 | TGT_CMD_CAS, | 
|---|
| 85 | TGT_CMD_ERROR, | 
|---|
| 86 | TGT_CMD_CONFIG | 
|---|
| 87 | }; | 
|---|
| 88 |  | 
|---|
| 89 | /* States of the TGT_RSP fsm */ | 
|---|
| 90 | enum tgt_rsp_fsm_state_e | 
|---|
| 91 | { | 
|---|
| 92 | TGT_RSP_READ_IDLE, | 
|---|
| 93 | TGT_RSP_WRITE_IDLE, | 
|---|
| 94 | TGT_RSP_CAS_IDLE, | 
|---|
| 95 | TGT_RSP_XRAM_IDLE, | 
|---|
| 96 | TGT_RSP_MULTI_ACK_IDLE, | 
|---|
| 97 | TGT_RSP_CLEANUP_IDLE, | 
|---|
| 98 | TGT_RSP_CONFIG_IDLE, | 
|---|
| 99 | TGT_RSP_TGT_CMD_IDLE, | 
|---|
| 100 | TGT_RSP_READ, | 
|---|
| 101 | TGT_RSP_WRITE, | 
|---|
| 102 | TGT_RSP_CAS, | 
|---|
| 103 | TGT_RSP_XRAM, | 
|---|
| 104 | TGT_RSP_MULTI_ACK, | 
|---|
| 105 | TGT_RSP_CLEANUP, | 
|---|
| 106 | TGT_RSP_CONFIG, | 
|---|
| 107 | TGT_RSP_TGT_CMD | 
|---|
| 108 | }; | 
|---|
| 109 |  | 
|---|
| 110 | /* States of the DSPIN_TGT fsm */ | 
|---|
| 111 | enum cc_receive_fsm_state_e | 
|---|
| 112 | { | 
|---|
| 113 | CC_RECEIVE_IDLE, | 
|---|
| 114 | CC_RECEIVE_CLEANUP, | 
|---|
| 115 | CC_RECEIVE_CLEANUP_EOP, | 
|---|
| 116 | CC_RECEIVE_MULTI_ACK | 
|---|
| 117 | }; | 
|---|
| 118 |  | 
|---|
| 119 | /* States of the CC_SEND fsm */ | 
|---|
| 120 | enum cc_send_fsm_state_e | 
|---|
| 121 | { | 
|---|
| 122 | CC_SEND_XRAM_RSP_IDLE, | 
|---|
| 123 | CC_SEND_WRITE_IDLE, | 
|---|
| 124 | CC_SEND_CAS_IDLE, | 
|---|
| 125 | CC_SEND_CONFIG_IDLE, | 
|---|
| 126 | CC_SEND_XRAM_RSP_BRDCAST_HEADER, | 
|---|
| 127 | CC_SEND_XRAM_RSP_BRDCAST_NLINE, | 
|---|
| 128 | CC_SEND_XRAM_RSP_INVAL_HEADER, | 
|---|
| 129 | CC_SEND_XRAM_RSP_INVAL_NLINE, | 
|---|
| 130 | CC_SEND_WRITE_BRDCAST_HEADER, | 
|---|
| 131 | CC_SEND_WRITE_BRDCAST_NLINE, | 
|---|
| 132 | CC_SEND_WRITE_UPDT_HEADER, | 
|---|
| 133 | CC_SEND_WRITE_UPDT_NLINE, | 
|---|
| 134 | CC_SEND_WRITE_UPDT_DATA, | 
|---|
| 135 | CC_SEND_CAS_BRDCAST_HEADER, | 
|---|
| 136 | CC_SEND_CAS_BRDCAST_NLINE, | 
|---|
| 137 | CC_SEND_CAS_UPDT_HEADER, | 
|---|
| 138 | CC_SEND_CAS_UPDT_NLINE, | 
|---|
| 139 | CC_SEND_CAS_UPDT_DATA, | 
|---|
| 140 | CC_SEND_CAS_UPDT_DATA_HIGH, | 
|---|
| 141 | CC_SEND_CONFIG_INVAL_HEADER, | 
|---|
| 142 | CC_SEND_CONFIG_INVAL_NLINE, | 
|---|
| 143 | CC_SEND_CONFIG_BRDCAST_HEADER, | 
|---|
| 144 | CC_SEND_CONFIG_BRDCAST_NLINE | 
|---|
| 145 | }; | 
|---|
| 146 |  | 
|---|
| 147 | /* States of the MULTI_ACK fsm */ | 
|---|
| 148 | enum multi_ack_fsm_state_e | 
|---|
| 149 | { | 
|---|
| 150 | MULTI_ACK_IDLE, | 
|---|
| 151 | MULTI_ACK_UPT_LOCK, | 
|---|
| 152 | MULTI_ACK_UPT_CLEAR, | 
|---|
| 153 | MULTI_ACK_WRITE_RSP | 
|---|
| 154 | }; | 
|---|
| 155 |  | 
|---|
| 156 | /* States of the CONFIG fsm */ | 
|---|
| 157 | enum config_fsm_state_e | 
|---|
| 158 | { | 
|---|
| 159 | CONFIG_IDLE, | 
|---|
| 160 | CONFIG_LOOP, | 
|---|
| 161 | CONFIG_WAIT, | 
|---|
| 162 | CONFIG_RSP, | 
|---|
| 163 | CONFIG_DIR_REQ, | 
|---|
| 164 | CONFIG_DIR_ACCESS, | 
|---|
| 165 | CONFIG_IVT_LOCK, | 
|---|
| 166 | CONFIG_BC_SEND, | 
|---|
| 167 | CONFIG_INVAL_SEND, | 
|---|
| 168 | CONFIG_HEAP_REQ, | 
|---|
| 169 | CONFIG_HEAP_SCAN, | 
|---|
| 170 | CONFIG_HEAP_LAST, | 
|---|
| 171 | CONFIG_TRT_LOCK, | 
|---|
| 172 | CONFIG_TRT_SET, | 
|---|
| 173 | CONFIG_PUT_REQ | 
|---|
| 174 | }; | 
|---|
| 175 |  | 
|---|
| 176 | /* States of the READ fsm */ | 
|---|
| 177 | enum read_fsm_state_e | 
|---|
| 178 | { | 
|---|
| 179 | READ_IDLE, | 
|---|
| 180 | READ_DIR_REQ, | 
|---|
| 181 | READ_DIR_LOCK, | 
|---|
| 182 | READ_DIR_HIT, | 
|---|
| 183 | READ_HEAP_REQ, | 
|---|
| 184 | READ_HEAP_LOCK, | 
|---|
| 185 | READ_HEAP_WRITE, | 
|---|
| 186 | READ_HEAP_ERASE, | 
|---|
| 187 | READ_HEAP_LAST, | 
|---|
| 188 | READ_RSP, | 
|---|
| 189 | READ_TRT_LOCK, | 
|---|
| 190 | READ_TRT_SET, | 
|---|
| 191 | READ_TRT_REQ | 
|---|
| 192 | }; | 
|---|
| 193 |  | 
|---|
| 194 | /* States of the WRITE fsm */ | 
|---|
| 195 | enum write_fsm_state_e | 
|---|
| 196 | { | 
|---|
| 197 | WRITE_IDLE, | 
|---|
| 198 | WRITE_NEXT, | 
|---|
| 199 | WRITE_DIR_REQ, | 
|---|
| 200 | WRITE_DIR_LOCK, | 
|---|
| 201 | WRITE_DIR_HIT, | 
|---|
| 202 | WRITE_UPT_LOCK, | 
|---|
| 203 | WRITE_UPT_HEAP_LOCK, | 
|---|
| 204 | WRITE_UPT_REQ, | 
|---|
| 205 | WRITE_UPT_NEXT, | 
|---|
| 206 | WRITE_UPT_DEC, | 
|---|
| 207 | WRITE_RSP, | 
|---|
| 208 | WRITE_MISS_TRT_LOCK, | 
|---|
| 209 | WRITE_MISS_TRT_DATA, | 
|---|
| 210 | WRITE_MISS_TRT_SET, | 
|---|
| 211 | WRITE_MISS_XRAM_REQ, | 
|---|
| 212 | WRITE_BC_DIR_READ, | 
|---|
| 213 | WRITE_BC_TRT_LOCK, | 
|---|
| 214 | WRITE_BC_IVT_LOCK, | 
|---|
| 215 | WRITE_BC_DIR_INVAL, | 
|---|
| 216 | WRITE_BC_CC_SEND, | 
|---|
| 217 | WRITE_BC_XRAM_REQ, | 
|---|
| 218 | WRITE_WAIT | 
|---|
| 219 | }; | 
|---|
| 220 |  | 
|---|
| 221 | /* States of the IXR_RSP fsm */ | 
|---|
| 222 | enum ixr_rsp_fsm_state_e | 
|---|
| 223 | { | 
|---|
| 224 | IXR_RSP_IDLE, | 
|---|
| 225 | IXR_RSP_TRT_ERASE, | 
|---|
| 226 | IXR_RSP_TRT_READ | 
|---|
| 227 | }; | 
|---|
| 228 |  | 
|---|
| 229 | /* States of the XRAM_RSP fsm */ | 
|---|
| 230 | enum xram_rsp_fsm_state_e | 
|---|
| 231 | { | 
|---|
| 232 | XRAM_RSP_IDLE, | 
|---|
| 233 | XRAM_RSP_TRT_COPY, | 
|---|
| 234 | XRAM_RSP_TRT_DIRTY, | 
|---|
| 235 | XRAM_RSP_DIR_LOCK, | 
|---|
| 236 | XRAM_RSP_DIR_UPDT, | 
|---|
| 237 | XRAM_RSP_DIR_RSP, | 
|---|
| 238 | XRAM_RSP_IVT_LOCK, | 
|---|
| 239 | XRAM_RSP_INVAL_WAIT, | 
|---|
| 240 | XRAM_RSP_INVAL, | 
|---|
| 241 | XRAM_RSP_WRITE_DIRTY, | 
|---|
| 242 | XRAM_RSP_HEAP_REQ, | 
|---|
| 243 | XRAM_RSP_HEAP_ERASE, | 
|---|
| 244 | XRAM_RSP_HEAP_LAST, | 
|---|
| 245 | XRAM_RSP_ERROR_ERASE, | 
|---|
| 246 | XRAM_RSP_ERROR_RSP | 
|---|
| 247 | }; | 
|---|
| 248 |  | 
|---|
| 249 | /* States of the IXR_CMD fsm */ | 
|---|
| 250 | enum ixr_cmd_fsm_state_e | 
|---|
| 251 | { | 
|---|
| 252 | IXR_CMD_READ_IDLE, | 
|---|
| 253 | IXR_CMD_WRITE_IDLE, | 
|---|
| 254 | IXR_CMD_CAS_IDLE, | 
|---|
| 255 | IXR_CMD_XRAM_IDLE, | 
|---|
| 256 | IXR_CMD_CONFIG_IDLE, | 
|---|
| 257 | IXR_CMD_READ_TRT, | 
|---|
| 258 | IXR_CMD_WRITE_TRT, | 
|---|
| 259 | IXR_CMD_CAS_TRT, | 
|---|
| 260 | IXR_CMD_XRAM_TRT, | 
|---|
| 261 | IXR_CMD_CONFIG_TRT, | 
|---|
| 262 | IXR_CMD_READ_SEND, | 
|---|
| 263 | IXR_CMD_WRITE_SEND, | 
|---|
| 264 | IXR_CMD_CAS_SEND, | 
|---|
| 265 | IXR_CMD_XRAM_SEND, | 
|---|
| 266 | IXR_CMD_CONFIG_SEND | 
|---|
| 267 | }; | 
|---|
| 268 |  | 
|---|
| 269 | /* States of the CAS fsm */ | 
|---|
| 270 | enum cas_fsm_state_e | 
|---|
| 271 | { | 
|---|
| 272 | CAS_IDLE, | 
|---|
| 273 | CAS_DIR_REQ, | 
|---|
| 274 | CAS_DIR_LOCK, | 
|---|
| 275 | CAS_DIR_HIT_READ, | 
|---|
| 276 | CAS_DIR_HIT_COMPARE, | 
|---|
| 277 | CAS_DIR_HIT_WRITE, | 
|---|
| 278 | CAS_UPT_LOCK, | 
|---|
| 279 | CAS_UPT_HEAP_LOCK, | 
|---|
| 280 | CAS_UPT_REQ, | 
|---|
| 281 | CAS_UPT_NEXT, | 
|---|
| 282 | CAS_BC_TRT_LOCK, | 
|---|
| 283 | CAS_BC_IVT_LOCK, | 
|---|
| 284 | CAS_BC_DIR_INVAL, | 
|---|
| 285 | CAS_BC_CC_SEND, | 
|---|
| 286 | CAS_BC_XRAM_REQ, | 
|---|
| 287 | CAS_RSP_FAIL, | 
|---|
| 288 | CAS_RSP_SUCCESS, | 
|---|
| 289 | CAS_MISS_TRT_LOCK, | 
|---|
| 290 | CAS_MISS_TRT_SET, | 
|---|
| 291 | CAS_MISS_XRAM_REQ, | 
|---|
| 292 | CAS_WAIT | 
|---|
| 293 | }; | 
|---|
| 294 |  | 
|---|
| 295 | /* States of the CLEANUP fsm */ | 
|---|
| 296 | enum cleanup_fsm_state_e | 
|---|
| 297 | { | 
|---|
| 298 | CLEANUP_IDLE, | 
|---|
| 299 | CLEANUP_GET_NLINE, | 
|---|
| 300 | CLEANUP_DIR_REQ, | 
|---|
| 301 | CLEANUP_DIR_LOCK, | 
|---|
| 302 | CLEANUP_DIR_WRITE, | 
|---|
| 303 | CLEANUP_HEAP_REQ, | 
|---|
| 304 | CLEANUP_HEAP_LOCK, | 
|---|
| 305 | CLEANUP_HEAP_SEARCH, | 
|---|
| 306 | CLEANUP_HEAP_CLEAN, | 
|---|
| 307 | CLEANUP_HEAP_FREE, | 
|---|
| 308 | CLEANUP_IVT_LOCK, | 
|---|
| 309 | CLEANUP_IVT_DECREMENT, | 
|---|
| 310 | CLEANUP_IVT_CLEAR, | 
|---|
| 311 | CLEANUP_WRITE_RSP, | 
|---|
| 312 | CLEANUP_SEND_CLACK | 
|---|
| 313 | }; | 
|---|
| 314 |  | 
|---|
| 315 | /* States of the ALLOC_DIR fsm */ | 
|---|
| 316 | enum alloc_dir_fsm_state_e | 
|---|
| 317 | { | 
|---|
| 318 | ALLOC_DIR_RESET, | 
|---|
| 319 | ALLOC_DIR_READ, | 
|---|
| 320 | ALLOC_DIR_WRITE, | 
|---|
| 321 | ALLOC_DIR_CAS, | 
|---|
| 322 | ALLOC_DIR_CLEANUP, | 
|---|
| 323 | ALLOC_DIR_XRAM_RSP, | 
|---|
| 324 | ALLOC_DIR_CONFIG | 
|---|
| 325 | }; | 
|---|
| 326 |  | 
|---|
| 327 | /* States of the ALLOC_TRT fsm */ | 
|---|
| 328 | enum alloc_trt_fsm_state_e | 
|---|
| 329 | { | 
|---|
| 330 | ALLOC_TRT_READ, | 
|---|
| 331 | ALLOC_TRT_WRITE, | 
|---|
| 332 | ALLOC_TRT_CAS, | 
|---|
| 333 | ALLOC_TRT_XRAM_RSP, | 
|---|
| 334 | ALLOC_TRT_IXR_RSP, | 
|---|
| 335 | ALLOC_TRT_IXR_CMD, | 
|---|
| 336 | ALLOC_TRT_CONFIG | 
|---|
| 337 | }; | 
|---|
| 338 |  | 
|---|
| 339 | /* States of the ALLOC_UPT fsm */ | 
|---|
| 340 | enum alloc_upt_fsm_state_e | 
|---|
| 341 | { | 
|---|
| 342 | ALLOC_UPT_WRITE, | 
|---|
| 343 | ALLOC_UPT_CAS, | 
|---|
| 344 | ALLOC_UPT_MULTI_ACK | 
|---|
| 345 | }; | 
|---|
| 346 |  | 
|---|
| 347 | /* States of the ALLOC_IVT fsm */ | 
|---|
| 348 | enum alloc_ivt_fsm_state_e | 
|---|
| 349 | { | 
|---|
| 350 | ALLOC_IVT_WRITE, | 
|---|
| 351 | ALLOC_IVT_XRAM_RSP, | 
|---|
| 352 | ALLOC_IVT_CLEANUP, | 
|---|
| 353 | ALLOC_IVT_CAS, | 
|---|
| 354 | ALLOC_IVT_CONFIG | 
|---|
| 355 | }; | 
|---|
| 356 |  | 
|---|
| 357 | /* States of the ALLOC_HEAP fsm */ | 
|---|
| 358 | enum alloc_heap_fsm_state_e | 
|---|
| 359 | { | 
|---|
| 360 | ALLOC_HEAP_RESET, | 
|---|
| 361 | ALLOC_HEAP_READ, | 
|---|
| 362 | ALLOC_HEAP_WRITE, | 
|---|
| 363 | ALLOC_HEAP_CAS, | 
|---|
| 364 | ALLOC_HEAP_CLEANUP, | 
|---|
| 365 | ALLOC_HEAP_XRAM_RSP, | 
|---|
| 366 | ALLOC_HEAP_CONFIG | 
|---|
| 367 | }; | 
|---|
| 368 |  | 
|---|
| 369 | /* transaction type, pktid field */ | 
|---|
| 370 | enum transaction_type_e | 
|---|
| 371 | { | 
|---|
| 372 | // b3 unused | 
|---|
| 373 | // b2 READ / NOT READ | 
|---|
| 374 | // Si READ | 
|---|
| 375 | //  b1 DATA / INS | 
|---|
| 376 | //  b0 UNC / MISS | 
|---|
| 377 | // Si NOT READ | 
|---|
| 378 | //  b1 accÚs table llsc type SW / other | 
|---|
| 379 | //  b2 WRITE/CAS/LL/SC | 
|---|
| 380 | TYPE_READ_DATA_UNC          = 0x0, | 
|---|
| 381 | TYPE_READ_DATA_MISS         = 0x1, | 
|---|
| 382 | TYPE_READ_INS_UNC           = 0x2, | 
|---|
| 383 | TYPE_READ_INS_MISS          = 0x3, | 
|---|
| 384 | TYPE_WRITE                  = 0x4, | 
|---|
| 385 | TYPE_CAS                    = 0x5, | 
|---|
| 386 | TYPE_LL                     = 0x6, | 
|---|
| 387 | TYPE_SC                     = 0x7 | 
|---|
| 388 | }; | 
|---|
| 389 |  | 
|---|
| 390 | /* SC return values */ | 
|---|
| 391 | enum sc_status_type_e | 
|---|
| 392 | { | 
|---|
| 393 | SC_SUCCESS  =   0x00000000, | 
|---|
| 394 | SC_FAIL     =   0x00000001 | 
|---|
| 395 | }; | 
|---|
| 396 |  | 
|---|
| 397 | // debug variables | 
|---|
| 398 | bool                 m_debug; | 
|---|
| 399 | bool                 m_debug_previous_valid; | 
|---|
| 400 | size_t               m_debug_previous_count; | 
|---|
| 401 | bool                 m_debug_previous_dirty; | 
|---|
| 402 | data_t *             m_debug_previous_data; | 
|---|
| 403 | data_t *             m_debug_data; | 
|---|
| 404 |  | 
|---|
| 405 | // instrumentation counters | 
|---|
| 406 | uint32_t     m_cpt_cycles;         // Counter of cycles | 
|---|
| 407 |  | 
|---|
| 408 | // Counters accessible in software (not yet but eventually) | 
|---|
| 409 | uint32_t     m_cpt_read_local;     // Number of local READ transactions | 
|---|
| 410 | uint32_t     m_cpt_read_remote;    // number of remote READ transactions | 
|---|
| 411 | uint32_t     m_cpt_read_cost;      // Number of (flits * distance) for READs | 
|---|
| 412 |  | 
|---|
| 413 | uint32_t     m_cpt_write_local;    // Number of local WRITE transactions | 
|---|
| 414 | uint32_t     m_cpt_write_remote;   // number of remote WRITE transactions | 
|---|
| 415 | uint32_t     m_cpt_write_flits_local;  // number of flits for local WRITEs | 
|---|
| 416 | uint32_t     m_cpt_write_flits_remote; // number of flits for remote WRITEs | 
|---|
| 417 | uint32_t     m_cpt_write_cost;     // Number of (flits * distance) for WRITEs | 
|---|
| 418 |  | 
|---|
| 419 | uint32_t     m_cpt_ll_local;       // Number of local LL transactions | 
|---|
| 420 | uint32_t     m_cpt_ll_remote;      // number of remote LL transactions | 
|---|
| 421 | uint32_t     m_cpt_ll_cost;        // Number of (flits * distance) for LLs | 
|---|
| 422 |  | 
|---|
| 423 | uint32_t     m_cpt_sc_local;       // Number of local SC transactions | 
|---|
| 424 | uint32_t     m_cpt_sc_remote;      // number of remote SC transactions | 
|---|
| 425 | uint32_t     m_cpt_sc_cost;        // Number of (flits * distance) for SCs | 
|---|
| 426 |  | 
|---|
| 427 | uint32_t     m_cpt_cas_local;      // Number of local SC transactions | 
|---|
| 428 | uint32_t     m_cpt_cas_remote;     // number of remote SC transactions | 
|---|
| 429 | uint32_t     m_cpt_cas_cost;       // Number of (flits * distance) for SCs | 
|---|
| 430 |  | 
|---|
| 431 | uint32_t     m_cpt_update;         // Number of requests causing an UPDATE | 
|---|
| 432 | uint32_t     m_cpt_update_local;   // Number of local UPDATE transactions | 
|---|
| 433 | uint32_t     m_cpt_update_remote;  // Number of remote UPDATE transactions | 
|---|
| 434 | uint32_t     m_cpt_update_cost;    // Number of (flits * distance) for UPDT | 
|---|
| 435 |  | 
|---|
| 436 | uint32_t     m_cpt_minval;         // Number of requests causing M_INV | 
|---|
| 437 | uint32_t     m_cpt_minval_local;   // Number of local M_INV transactions | 
|---|
| 438 | uint32_t     m_cpt_minval_remote;  // Number of remote M_INV transactions | 
|---|
| 439 | uint32_t     m_cpt_minval_cost;    // Number of (flits * distance) for M_INV | 
|---|
| 440 |  | 
|---|
| 441 | uint32_t     m_cpt_binval;         // Number of BROADCAST INVAL | 
|---|
| 442 |  | 
|---|
| 443 | uint32_t     m_cpt_cleanup_local;  // Number of local CLEANUP transactions | 
|---|
| 444 | uint32_t     m_cpt_cleanup_remote; // Number of remote CLEANUP transactions | 
|---|
| 445 | uint32_t     m_cpt_cleanup_cost;   // Number of (flits * distance) for CLEANUPs | 
|---|
| 446 |  | 
|---|
| 447 | // Counters not accessible by software | 
|---|
| 448 | uint32_t     m_cpt_read_miss;      // Number of MISS READ | 
|---|
| 449 | uint32_t     m_cpt_write_miss;     // Number of MISS WRITE | 
|---|
| 450 | uint32_t     m_cpt_write_dirty;    // Cumulated length for WRITE transactions | 
|---|
| 451 | uint32_t     m_cpt_write_broadcast;// Number of BROADCAST INVAL because write | 
|---|
| 452 |  | 
|---|
| 453 | uint32_t     m_cpt_trt_rb;         // Read blocked by a hit in trt | 
|---|
| 454 | uint32_t     m_cpt_trt_full;       // Transaction blocked due to a full trt | 
|---|
| 455 |  | 
|---|
| 456 | uint32_t     m_cpt_get; | 
|---|
| 457 | uint32_t     m_cpt_put; | 
|---|
| 458 |  | 
|---|
| 459 | size_t       m_prev_count; | 
|---|
| 460 |  | 
|---|
| 461 | protected: | 
|---|
| 462 |  | 
|---|
| 463 | SC_HAS_PROCESS(VciMemCache); | 
|---|
| 464 |  | 
|---|
| 465 | public: | 
|---|
| 466 | sc_in<bool>                                 p_clk; | 
|---|
| 467 | sc_in<bool>                                 p_resetn; | 
|---|
| 468 | soclib::caba::VciTarget<vci_param_int>      p_vci_tgt; | 
|---|
| 469 | soclib::caba::VciInitiator<vci_param_ext>   p_vci_ixr; | 
|---|
| 470 | soclib::caba::DspinInput<dspin_in_width>    p_dspin_p2m; | 
|---|
| 471 | soclib::caba::DspinOutput<dspin_out_width>  p_dspin_m2p; | 
|---|
| 472 | soclib::caba::DspinOutput<dspin_out_width>  p_dspin_clack; | 
|---|
| 473 |  | 
|---|
| 474 | #if MONITOR_MEMCACHE_FSM == 1 | 
|---|
| 475 | sc_out<int> p_read_fsm; | 
|---|
| 476 | sc_out<int> p_write_fsm; | 
|---|
| 477 | sc_out<int> p_xram_rsp_fsm; | 
|---|
| 478 | sc_out<int> p_cas_fsm; | 
|---|
| 479 | sc_out<int> p_cleanup_fsm; | 
|---|
| 480 | sc_out<int> p_config_fsm; | 
|---|
| 481 | sc_out<int> p_alloc_heap_fsm; | 
|---|
| 482 | sc_out<int> p_alloc_dir_fsm; | 
|---|
| 483 | sc_out<int> p_alloc_trt_fsm; | 
|---|
| 484 | sc_out<int> p_alloc_upt_fsm; | 
|---|
| 485 | sc_out<int> p_alloc_ivt_fsm; | 
|---|
| 486 | sc_out<int> p_tgt_cmd_fsm; | 
|---|
| 487 | sc_out<int> p_tgt_rsp_fsm; | 
|---|
| 488 | sc_out<int> p_ixr_cmd_fsm; | 
|---|
| 489 | sc_out<int> p_ixr_rsp_fsm; | 
|---|
| 490 | sc_out<int> p_cc_send_fsm; | 
|---|
| 491 | sc_out<int> p_cc_receive_fsm; | 
|---|
| 492 | sc_out<int> p_multi_ack_fsm; | 
|---|
| 493 | #endif | 
|---|
| 494 |  | 
|---|
| 495 | VciMemCache( | 
|---|
| 496 | sc_module_name name,                                // Instance Name | 
|---|
| 497 | const soclib::common::MappingTable &mtp,            // Mapping table INT network | 
|---|
| 498 | const soclib::common::MappingTable &mtx,            // Mapping table RAM network | 
|---|
| 499 | const soclib::common::IntTab       &srcid_x,        // global index RAM network | 
|---|
| 500 | const soclib::common::IntTab       &tgtid_d,        // global index INT network | 
|---|
| 501 | const size_t                       x_width,         // X width in platform | 
|---|
| 502 | const size_t                       y_width,         // Y width in platform | 
|---|
| 503 | const size_t                       nways,           // Number of ways per set | 
|---|
| 504 | const size_t                       nsets,           // Number of sets | 
|---|
| 505 | const size_t                       nwords,          // Number of words per line | 
|---|
| 506 | const size_t                       max_copies,      // max number of copies | 
|---|
| 507 | const size_t                       heap_size=HEAP_ENTRIES, | 
|---|
| 508 | const size_t                       trt_lines=TRT_ENTRIES, | 
|---|
| 509 | const size_t                       upt_lines=UPT_ENTRIES, | 
|---|
| 510 | const size_t                       ivt_lines=IVT_ENTRIES, | 
|---|
| 511 | const size_t                       debug_start_cycle=0, | 
|---|
| 512 | const bool                         debug_ok=false ); | 
|---|
| 513 |  | 
|---|
| 514 | ~VciMemCache(); | 
|---|
| 515 |  | 
|---|
| 516 | void print_stats(bool activity_counters, bool stats); | 
|---|
| 517 | void print_trace( size_t detailed = 0 ); | 
|---|
| 518 | void cache_monitor(addr_t addr); | 
|---|
| 519 | void start_monitor(addr_t addr, addr_t length); | 
|---|
| 520 | void stop_monitor(); | 
|---|
| 521 |  | 
|---|
| 522 | private: | 
|---|
| 523 |  | 
|---|
| 524 | void transition(); | 
|---|
| 525 | void genMoore(); | 
|---|
| 526 | void check_monitor(addr_t addr, data_t data, bool read); | 
|---|
| 527 |  | 
|---|
| 528 | uint32_t req_distance(uint32_t req_srcid); | 
|---|
| 529 | bool is_local_req(uint32_t req_srcid); | 
|---|
| 530 | int  read_instrumentation(uint32_t regr, uint32_t & rdata); | 
|---|
| 531 |  | 
|---|
| 532 | // Component attributes | 
|---|
| 533 | std::list<soclib::common::Segment> m_seglist;          // segments allocated | 
|---|
| 534 | size_t                             m_nseg;             // number of segments | 
|---|
| 535 | soclib::common::Segment            **m_seg;            // array of segments pointers | 
|---|
| 536 | size_t                             m_seg_config;       // config segment index | 
|---|
| 537 | const size_t                       m_srcid_x;          // global index on RAM network | 
|---|
| 538 | const size_t                       m_initiators;       // Number of initiators | 
|---|
| 539 | const size_t                       m_heap_size;        // Size of the heap | 
|---|
| 540 | const size_t                       m_ways;             // Number of ways in a set | 
|---|
| 541 | const size_t                       m_sets;             // Number of cache sets | 
|---|
| 542 | const size_t                       m_words;            // Number of words in a line | 
|---|
| 543 | size_t                             m_x_self;           // X self coordinate | 
|---|
| 544 | size_t                             m_y_self;           // Y self coordinate | 
|---|
| 545 | const size_t                       m_x_width;          // number of x bits in platform | 
|---|
| 546 | const size_t                       m_y_width;          // number of y bits in platform | 
|---|
| 547 | size_t                             m_debug_start_cycle; | 
|---|
| 548 | bool                               m_debug_ok; | 
|---|
| 549 | uint32_t                           m_trt_lines; | 
|---|
| 550 | TransactionTab                     m_trt;              // xram transaction table | 
|---|
| 551 | uint32_t                           m_upt_lines; | 
|---|
| 552 | UpdateTab                          m_upt;              // pending update | 
|---|
| 553 | UpdateTab                          m_ivt;              // pending invalidate | 
|---|
| 554 | CacheDirectory                     m_cache_directory;  // data cache directory | 
|---|
| 555 | CacheData                          m_cache_data;       // data array[set][way][word] | 
|---|
| 556 | HeapDirectory                      m_heap;             // heap for copies | 
|---|
| 557 | size_t                             m_max_copies;       // max number of copies in heap | 
|---|
| 558 | GenericLLSCGlobalTable | 
|---|
| 559 | < 32  ,    // number of slots | 
|---|
| 560 | 4096,    // number of processors in the system | 
|---|
| 561 | 8000,    // registration life (# of LL operations) | 
|---|
| 562 | addr_t >                         m_llsc_table;       // ll/sc registration table | 
|---|
| 563 |  | 
|---|
| 564 | // adress masks | 
|---|
| 565 | const soclib::common::AddressMaskingTable<addr_t>   m_x; | 
|---|
| 566 | const soclib::common::AddressMaskingTable<addr_t>   m_y; | 
|---|
| 567 | const soclib::common::AddressMaskingTable<addr_t>   m_z; | 
|---|
| 568 | const soclib::common::AddressMaskingTable<addr_t>   m_nline; | 
|---|
| 569 |  | 
|---|
| 570 | // broadcast address | 
|---|
| 571 | uint32_t                           m_broadcast_boundaries; | 
|---|
| 572 |  | 
|---|
| 573 | // configuration interface constants | 
|---|
| 574 | const uint32_t m_config_addr_mask; | 
|---|
| 575 | const uint32_t m_config_regr_width; | 
|---|
| 576 | const uint32_t m_config_func_width; | 
|---|
| 577 | const uint32_t m_config_regr_idx_mask; | 
|---|
| 578 | const uint32_t m_config_func_idx_mask; | 
|---|
| 579 |  | 
|---|
| 580 | // Fifo between TGT_CMD fsm and READ fsm | 
|---|
| 581 | GenericFifo<addr_t>    m_cmd_read_addr_fifo; | 
|---|
| 582 | GenericFifo<size_t>    m_cmd_read_length_fifo; | 
|---|
| 583 | GenericFifo<size_t>    m_cmd_read_srcid_fifo; | 
|---|
| 584 | GenericFifo<size_t>    m_cmd_read_trdid_fifo; | 
|---|
| 585 | GenericFifo<size_t>    m_cmd_read_pktid_fifo; | 
|---|
| 586 |  | 
|---|
| 587 | // Fifo between TGT_CMD fsm and WRITE fsm | 
|---|
| 588 | GenericFifo<addr_t>    m_cmd_write_addr_fifo; | 
|---|
| 589 | GenericFifo<bool>      m_cmd_write_eop_fifo; | 
|---|
| 590 | GenericFifo<size_t>    m_cmd_write_srcid_fifo; | 
|---|
| 591 | GenericFifo<size_t>    m_cmd_write_trdid_fifo; | 
|---|
| 592 | GenericFifo<size_t>    m_cmd_write_pktid_fifo; | 
|---|
| 593 | GenericFifo<data_t>    m_cmd_write_data_fifo; | 
|---|
| 594 | GenericFifo<be_t>      m_cmd_write_be_fifo; | 
|---|
| 595 |  | 
|---|
| 596 | // Fifo between TGT_CMD fsm and CAS fsm | 
|---|
| 597 | GenericFifo<addr_t>    m_cmd_cas_addr_fifo; | 
|---|
| 598 | GenericFifo<bool>      m_cmd_cas_eop_fifo; | 
|---|
| 599 | GenericFifo<size_t>    m_cmd_cas_srcid_fifo; | 
|---|
| 600 | GenericFifo<size_t>    m_cmd_cas_trdid_fifo; | 
|---|
| 601 | GenericFifo<size_t>    m_cmd_cas_pktid_fifo; | 
|---|
| 602 | GenericFifo<data_t>    m_cmd_cas_wdata_fifo; | 
|---|
| 603 |  | 
|---|
| 604 | // Fifo between CC_RECEIVE fsm and CLEANUP fsm | 
|---|
| 605 | GenericFifo<uint64_t>  m_cc_receive_to_cleanup_fifo; | 
|---|
| 606 |  | 
|---|
| 607 | // Fifo between CC_RECEIVE fsm and MULTI_ACK fsm | 
|---|
| 608 | GenericFifo<uint64_t>  m_cc_receive_to_multi_ack_fifo; | 
|---|
| 609 |  | 
|---|
| 610 | // Buffer between TGT_CMD fsm and TGT_RSP fsm | 
|---|
| 611 | // (segmentation violation response request) | 
|---|
| 612 | sc_signal<bool>     r_tgt_cmd_to_tgt_rsp_req; | 
|---|
| 613 |  | 
|---|
| 614 | sc_signal<uint32_t> r_tgt_cmd_to_tgt_rsp_rdata; | 
|---|
| 615 | sc_signal<size_t>   r_tgt_cmd_to_tgt_rsp_error; | 
|---|
| 616 | sc_signal<size_t>   r_tgt_cmd_to_tgt_rsp_srcid; | 
|---|
| 617 | sc_signal<size_t>   r_tgt_cmd_to_tgt_rsp_trdid; | 
|---|
| 618 | sc_signal<size_t>   r_tgt_cmd_to_tgt_rsp_pktid; | 
|---|
| 619 |  | 
|---|
| 620 | sc_signal<addr_t>   r_tgt_cmd_config_addr; | 
|---|
| 621 | sc_signal<size_t>   r_tgt_cmd_config_cmd; | 
|---|
| 622 |  | 
|---|
| 623 | ////////////////////////////////////////////////// | 
|---|
| 624 | // Registers controlled by the TGT_CMD fsm | 
|---|
| 625 | ////////////////////////////////////////////////// | 
|---|
| 626 |  | 
|---|
| 627 | sc_signal<int>         r_tgt_cmd_fsm; | 
|---|
| 628 |  | 
|---|
| 629 | /////////////////////////////////////////////////////// | 
|---|
| 630 | // Registers controlled by the CONFIG fsm | 
|---|
| 631 | /////////////////////////////////////////////////////// | 
|---|
| 632 |  | 
|---|
| 633 | sc_signal<int>      r_config_fsm;               // FSM state | 
|---|
| 634 | sc_signal<bool>     r_config_lock;              // lock protecting exclusive access | 
|---|
| 635 | sc_signal<int>      r_config_cmd;               // config request type | 
|---|
| 636 | sc_signal<addr_t>   r_config_address;           // target buffer physical address | 
|---|
| 637 | sc_signal<size_t>   r_config_srcid;             // config request srcid | 
|---|
| 638 | sc_signal<size_t>   r_config_trdid;             // config request trdid | 
|---|
| 639 | sc_signal<size_t>   r_config_pktid;             // config request pktid | 
|---|
| 640 | sc_signal<size_t>   r_config_cmd_lines;         // number of lines to be handled | 
|---|
| 641 | sc_signal<size_t>   r_config_rsp_lines;         // number of lines not completed | 
|---|
| 642 | sc_signal<size_t>   r_config_dir_way;           // DIR: selected way | 
|---|
| 643 | sc_signal<bool>     r_config_dir_lock;          // DIR: locked entry | 
|---|
| 644 | sc_signal<size_t>   r_config_dir_count;         // DIR: number of copies | 
|---|
| 645 | sc_signal<bool>     r_config_dir_is_cnt;        // DIR: counter mode (broadcast) | 
|---|
| 646 | sc_signal<size_t>   r_config_dir_copy_srcid;    // DIR: first copy SRCID | 
|---|
| 647 | sc_signal<bool>     r_config_dir_copy_inst;     // DIR: first copy L1 type | 
|---|
| 648 | sc_signal<size_t>   r_config_dir_ptr;           // DIR: index of next copy in HEAP | 
|---|
| 649 | sc_signal<size_t>   r_config_heap_next;         // current pointer to scan HEAP | 
|---|
| 650 | sc_signal<size_t>   r_config_trt_index;         // selected entry in TRT | 
|---|
| 651 | sc_signal<size_t>   r_config_ivt_index;         // selected entry in IVT | 
|---|
| 652 |  | 
|---|
| 653 | // Buffer between CONFIG fsm and IXR_CMD fsm | 
|---|
| 654 | sc_signal<bool>     r_config_to_ixr_cmd_req;    // valid request | 
|---|
| 655 | sc_signal<size_t>   r_config_to_ixr_cmd_index;  // TRT index | 
|---|
| 656 |  | 
|---|
| 657 | // Buffer between CONFIG fsm and TGT_RSP fsm (send a done response to L1 cache) | 
|---|
| 658 | sc_signal<bool>     r_config_to_tgt_rsp_req;    // valid request | 
|---|
| 659 | sc_signal<bool>     r_config_to_tgt_rsp_error;  // error response | 
|---|
| 660 | sc_signal<size_t>   r_config_to_tgt_rsp_srcid;  // Transaction srcid | 
|---|
| 661 | sc_signal<size_t>   r_config_to_tgt_rsp_trdid;  // Transaction trdid | 
|---|
| 662 | sc_signal<size_t>   r_config_to_tgt_rsp_pktid;  // Transaction pktid | 
|---|
| 663 |  | 
|---|
| 664 | // Buffer between CONFIG fsm and CC_SEND fsm (multi-inval / broadcast-inval) | 
|---|
| 665 | sc_signal<bool>     r_config_to_cc_send_multi_req;    // multi-inval request | 
|---|
| 666 | sc_signal<bool>     r_config_to_cc_send_brdcast_req;  // broadcast-inval request | 
|---|
| 667 | sc_signal<addr_t>   r_config_to_cc_send_nline;        // line index | 
|---|
| 668 | sc_signal<size_t>   r_config_to_cc_send_trdid;        // UPT index | 
|---|
| 669 | GenericFifo<bool>   m_config_to_cc_send_inst_fifo;    // fifo for the L1 type | 
|---|
| 670 | GenericFifo<size_t> m_config_to_cc_send_srcid_fifo;   // fifo for owners srcid | 
|---|
| 671 |  | 
|---|
| 672 | /////////////////////////////////////////////////////// | 
|---|
| 673 | // Registers controlled by the READ fsm | 
|---|
| 674 | /////////////////////////////////////////////////////// | 
|---|
| 675 |  | 
|---|
| 676 | sc_signal<int>      r_read_fsm;                 // FSM state | 
|---|
| 677 | sc_signal<size_t>   r_read_copy;                // Srcid of the first copy | 
|---|
| 678 | sc_signal<size_t>   r_read_copy_cache;          // Srcid of the first copy | 
|---|
| 679 | sc_signal<bool>     r_read_copy_inst;           // Type of the first copy | 
|---|
| 680 | sc_signal<tag_t>    r_read_tag;                 // cache line tag (in directory) | 
|---|
| 681 | sc_signal<bool>     r_read_is_cnt;              // is_cnt bit (in directory) | 
|---|
| 682 | sc_signal<bool>     r_read_lock;                // lock bit (in directory) | 
|---|
| 683 | sc_signal<bool>     r_read_dirty;               // dirty bit (in directory) | 
|---|
| 684 | sc_signal<size_t>   r_read_count;               // number of copies | 
|---|
| 685 | sc_signal<size_t>   r_read_ptr;                 // pointer to the heap | 
|---|
| 686 | sc_signal<data_t> * r_read_data;                // data (one cache line) | 
|---|
| 687 | sc_signal<size_t>   r_read_way;                 // associative way (in cache) | 
|---|
| 688 | sc_signal<size_t>   r_read_trt_index;           // Transaction Table index | 
|---|
| 689 | sc_signal<size_t>   r_read_next_ptr;            // Next entry to point to | 
|---|
| 690 | sc_signal<bool>     r_read_last_free;           // Last free entry | 
|---|
| 691 | sc_signal<addr_t>   r_read_ll_key;              // LL key from llsc_global_table | 
|---|
| 692 |  | 
|---|
| 693 | // Buffer between READ fsm and IXR_CMD fsm | 
|---|
| 694 | sc_signal<bool>     r_read_to_ixr_cmd_req;      // valid request | 
|---|
| 695 | sc_signal<size_t>   r_read_to_ixr_cmd_index;    // TRT index | 
|---|
| 696 |  | 
|---|
| 697 | // Buffer between READ fsm and TGT_RSP fsm (send a hit read response to L1 cache) | 
|---|
| 698 | sc_signal<bool>     r_read_to_tgt_rsp_req;      // valid request | 
|---|
| 699 | sc_signal<size_t>   r_read_to_tgt_rsp_srcid;    // Transaction srcid | 
|---|
| 700 | sc_signal<size_t>   r_read_to_tgt_rsp_trdid;    // Transaction trdid | 
|---|
| 701 | sc_signal<size_t>   r_read_to_tgt_rsp_pktid;    // Transaction pktid | 
|---|
| 702 | sc_signal<data_t> * r_read_to_tgt_rsp_data;     // data (one cache line) | 
|---|
| 703 | sc_signal<size_t>   r_read_to_tgt_rsp_word;     // first word of the response | 
|---|
| 704 | sc_signal<size_t>   r_read_to_tgt_rsp_length;   // length of the response | 
|---|
| 705 | sc_signal<addr_t>   r_read_to_tgt_rsp_ll_key;   // LL key from llsc_global_table | 
|---|
| 706 |  | 
|---|
| 707 | /////////////////////////////////////////////////////////////// | 
|---|
| 708 | // Registers controlled by the WRITE fsm | 
|---|
| 709 | /////////////////////////////////////////////////////////////// | 
|---|
| 710 |  | 
|---|
| 711 | sc_signal<int>      r_write_fsm;                // FSM state | 
|---|
| 712 | sc_signal<addr_t>   r_write_address;            // first word address | 
|---|
| 713 | sc_signal<size_t>   r_write_word_index;         // first word index in line | 
|---|
| 714 | sc_signal<size_t>   r_write_word_count;         // number of words in line | 
|---|
| 715 | sc_signal<size_t>   r_write_srcid;              // transaction srcid | 
|---|
| 716 | sc_signal<size_t>   r_write_trdid;              // transaction trdid | 
|---|
| 717 | sc_signal<size_t>   r_write_pktid;              // transaction pktid | 
|---|
| 718 | sc_signal<data_t> * r_write_data;               // data (one cache line) | 
|---|
| 719 | sc_signal<be_t>   * r_write_be;                 // one byte enable per word | 
|---|
| 720 | sc_signal<bool>     r_write_byte;               // (BE != 0X0) and (BE != 0xF) | 
|---|
| 721 | sc_signal<bool>     r_write_is_cnt;             // is_cnt bit (in directory) | 
|---|
| 722 | sc_signal<bool>     r_write_lock;               // lock bit (in directory) | 
|---|
| 723 | sc_signal<tag_t>    r_write_tag;                // cache line tag (in directory) | 
|---|
| 724 | sc_signal<size_t>   r_write_copy;               // first owner of the line | 
|---|
| 725 | sc_signal<size_t>   r_write_copy_cache;         // first owner of the line | 
|---|
| 726 | sc_signal<bool>     r_write_copy_inst;          // is this owner a ICache ? | 
|---|
| 727 | sc_signal<size_t>   r_write_count;              // number of copies | 
|---|
| 728 | sc_signal<size_t>   r_write_ptr;                // pointer to the heap | 
|---|
| 729 | sc_signal<size_t>   r_write_next_ptr;           // next pointer to the heap | 
|---|
| 730 | sc_signal<bool>     r_write_to_dec;             // need to decrement update counter | 
|---|
| 731 | sc_signal<size_t>   r_write_way;                // way of the line | 
|---|
| 732 | sc_signal<size_t>   r_write_trt_index;          // index in Transaction Table | 
|---|
| 733 | sc_signal<size_t>   r_write_upt_index;          // index in Update Table | 
|---|
| 734 | sc_signal<bool>     r_write_sc_fail;            // sc command failed | 
|---|
| 735 | sc_signal<data_t>   r_write_sc_key;             // sc command key | 
|---|
| 736 | sc_signal<bool>     r_write_bc_data_we;         // Write enable for data buffer | 
|---|
| 737 |  | 
|---|
| 738 | // Buffer between WRITE fsm and TGT_RSP fsm (acknowledge a write command from L1) | 
|---|
| 739 | sc_signal<bool>     r_write_to_tgt_rsp_req;     // valid request | 
|---|
| 740 | sc_signal<size_t>   r_write_to_tgt_rsp_srcid;   // transaction srcid | 
|---|
| 741 | sc_signal<size_t>   r_write_to_tgt_rsp_trdid;   // transaction trdid | 
|---|
| 742 | sc_signal<size_t>   r_write_to_tgt_rsp_pktid;   // transaction pktid | 
|---|
| 743 | sc_signal<bool>     r_write_to_tgt_rsp_sc_fail; // sc command failed | 
|---|
| 744 |  | 
|---|
| 745 | // Buffer between WRITE fsm and IXR_CMD fsm | 
|---|
| 746 | sc_signal<bool>     r_write_to_ixr_cmd_req;     // valid request | 
|---|
| 747 | sc_signal<size_t>   r_write_to_ixr_cmd_index;   // TRT index | 
|---|
| 748 |  | 
|---|
| 749 | // Buffer between WRITE fsm and CC_SEND fsm (Update/Invalidate L1 caches) | 
|---|
| 750 | sc_signal<bool>     r_write_to_cc_send_multi_req;     // valid multicast request | 
|---|
| 751 | sc_signal<bool>     r_write_to_cc_send_brdcast_req;   // valid brdcast request | 
|---|
| 752 | sc_signal<addr_t>   r_write_to_cc_send_nline;         // cache line index | 
|---|
| 753 | sc_signal<size_t>   r_write_to_cc_send_trdid;         // index in Update Table | 
|---|
| 754 | sc_signal<data_t> * r_write_to_cc_send_data;          // data (one cache line) | 
|---|
| 755 | sc_signal<be_t>   * r_write_to_cc_send_be;            // word enable | 
|---|
| 756 | sc_signal<size_t>   r_write_to_cc_send_count;         // number of words in line | 
|---|
| 757 | sc_signal<size_t>   r_write_to_cc_send_index;         // index of first word in line | 
|---|
| 758 | GenericFifo<bool>   m_write_to_cc_send_inst_fifo;     // fifo for the L1 type | 
|---|
| 759 | GenericFifo<size_t> m_write_to_cc_send_srcid_fifo;    // fifo for srcids | 
|---|
| 760 |  | 
|---|
| 761 | // Buffer between WRITE fsm and MULTI_ACK fsm (Decrement UPT entry) | 
|---|
| 762 | sc_signal<bool>     r_write_to_multi_ack_req;       // valid request | 
|---|
| 763 | sc_signal<size_t>   r_write_to_multi_ack_upt_index; // index in update table | 
|---|
| 764 |  | 
|---|
| 765 | ///////////////////////////////////////////////////////// | 
|---|
| 766 | // Registers controlled by MULTI_ACK fsm | 
|---|
| 767 | ////////////////////////////////////////////////////////// | 
|---|
| 768 |  | 
|---|
| 769 | sc_signal<int>      r_multi_ack_fsm;       // FSM state | 
|---|
| 770 | sc_signal<size_t>   r_multi_ack_upt_index; // index in the Update Table | 
|---|
| 771 | sc_signal<size_t>   r_multi_ack_srcid;     // pending write srcid | 
|---|
| 772 | sc_signal<size_t>   r_multi_ack_trdid;     // pending write trdid | 
|---|
| 773 | sc_signal<size_t>   r_multi_ack_pktid;     // pending write pktid | 
|---|
| 774 | sc_signal<addr_t>   r_multi_ack_nline;     // pending write nline | 
|---|
| 775 |  | 
|---|
| 776 | // Buffer between MULTI_ACK fsm and TGT_RSP fsm (complete write/update transaction) | 
|---|
| 777 | sc_signal<bool>     r_multi_ack_to_tgt_rsp_req;   // valid request | 
|---|
| 778 | sc_signal<size_t>   r_multi_ack_to_tgt_rsp_srcid; // Transaction srcid | 
|---|
| 779 | sc_signal<size_t>   r_multi_ack_to_tgt_rsp_trdid; // Transaction trdid | 
|---|
| 780 | sc_signal<size_t>   r_multi_ack_to_tgt_rsp_pktid; // Transaction pktid | 
|---|
| 781 |  | 
|---|
| 782 | /////////////////////////////////////////////////////// | 
|---|
| 783 | // Registers controlled by CLEANUP fsm | 
|---|
| 784 | /////////////////////////////////////////////////////// | 
|---|
| 785 |  | 
|---|
| 786 | sc_signal<int>      r_cleanup_fsm;           // FSM state | 
|---|
| 787 | sc_signal<size_t>   r_cleanup_srcid;         // transaction srcid | 
|---|
| 788 | sc_signal<bool>     r_cleanup_inst;          // Instruction or Data ? | 
|---|
| 789 | sc_signal<size_t>   r_cleanup_way_index;     // L1 Cache Way index | 
|---|
| 790 | sc_signal<addr_t>   r_cleanup_nline;         // cache line index | 
|---|
| 791 |  | 
|---|
| 792 |  | 
|---|
| 793 | sc_signal<copy_t>   r_cleanup_copy;          // first copy | 
|---|
| 794 | sc_signal<copy_t>   r_cleanup_copy_cache;    // first copy | 
|---|
| 795 | sc_signal<size_t>   r_cleanup_copy_inst;     // type of the first copy | 
|---|
| 796 | sc_signal<copy_t>   r_cleanup_count;         // number of copies | 
|---|
| 797 | sc_signal<size_t>   r_cleanup_ptr;           // pointer to the heap | 
|---|
| 798 | sc_signal<size_t>   r_cleanup_prev_ptr;      // previous pointer to the heap | 
|---|
| 799 | sc_signal<size_t>   r_cleanup_prev_srcid;    // srcid of previous heap entry | 
|---|
| 800 | sc_signal<size_t>   r_cleanup_prev_cache_id; // srcid of previous heap entry | 
|---|
| 801 | sc_signal<bool>     r_cleanup_prev_inst;     // inst bit of previous heap entry | 
|---|
| 802 | sc_signal<size_t>   r_cleanup_next_ptr;      // next pointer to the heap | 
|---|
| 803 | sc_signal<tag_t>    r_cleanup_tag;           // cache line tag (in directory) | 
|---|
| 804 | sc_signal<bool>     r_cleanup_is_cnt;        // inst bit (in directory) | 
|---|
| 805 | sc_signal<bool>     r_cleanup_lock;          // lock bit (in directory) | 
|---|
| 806 | sc_signal<bool>     r_cleanup_dirty;         // dirty bit (in directory) | 
|---|
| 807 | sc_signal<size_t>   r_cleanup_way;           // associative way (in cache) | 
|---|
| 808 |  | 
|---|
| 809 | sc_signal<size_t>   r_cleanup_write_srcid;   // srcid of write rsp | 
|---|
| 810 | sc_signal<size_t>   r_cleanup_write_trdid;   // trdid of write rsp | 
|---|
| 811 | sc_signal<size_t>   r_cleanup_write_pktid;   // pktid of write rsp | 
|---|
| 812 |  | 
|---|
| 813 | sc_signal<bool>     r_cleanup_need_rsp;      // write response required | 
|---|
| 814 | sc_signal<bool>     r_cleanup_need_ack;      // config acknowledge required | 
|---|
| 815 |  | 
|---|
| 816 | sc_signal<size_t>   r_cleanup_index;         // index of the INVAL line (in the UPT) | 
|---|
| 817 |  | 
|---|
| 818 | // Buffer between CLEANUP fsm and TGT_RSP fsm (acknowledge a write command from L1) | 
|---|
| 819 | sc_signal<bool>     r_cleanup_to_tgt_rsp_req;   // valid request | 
|---|
| 820 | sc_signal<size_t>   r_cleanup_to_tgt_rsp_srcid; // transaction srcid | 
|---|
| 821 | sc_signal<size_t>   r_cleanup_to_tgt_rsp_trdid; // transaction trdid | 
|---|
| 822 | sc_signal<size_t>   r_cleanup_to_tgt_rsp_pktid; // transaction pktid | 
|---|
| 823 |  | 
|---|
| 824 | /////////////////////////////////////////////////////// | 
|---|
| 825 | // Registers controlled by CAS fsm | 
|---|
| 826 | /////////////////////////////////////////////////////// | 
|---|
| 827 |  | 
|---|
| 828 | sc_signal<int>      r_cas_fsm;              // FSM state | 
|---|
| 829 | sc_signal<data_t>   r_cas_wdata;            // write data word | 
|---|
| 830 | sc_signal<data_t> * r_cas_rdata;            // read data word | 
|---|
| 831 | sc_signal<uint32_t> r_cas_lfsr;             // lfsr for random introducing | 
|---|
| 832 | sc_signal<size_t>   r_cas_cpt;              // size of command | 
|---|
| 833 | sc_signal<copy_t>   r_cas_copy;             // Srcid of the first copy | 
|---|
| 834 | sc_signal<copy_t>   r_cas_copy_cache;       // Srcid of the first copy | 
|---|
| 835 | sc_signal<bool>     r_cas_copy_inst;        // Type of the first copy | 
|---|
| 836 | sc_signal<size_t>   r_cas_count;            // number of copies | 
|---|
| 837 | sc_signal<size_t>   r_cas_ptr;              // pointer to the heap | 
|---|
| 838 | sc_signal<size_t>   r_cas_next_ptr;         // next pointer to the heap | 
|---|
| 839 | sc_signal<bool>     r_cas_is_cnt;           // is_cnt bit (in directory) | 
|---|
| 840 | sc_signal<bool>     r_cas_dirty;            // dirty bit (in directory) | 
|---|
| 841 | sc_signal<size_t>   r_cas_way;              // way in directory | 
|---|
| 842 | sc_signal<size_t>   r_cas_set;              // set in directory | 
|---|
| 843 | sc_signal<data_t>   r_cas_tag;              // cache line tag (in directory) | 
|---|
| 844 | sc_signal<size_t>   r_cas_trt_index;        // Transaction Table index | 
|---|
| 845 | sc_signal<size_t>   r_cas_upt_index;        // Update Table index | 
|---|
| 846 | sc_signal<data_t> * r_cas_data;             // cache line data | 
|---|
| 847 |  | 
|---|
| 848 | // Buffer between CAS fsm and IXR_CMD fsm | 
|---|
| 849 | sc_signal<bool>     r_cas_to_ixr_cmd_req;   // valid request | 
|---|
| 850 | sc_signal<size_t>   r_cas_to_ixr_cmd_index; // TRT index | 
|---|
| 851 |  | 
|---|
| 852 | // Buffer between CAS fsm and TGT_RSP fsm | 
|---|
| 853 | sc_signal<bool>     r_cas_to_tgt_rsp_req;   // valid request | 
|---|
| 854 | sc_signal<data_t>   r_cas_to_tgt_rsp_data;  // read data word | 
|---|
| 855 | sc_signal<size_t>   r_cas_to_tgt_rsp_srcid; // Transaction srcid | 
|---|
| 856 | sc_signal<size_t>   r_cas_to_tgt_rsp_trdid; // Transaction trdid | 
|---|
| 857 | sc_signal<size_t>   r_cas_to_tgt_rsp_pktid; // Transaction pktid | 
|---|
| 858 |  | 
|---|
| 859 | // Buffer between CAS fsm and CC_SEND fsm (Update/Invalidate L1 caches) | 
|---|
| 860 | sc_signal<bool>     r_cas_to_cc_send_multi_req;     // valid request | 
|---|
| 861 | sc_signal<bool>     r_cas_to_cc_send_brdcast_req;   // brdcast request | 
|---|
| 862 | sc_signal<addr_t>   r_cas_to_cc_send_nline;         // cache line index | 
|---|
| 863 | sc_signal<size_t>   r_cas_to_cc_send_trdid;         // index in Update Table | 
|---|
| 864 | sc_signal<data_t>   r_cas_to_cc_send_wdata;         // data (one word) | 
|---|
| 865 | sc_signal<bool>     r_cas_to_cc_send_is_long;       // it is a 64 bits CAS | 
|---|
| 866 | sc_signal<data_t>   r_cas_to_cc_send_wdata_high;    // data high (one word) | 
|---|
| 867 | sc_signal<size_t>   r_cas_to_cc_send_index;         // index of the word in line | 
|---|
| 868 | GenericFifo<bool>   m_cas_to_cc_send_inst_fifo;     // fifo for the L1 type | 
|---|
| 869 | GenericFifo<size_t> m_cas_to_cc_send_srcid_fifo;    // fifo for srcids | 
|---|
| 870 |  | 
|---|
| 871 | //////////////////////////////////////////////////// | 
|---|
| 872 | // Registers controlled by the IXR_RSP fsm | 
|---|
| 873 | //////////////////////////////////////////////////// | 
|---|
| 874 |  | 
|---|
| 875 | sc_signal<int>      r_ixr_rsp_fsm;                // FSM state | 
|---|
| 876 | sc_signal<size_t>   r_ixr_rsp_trt_index;          // TRT entry index | 
|---|
| 877 | sc_signal<size_t>   r_ixr_rsp_cpt;                // word counter | 
|---|
| 878 |  | 
|---|
| 879 | // Buffer between IXR_RSP fsm and CONFIG fsm  (response from the XRAM) | 
|---|
| 880 | sc_signal<bool>     r_ixr_rsp_to_config_ack;      // one single bit | 
|---|
| 881 |  | 
|---|
| 882 | // Buffer between IXR_RSP fsm and XRAM_RSP fsm  (response from the XRAM) | 
|---|
| 883 | sc_signal<bool>   * r_ixr_rsp_to_xram_rsp_rok;    // one bit per TRT entry | 
|---|
| 884 |  | 
|---|
| 885 | //////////////////////////////////////////////////// | 
|---|
| 886 | // Registers controlled by the XRAM_RSP fsm | 
|---|
| 887 | //////////////////////////////////////////////////// | 
|---|
| 888 |  | 
|---|
| 889 | sc_signal<int>      r_xram_rsp_fsm;               // FSM state | 
|---|
| 890 | sc_signal<size_t>   r_xram_rsp_trt_index;         // TRT entry index | 
|---|
| 891 | TransactionTabEntry r_xram_rsp_trt_buf;           // TRT entry local buffer | 
|---|
| 892 | sc_signal<bool>     r_xram_rsp_victim_inval;      // victim line invalidate | 
|---|
| 893 | sc_signal<bool>     r_xram_rsp_victim_is_cnt;     // victim line inst bit | 
|---|
| 894 | sc_signal<bool>     r_xram_rsp_victim_dirty;      // victim line dirty bit | 
|---|
| 895 | sc_signal<size_t>   r_xram_rsp_victim_way;        // victim line way | 
|---|
| 896 | sc_signal<size_t>   r_xram_rsp_victim_set;        // victim line set | 
|---|
| 897 | sc_signal<addr_t>   r_xram_rsp_victim_nline;      // victim line index | 
|---|
| 898 | sc_signal<copy_t>   r_xram_rsp_victim_copy;       // victim line first copy | 
|---|
| 899 | sc_signal<copy_t>   r_xram_rsp_victim_copy_cache; // victim line first copy | 
|---|
| 900 | sc_signal<bool>     r_xram_rsp_victim_copy_inst;  // victim line type of first copy | 
|---|
| 901 | sc_signal<size_t>   r_xram_rsp_victim_count;      // victim line number of copies | 
|---|
| 902 | sc_signal<size_t>   r_xram_rsp_victim_ptr;        // victim line pointer to the heap | 
|---|
| 903 | sc_signal<data_t> * r_xram_rsp_victim_data;       // victim line data | 
|---|
| 904 | sc_signal<size_t>   r_xram_rsp_ivt_index;         // IVT entry index | 
|---|
| 905 | sc_signal<size_t>   r_xram_rsp_next_ptr;          // Next pointer to the heap | 
|---|
| 906 |  | 
|---|
| 907 | // Buffer between XRAM_RSP fsm and TGT_RSP fsm  (response to L1 cache) | 
|---|
| 908 | sc_signal<bool>     r_xram_rsp_to_tgt_rsp_req;    // Valid request | 
|---|
| 909 | sc_signal<size_t>   r_xram_rsp_to_tgt_rsp_srcid;  // Transaction srcid | 
|---|
| 910 | sc_signal<size_t>   r_xram_rsp_to_tgt_rsp_trdid;  // Transaction trdid | 
|---|
| 911 | sc_signal<size_t>   r_xram_rsp_to_tgt_rsp_pktid;  // Transaction pktid | 
|---|
| 912 | sc_signal<data_t> * r_xram_rsp_to_tgt_rsp_data;   // data (one cache line) | 
|---|
| 913 | sc_signal<size_t>   r_xram_rsp_to_tgt_rsp_word;   // first word index | 
|---|
| 914 | sc_signal<size_t>   r_xram_rsp_to_tgt_rsp_length; // length of the response | 
|---|
| 915 | sc_signal<bool>     r_xram_rsp_to_tgt_rsp_rerror; // send error to requester | 
|---|
| 916 | sc_signal<addr_t>   r_xram_rsp_to_tgt_rsp_ll_key; // LL key from llsc_global_table | 
|---|
| 917 |  | 
|---|
| 918 | // Buffer between XRAM_RSP fsm and CC_SEND fsm (Inval L1 Caches) | 
|---|
| 919 | sc_signal<bool>     r_xram_rsp_to_cc_send_multi_req;     // Valid request | 
|---|
| 920 | sc_signal<bool>     r_xram_rsp_to_cc_send_brdcast_req;   // Broadcast request | 
|---|
| 921 | sc_signal<addr_t>   r_xram_rsp_to_cc_send_nline;         // cache line index; | 
|---|
| 922 | sc_signal<size_t>   r_xram_rsp_to_cc_send_trdid;         // index of UPT entry | 
|---|
| 923 | GenericFifo<bool>   m_xram_rsp_to_cc_send_inst_fifo;     // fifo for the L1 type | 
|---|
| 924 | GenericFifo<size_t> m_xram_rsp_to_cc_send_srcid_fifo;    // fifo for srcids | 
|---|
| 925 |  | 
|---|
| 926 | // Buffer between XRAM_RSP fsm and IXR_CMD fsm | 
|---|
| 927 | sc_signal<bool>     r_xram_rsp_to_ixr_cmd_req;   // Valid request | 
|---|
| 928 | sc_signal<size_t>   r_xram_rsp_to_ixr_cmd_index; // TRT index | 
|---|
| 929 |  | 
|---|
| 930 | //////////////////////////////////////////////////// | 
|---|
| 931 | // Registers controlled by the IXR_CMD fsm | 
|---|
| 932 | //////////////////////////////////////////////////// | 
|---|
| 933 |  | 
|---|
| 934 | sc_signal<int>      r_ixr_cmd_fsm; | 
|---|
| 935 | sc_signal<size_t>   r_ixr_cmd_word;              // word index for a put | 
|---|
| 936 | sc_signal<size_t>   r_ixr_cmd_trdid;             // TRT index value | 
|---|
| 937 | sc_signal<addr_t>   r_ixr_cmd_address;           // address to XRAM | 
|---|
| 938 | sc_signal<data_t> * r_ixr_cmd_wdata;             // cache line buffer | 
|---|
| 939 | sc_signal<bool>     r_ixr_cmd_get;               // transaction type (PUT/GET) | 
|---|
| 940 |  | 
|---|
| 941 | //////////////////////////////////////////////////// | 
|---|
| 942 | // Registers controlled by TGT_RSP fsm | 
|---|
| 943 | //////////////////////////////////////////////////// | 
|---|
| 944 |  | 
|---|
| 945 | sc_signal<int>      r_tgt_rsp_fsm; | 
|---|
| 946 | sc_signal<size_t>   r_tgt_rsp_cpt; | 
|---|
| 947 | sc_signal<bool>     r_tgt_rsp_key_sent; | 
|---|
| 948 |  | 
|---|
| 949 | //////////////////////////////////////////////////// | 
|---|
| 950 | // Registers controlled by CC_SEND fsm | 
|---|
| 951 | //////////////////////////////////////////////////// | 
|---|
| 952 |  | 
|---|
| 953 | sc_signal<int>      r_cc_send_fsm; | 
|---|
| 954 | sc_signal<size_t>   r_cc_send_cpt; | 
|---|
| 955 | sc_signal<bool>     r_cc_send_inst; | 
|---|
| 956 |  | 
|---|
| 957 | //////////////////////////////////////////////////// | 
|---|
| 958 | // Registers controlled by CC_RECEIVE fsm | 
|---|
| 959 | //////////////////////////////////////////////////// | 
|---|
| 960 |  | 
|---|
| 961 | sc_signal<int>      r_cc_receive_fsm; | 
|---|
| 962 |  | 
|---|
| 963 | //////////////////////////////////////////////////// | 
|---|
| 964 | // Registers controlled by ALLOC_DIR fsm | 
|---|
| 965 | //////////////////////////////////////////////////// | 
|---|
| 966 |  | 
|---|
| 967 | sc_signal<int>      r_alloc_dir_fsm; | 
|---|
| 968 | sc_signal<unsigned> r_alloc_dir_reset_cpt; | 
|---|
| 969 |  | 
|---|
| 970 | //////////////////////////////////////////////////// | 
|---|
| 971 | // Registers controlled by ALLOC_TRT fsm | 
|---|
| 972 | //////////////////////////////////////////////////// | 
|---|
| 973 |  | 
|---|
| 974 | sc_signal<int>      r_alloc_trt_fsm; | 
|---|
| 975 |  | 
|---|
| 976 | //////////////////////////////////////////////////// | 
|---|
| 977 | // Registers controlled by ALLOC_UPT fsm | 
|---|
| 978 | //////////////////////////////////////////////////// | 
|---|
| 979 |  | 
|---|
| 980 | sc_signal<int>      r_alloc_upt_fsm; | 
|---|
| 981 |  | 
|---|
| 982 | //////////////////////////////////////////////////// | 
|---|
| 983 | // Registers controlled by ALLOC_IVT fsm | 
|---|
| 984 | //////////////////////////////////////////////////// | 
|---|
| 985 |  | 
|---|
| 986 | sc_signal<int>      r_alloc_ivt_fsm; | 
|---|
| 987 |  | 
|---|
| 988 | //////////////////////////////////////////////////// | 
|---|
| 989 | // Registers controlled by ALLOC_HEAP fsm | 
|---|
| 990 | //////////////////////////////////////////////////// | 
|---|
| 991 |  | 
|---|
| 992 | sc_signal<int>      r_alloc_heap_fsm; | 
|---|
| 993 | sc_signal<unsigned> r_alloc_heap_reset_cpt; | 
|---|
| 994 | }; // end class VciMemCache | 
|---|
| 995 |  | 
|---|
| 996 | }} | 
|---|
| 997 |  | 
|---|
| 998 | #endif | 
|---|
| 999 |  | 
|---|
| 1000 | // Local Variables: | 
|---|
| 1001 | // tab-width: 2 | 
|---|
| 1002 | // c-basic-offset: 2 | 
|---|
| 1003 | // c-file-offsets:((innamespace . 0)(inline-open . 0)) | 
|---|
| 1004 | // indent-tabs-mode: nil | 
|---|
| 1005 | // End: | 
|---|
| 1006 |  | 
|---|
| 1007 | // vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=2:softtabstop=2 | 
|---|
| 1008 |  | 
|---|