OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [cpu_sysc_plugin/] [riverlib/] [core/] [arith/] [shift.cpp] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      Left/Right shifter arithmetic/logic 32/64 bits.
6
 */
7
 
8
#include "shift.h"
9
#include "api_utils.h"
10
 
11
namespace debugger {
12
 
13
Shifter::Shifter(sc_module_name name_)
14
    : sc_module(name_) {
15
    SC_METHOD(comb);
16
    sensitive << i_a1;
17
    sensitive << i_a2;
18
};
19
 
20
void Shifter::generateVCD(sc_trace_file *i_vcd, sc_trace_file *o_vcd) {
21
}
22
 
23
void Shifter::comb() {
24
    sc_uint<64> wb_sll;
25
    sc_uint<64> wb_srl;
26
    sc_uint<64> wb_sra;
27
    sc_uint<32> wb_srlw;
28
    sc_uint<64> wb_sraw;
29
    sc_uint<64> v64;
30
    sc_uint<32> v32;
31
    sc_uint<64> msk64;
32
    sc_uint<64> msk32;
33
 
34
    v64 = i_a1.read();
35
    v32 = i_a1.read()(31, 0);
36
 
37
    if (i_a1.read()[63]) {
38
        msk64 = ~0;
39
    } else {
40
        msk64 = 0;
41
    }
42
    if (i_a1.read()[31]) {
43
        msk32 = ~0;
44
    } else {
45
        msk32 = 0;
46
    }
47
 
48
    switch (i_a2.read()) {
49
    case 0:
50
        wb_sll = v64;
51
        wb_srl = v64;
52
        wb_sra = v64;
53
        break;
54
    case 1:
55
        wb_sll = v64 << 1;
56
        wb_srl = v64(63, 1);
57
        wb_sra = (msk64(63, 63), v64(63, 1));
58
        break;
59
    case 2:
60
        wb_sll = v64 << 2;
61
        wb_srl = v64(63, 2);
62
        wb_sra = (msk64(63, 62), v64(63, 2));
63
        break;
64
    case 3:
65
        wb_sll = v64 << 3;
66
        wb_srl = v64(63, 3);
67
        wb_sra = (msk64(63, 61), v64(63, 3));
68
        break;
69
    case 4:
70
        wb_sll = v64 << 4;
71
        wb_srl = v64(63, 4);
72
        wb_sra = (msk64(63, 60), v64(63, 4));
73
        break;
74
    case 5:
75
        wb_sll = v64 << 5;
76
        wb_srl = v64(63, 5);
77
        wb_sra = (msk64(63, 59), v64(63, 5));
78
        break;
79
    case 6:
80
        wb_sll = v64 << 6;
81
        wb_srl = v64(63, 6);
82
        wb_sra = (msk64(63, 58), v64(63, 6));
83
        break;
84
    case 7:
85
        wb_sll = v64 << 7;
86
        wb_srl = v64(63, 7);
87
        wb_sra = (msk64(63, 57), v64(63, 7));
88
        break;
89
    case 8:
90
        wb_sll = v64 << 8;
91
        wb_srl = v64(63, 8);
92
        wb_sra = (msk64(63, 56), v64(63, 8));
93
        break;
94
    case 9:
95
        wb_sll = v64 << 9;
96
        wb_srl = v64(63, 9);
97
        wb_sra = (msk64(63, 55), v64(63, 9));
98
        break;
99
    case 10:
100
        wb_sll = v64 << 10;
101
        wb_srl = v64(63, 10);
102
        wb_sra = (msk64(63, 54), v64(63, 10));
103
        break;
104
    case 11:
105
        wb_sll = v64 << 11;
106
        wb_srl = v64(63, 11);
107
        wb_sra = (msk64(63, 53), v64(63, 11));
108
        break;
109
    case 12:
110
        wb_sll = v64 << 12;
111
        wb_srl = v64(63, 12);
112
        wb_sra = (msk64(63, 52), v64(63, 12));
113
        break;
114
    case 13:
115
        wb_sll = v64 << 13;
116
        wb_srl = v64(63, 13);
117
        wb_sra = (msk64(63, 51), v64(63, 13));
118
        break;
119
    case 14:
120
        wb_sll = v64 << 14;
121
        wb_srl = v64(63, 14);
122
        wb_sra = (msk64(63, 50), v64(63, 14));
123
        break;
124
    case 15:
125
        wb_sll = v64 << 15;
126
        wb_srl = v64(63, 15);
127
        wb_sra = (msk64(63, 49), v64(63, 15));
128
        break;
129
    case 16:
130
        wb_sll = v64 << 16;
131
        wb_srl = v64(63, 16);
132
        wb_sra = (msk64(63, 48), v64(63, 16));
133
        break;
134
    case 17:
135
        wb_sll = v64 << 17;
136
        wb_srl = v64(63, 17);
137
        wb_sra = (msk64(63, 47), v64(63, 17));
138
        break;
139
    case 18:
140
        wb_sll = v64 << 18;
141
        wb_srl = v64(63, 18);
142
        wb_sra = (msk64(63, 46), v64(63, 18));
143
        break;
144
    case 19:
145
        wb_sll = v64 << 19;
146
        wb_srl = v64(63, 19);
147
        wb_sra = (msk64(63, 45), v64(63, 19));
148
        break;
149
    case 20:
150
        wb_sll = v64 << 20;
151
        wb_srl = v64(63, 20);
152
        wb_sra = (msk64(63, 44), v64(63, 20));
153
        break;
154
    case 21:
155
        wb_sll = v64 << 21;
156
        wb_srl = v64(63, 21);
157
        wb_sra = (msk64(63, 43), v64(63, 21));
158
        break;
159
    case 22:
160
        wb_sll = v64 << 22;
161
        wb_srl = v64(63, 22);
162
        wb_sra = (msk64(63, 42), v64(63, 22));
163
        break;
164
    case 23:
165
        wb_sll = v64 << 23;
166
        wb_srl = v64(63, 23);
167
        wb_sra = (msk64(63, 41), v64(63, 23));
168
        break;
169
    case 24:
170
        wb_sll = v64 << 24;
171
        wb_srl = v64(63, 24);
172
        wb_sra = (msk64(63, 40), v64(63, 24));
173
        break;
174
    case 25:
175
        wb_sll = v64 << 25;
176
        wb_srl = v64(63, 25);
177
        wb_sra = (msk64(63, 39), v64(63, 25));
178
        break;
179
    case 26:
180
        wb_sll = v64 << 26;
181
        wb_srl = v64(63, 26);
182
        wb_sra = (msk64(63, 38), v64(63, 26));
183
        break;
184
    case 27:
185
        wb_sll = v64 << 27;
186
        wb_srl = v64(63, 27);
187
        wb_sra = (msk64(63, 37), v64(63, 27));
188
        break;
189
    case 28:
190
        wb_sll = v64 << 28;
191
        wb_srl = v64(63, 28);
192
        wb_sra = (msk64(63, 36), v64(63, 28));
193
        break;
194
    case 29:
195
        wb_sll = v64 << 29;
196
        wb_srl = v64(63, 29);
197
        wb_sra = (msk64(63, 35), v64(63, 29));
198
        break;
199
    case 30:
200
        wb_sll = v64 << 30;
201
        wb_srl = v64(63, 30);
202
        wb_sra = (msk64(63, 34), v64(63, 30));
203
        break;
204
    case 31:
205
        wb_sll = v64 << 31;
206
        wb_srl = v64(63, 31);
207
        wb_sra = (msk64(63, 33), v64(63, 31));
208
        break;
209
    case 32:
210
        wb_sll = v64 << 32;
211
        wb_srl = v64(63, 32);
212
        wb_sra = (msk64(63, 32), v64(63, 32));
213
        break;
214
    case 33:
215
        wb_sll = v64 << 33;
216
        wb_srl = v64(63, 33);
217
        wb_sra = (msk64(63, 31), v64(63, 33));
218
        break;
219
    case 34:
220
        wb_sll = v64 << 34;
221
        wb_srl = v64(63, 34);
222
        wb_sra = (msk64(63, 30), v64(63, 34));
223
        break;
224
    case 35:
225
        wb_sll = v64 << 35;
226
        wb_srl = v64(63, 35);
227
        wb_sra = (msk64(63, 29), v64(63, 35));
228
        break;
229
    case 36:
230
        wb_sll = v64 << 36;
231
        wb_srl = v64(63, 36);
232
        wb_sra = (msk64(63, 28), v64(63, 36));
233
        break;
234
    case 37:
235
        wb_sll = v64 << 37;
236
        wb_srl = v64(63, 37);
237
        wb_sra = (msk64(63, 27), v64(63, 37));
238
        break;
239
    case 38:
240
        wb_sll = v64 << 38;
241
        wb_srl = v64(63, 38);
242
        wb_sra = (msk64(63, 26), v64(63, 38));
243
        break;
244
    case 39:
245
        wb_sll = v64 << 39;
246
        wb_srl = v64(63, 39);
247
        wb_sra = (msk64(63, 25), v64(63, 39));
248
        break;
249
    case 40:
250
        wb_sll = v64 << 40;
251
        wb_srl = v64(63, 40);
252
        wb_sra = (msk64(63, 24), v64(63, 40));
253
        break;
254
    case 41:
255
        wb_sll = v64 << 41;
256
        wb_srl = v64(63, 41);
257
        wb_sra = (msk64(63, 23), v64(63, 41));
258
        break;
259
    case 42:
260
        wb_sll = v64 << 42;
261
        wb_srl = v64(63, 42);
262
        wb_sra = (msk64(63, 22), v64(63, 42));
263
        break;
264
    case 43:
265
        wb_sll = v64 << 43;
266
        wb_srl = v64(63, 43);
267
        wb_sra = (msk64(63, 21), v64(63, 43));
268
        break;
269
    case 44:
270
        wb_sll = v64 << 44;
271
        wb_srl = v64(63, 44);
272
        wb_sra = (msk64(63, 20), v64(63, 44));
273
        break;
274
    case 45:
275
        wb_sll = v64 << 45;
276
        wb_srl = v64(63, 45);
277
        wb_sra = (msk64(63, 19), v64(63, 45));
278
        break;
279
    case 46:
280
        wb_sll = v64 << 46;
281
        wb_srl = v64(63, 46);
282
        wb_sra = (msk64(63, 18), v64(63, 46));
283
        break;
284
    case 47:
285
        wb_sll = v64 << 47;
286
        wb_srl = v64(63, 47);
287
        wb_sra = (msk64(63, 17), v64(63, 47));
288
        break;
289
    case 48:
290
        wb_sll = v64 << 48;
291
        wb_srl = v64(63, 48);
292
        wb_sra = (msk64(63, 16), v64(63, 48));
293
        break;
294
    case 49:
295
        wb_sll = v64 << 49;
296
        wb_srl = v64(63, 49);
297
        wb_sra = (msk64(63, 15), v64(63, 49));
298
        break;
299
    case 50:
300
        wb_sll = v64 << 50;
301
        wb_srl = v64(63, 50);
302
        wb_sra = (msk64(63, 14), v64(63, 50));
303
        break;
304
    case 51:
305
        wb_sll = v64 << 51;
306
        wb_srl = v64(63, 51);
307
        wb_sra = (msk64(63, 13), v64(63, 51));
308
        break;
309
    case 52:
310
        wb_sll = v64 << 52;
311
        wb_srl = v64(63, 52);
312
        wb_sra = (msk64(63, 12), v64(63, 52));
313
        break;
314
    case 53:
315
        wb_sll = v64 << 53;
316
        wb_srl = v64(63, 53);
317
        wb_sra = (msk64(63, 11), v64(63, 53));
318
        break;
319
    case 54:
320
        wb_sll = v64 << 54;
321
        wb_srl = v64(63, 54);
322
        wb_sra = (msk64(63, 10), v64(63, 54));
323
        break;
324
    case 55:
325
        wb_sll = v64 << 55;
326
        wb_srl = v64(63, 55);
327
        wb_sra = (msk64(63, 9), v64(63, 55));
328
        break;
329
    case 56:
330
        wb_sll = v64 << 56;
331
        wb_srl = v64(63, 56);
332
        wb_sra = (msk64(63, 8), v64(63, 56));
333
        break;
334
    case 57:
335
        wb_sll = v64 << 57;
336
        wb_srl = v64(63, 57);
337
        wb_sra = (msk64(63, 7), v64(63, 57));
338
        break;
339
    case 58:
340
        wb_sll = v64 << 58;
341
        wb_srl = v64(63, 58);
342
        wb_sra = (msk64(63, 6), v64(63, 58));
343
        break;
344
    case 59:
345
        wb_sll = v64 << 59;
346
        wb_srl = v64(63, 59);
347
        wb_sra = (msk64(63, 5), v64(63, 59));
348
        break;
349
    case 60:
350
        wb_sll = v64 << 60;
351
        wb_srl = v64(63, 60);
352
        wb_sra = (msk64(63, 4), v64(63, 60));
353
        break;
354
    case 61:
355
        wb_sll = v64 << 61;
356
        wb_srl = v64(63, 61);
357
        wb_sra = (msk64(63, 3), v64(63, 61));
358
        break;
359
    case 62:
360
        wb_sll = v64 << 62;
361
        wb_srl = v64(63, 62);
362
        wb_sra = (msk64(63, 2), v64(63, 62));
363
        break;
364
    case 63:
365
        wb_sll = v64 << 63;
366
        wb_srl = v64(63, 63);
367
        wb_sra = (msk64(63, 1), v64(63, 63));
368
        break;
369
    default:;
370
    }
371
 
372
    switch (i_a2.read()(4, 0)) {
373
    case 0:
374
        wb_srlw = v32;
375
        wb_sraw = (msk32(63, 32), v32);
376
        break;
377
    case 1:
378
        wb_srlw = v32(31, 1);
379
        wb_sraw = (msk32(63, 31), v32(31, 1));
380
        break;
381
    case 2:
382
        wb_srlw = v32(31, 2);
383
        wb_sraw = (msk32(63, 30), v32(31, 2));
384
        break;
385
    case 3:
386
        wb_srlw = v32(31, 3);
387
        wb_sraw = (msk32(63, 29), v32(31, 3));
388
        break;
389
    case 4:
390
        wb_srlw = v32(31, 4);
391
        wb_sraw = (msk32(63, 28), v32(31, 4));
392
        break;
393
    case 5:
394
        wb_srlw = v32(31, 5);
395
        wb_sraw = (msk32(63, 27), v32(31, 5));
396
        break;
397
    case 6:
398
        wb_srlw = v32(31, 6);
399
        wb_sraw = (msk32(63, 26), v32(31, 6));
400
        break;
401
    case 7:
402
        wb_srlw = v32(31, 7);
403
        wb_sraw = (msk32(63, 25), v32(31, 7));
404
        break;
405
    case 8:
406
        wb_srlw = v32(31, 8);
407
        wb_sraw = (msk32(63, 24), v32(31, 8));
408
        break;
409
    case 9:
410
        wb_srlw = v32(31, 9);
411
        wb_sraw = (msk32(63, 23), v32(31, 9));
412
        break;
413
    case 10:
414
        wb_srlw = v32(31, 10);
415
        wb_sraw = (msk32(63, 22), v32(31, 10));
416
        break;
417
    case 11:
418
        wb_srlw = v32(31, 11);
419
        wb_sraw = (msk32(63, 21), v32(31, 11));
420
        break;
421
    case 12:
422
        wb_srlw = v32(31, 12);
423
        wb_sraw = (msk32(63, 20), v32(31, 12));
424
        break;
425
    case 13:
426
        wb_srlw = v32(31, 13);
427
        wb_sraw = (msk32(63, 19), v32(31, 13));
428
        break;
429
    case 14:
430
        wb_srlw = v32(31, 14);
431
        wb_sraw = (msk32(63, 18), v32(31, 14));
432
        break;
433
    case 15:
434
        wb_srlw = v32(31, 15);
435
        wb_sraw = (msk32(63, 17), v32(31, 15));
436
        break;
437
    case 16:
438
        wb_srlw = v32(31, 16);
439
        wb_sraw = (msk32(63, 16), v32(31, 16));
440
        break;
441
    case 17:
442
        wb_srlw = v32(31, 17);
443
        wb_sraw = (msk32(63, 15), v32(31, 17));
444
        break;
445
    case 18:
446
        wb_srlw = v32(31, 18);
447
        wb_sraw = (msk32(63, 14), v32(31, 18));
448
        break;
449
    case 19:
450
        wb_srlw = v32(31, 19);
451
        wb_sraw = (msk32(63, 13), v32(31, 19));
452
        break;
453
    case 20:
454
        wb_srlw = v32(31, 20);
455
        wb_sraw = (msk32(63, 12), v32(31, 20));
456
        break;
457
    case 21:
458
        wb_srlw = v32(31, 21);
459
        wb_sraw = (msk32(63, 11), v32(31, 21));
460
        break;
461
    case 22:
462
        wb_srlw = v32(31, 22);
463
        wb_sraw = (msk32(63, 10), v32(31, 22));
464
        break;
465
    case 23:
466
        wb_srlw = v32(31, 23);
467
        wb_sraw = (msk32(63, 9), v32(31, 23));
468
        break;
469
    case 24:
470
        wb_srlw = v32(31, 24);
471
        wb_sraw = (msk32(63, 8), v32(31, 24));
472
        break;
473
    case 25:
474
        wb_srlw = v32(31, 25);
475
        wb_sraw = (msk32(63, 7), v32(31, 25));
476
        break;
477
    case 26:
478
        wb_srlw = v32(31, 26);
479
        wb_sraw = (msk32(63, 6), v32(31, 26));
480
        break;
481
    case 27:
482
        wb_srlw = v32(31, 27);
483
        wb_sraw = (msk32(63, 5), v32(31, 27));
484
        break;
485
    case 28:
486
        wb_srlw = v32(31, 28);
487
        wb_sraw = (msk32(63, 4), v32(31, 28));
488
        break;
489
    case 29:
490
        wb_srlw = v32(31, 29);
491
        wb_sraw = (msk32(63, 3), v32(31, 29));
492
        break;
493
    case 30:
494
        wb_srlw = v32(31, 30);
495
        wb_sraw = (msk32(63, 2), v32(31, 30));
496
        break;
497
    case 31:
498
        wb_srlw = v32(31, 31);
499
        wb_sraw = (msk32(63, 1), v32(31, 31));
500
        break;
501
    default:;
502
    }
503
 
504
    o_sll = wb_sll;
505
    if (wb_sll[31]) {
506
        wb_sll(63, 32) = ~0;
507
    }
508
    o_sllw = wb_sll;
509
    o_srl = wb_srl;
510
    o_sra = wb_sra;
511
    o_srlw = wb_srlw.to_uint64();
512
    o_sraw = wb_sraw;
513
}
514
 
515
}  // namespace debugger
516
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.