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

Subversion Repositories w11

[/] [w11/] [tags/] [w11a_V0.74/] [tools/] [tbench/] [w11a/] [test_w11a_div.tcl] - Blame information for rev 38

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 34 wfjm
# $Id: test_w11a_div.tcl 704 2015-07-25 14:18:03Z mueller $
2 25 wfjm
#
3
# Copyright 2014- by Walter F.J. Mueller <W.F.J.Mueller@gsi.de>
4
# License disclaimer see LICENSE_gpl_v2.txt in $RETROBASE directory
5
#
6
# Revision History:
7
# Date         Rev Version  Comment
8
# 2014-07-27   575   1.0.2  drop tout value from asmwait, reply on asmwait_tout
9
# 2014-07-20   570   1.0.2  add rw11::div_show_test; test late div quit cases
10
# 2014-07-12   569   1.0.1  move sxt16/32 to rutil
11
# 2014-07-11   568   1.0    Initial version
12
# 2014-06-29   566   0.1    First draft
13
#
14
# Test div instruction
15
#
16
 
17
namespace eval rw11 {
18
 
19
  #
20
  # div_simh: calculate expected division result as pdp11 simh does it -------
21
  #
22
  # this pdp11 div emulation adopted from pdp11_cpu.c  (git head 2014-06-09)
23
  proc div_simh {ddi dri} {
24
    set src2 $dri
25
    set src  $ddi
26
    set qd   [expr ($ddi>>16) & 0xffff];     # w11a  default for V=1 bailouts
27
    set rd   [expr $ddi & 0xffff];           # "
28
    set n    [expr {($ddi<0) ^ ($dri<0)}];   # "
29
    set z    0;                              # "
30
 
31
    # quit if divident larger than possible 16 bit signed products
32
    if {$src > 1073774591 || $src < -1073741823} {
33
      return [list $qd $rd $n $z 1 0]
34
    }
35
    # quit if divisor zero
36
    if {$src2 == 0} {
37
      return [list $qd $rd $n $z 1 1]
38
    }
39
 
40
    if {$src2 & 0x8000} {
41
      set src2 [expr $src2 | ~ 077777]
42
    }
43
    if {$src  & 0x80000000} {
44
      set src  [expr $src  | ~ 017777777777]
45
    }
46
 
47
    # Tcl "/" uses 'round down' sematics, while C (and PDP11) 'round to 0'
48
    #   ddi dri   Tcl         C/C++ 
49
    #    34   5   q= 6 r= 4   q= 6 r= 4
50
    #    34  -5   q= 7 r=-1   q=-6 r= 4
51
    #   -34   5   q=-7 r= 1   q=-6 r=-4
52
    #   -34  -5   q= 6 r=-4   q= 6 r=-4
53
    #   Tcl --> r same sign as divisor
54
    #   C   --> r same sign as divident
55
    #   so add correction step to always get C/C++/PDP11 divide semantics
56
    #
57
    set q  [expr $src / $src2]
58
    set r  [expr ($src - ($src2 * $q))]
59
 
60
    if {$r!=0 && (($src<0) ^ ($r<0))} {    # divident and remainder diff sign 
61
      set r [expr $r - $src2]
62
      set q [expr $q + (($q<0)?1:-1)]
63
    }
64
 
65
    if {($q > 32767) || ($q < -32768)} {
66
      return [list $qd $rd $n $z 1 0]
67
    }
68
 
69
    set n [expr {$q < 0}]
70
    set z [expr {$q == 0}]
71
    return [list $q $r $n $z 0 0]
72
  }
73
 
74
  #
75
  # div_testd3: test division ddh,ddl,,dr + expected result ------------------
76
  #
77
  proc div_testd3 {cpu symName ddh ddl dr q r n z v c} {
78
    upvar 1 $symName sym
79
    set nzvc [expr {($n<<3) | ($z<<2) | ($v<<1) | $c}]
80
    set dr16 [expr {$dr & 0xffff}]
81
    set  q16 [expr {$q  & 0xffff}]
82
    set  r16 [expr {$r  & 0xffff}]
83
 
84
    # use rw11::div_show_test to enable generation of divtst files
85
    if {[info exists rw11::div_show_test] && $rw11::div_show_test} {
86
      set ddi [expr (($ddh&0xffff)<<16) + ($ddl&0xffff)]
87
      set ddi [rutil::sxt32 $ddi]
88
      set dri [rutil::sxt16 $dr16]
89
      set qi  [rutil::sxt16 $q16]
90
      set ri  [rutil::sxt16 $r16]
91
      puts [format "%06o %06o %06o : %d%d%d%d %06o %06o # %11d/%6d:%6d,%6d" \
92
                   $ddh $ddl $dr16 $n $z $v $c $q16 $r16 $ddi $dri $qi $ri ]
93
    }
94
 
95 34 wfjm
    rw11::asmrun  $cpu sym r0 $ddh r1 $ddl r2 $dr16
96 25 wfjm
    rw11::asmwait $cpu sym
97
 
98
    if {!$v && !$c} {           # test q and r only when V=0 C=0 expected
99
      lappend treglist r0 $q16 r1 $r16
100
    }
101
    lappend treglist r3 $nzvc
102
 
103 34 wfjm
    set errcnt [rw11::asmtreg $cpu {*}$treglist]
104 25 wfjm
 
105
    if {$errcnt} {
106
      puts [format \
107
            "div FAIL: dd=%06o,%06o dr=%06o exp: q=%06o r=%06o nzvc=%d%d%d%d" \
108
            $ddh $ddl $dr16 $q16 $r16 $n $z $v $c]
109
    }
110
    return $errcnt
111
  }
112
 
113
  #
114
  # div_testd2: test division dd,dr + expected result ------------------------
115
  #
116
  proc div_testd2 {cpu symName dd dr q r n z v c} {
117
    upvar 1 $symName sym
118
    set ddh [expr {($dd>>16) & 0xffff}]
119
    set ddl [expr { $dd      & 0xffff}]
120
    return [div_testd3 $cpu sym $ddh $ddl $dr $q $r $n $z $v $c]
121
  }
122
 
123
  #
124
  # div_testdqr: test division, give divisor, quotient and remainder ---------
125
  #
126
  proc div_testdqr {cpu symName dri qi ri} {
127
    upvar 1 $symName sym
128
    set dri [rutil::sxt16 $dri]
129
    set qi  [rutil::sxt16 $qi]
130
    set ri  [rutil::sxt16 $ri]
131
    set ddi [expr {$dri*$qi + $ri}]
132
 
133
    set simhres [div_simh $ddi $dri]
134
    set q  [lindex $simhres 0]
135
    set r  [lindex $simhres 1]
136
    set n  [lindex $simhres 2]
137
    set z  [lindex $simhres 3]
138
    set v  [lindex $simhres 4]
139
    set c  [lindex $simhres 5]
140
 
141
    return [div_testd2 $cpu sym $ddi $dri $q $r $n $z $v $c]
142
  }
143
}
144
 
145
# ----------------------------------------------------------------------------
146
rlc log "test_div: test div instruction"
147
 
148
$cpu ldasm -lst lst -sym sym {
149
        . = 1000
150
stack:
151
start:  div     r2,r0
152
        mov     @#177776,r3
153
        bic     #177760,r3
154
        halt
155
stop:
156
}
157
 
158
rlc log "  test basics (via testd2)"
159
#                               dd   dr      q      r   n z v c     
160
rlc log "    dr>0"
161
rw11::div_testd2  $cpu sym       0    3      0      0   0 1 0 0
162
rw11::div_testd2  $cpu sym       1    3      0      1   0 1 0 0
163
rw11::div_testd2  $cpu sym       2    3      0      2   0 1 0 0
164
rw11::div_testd2  $cpu sym       3    3      1      0   0 0 0 0
165
rw11::div_testd2  $cpu sym       4    3      1      1   0 0 0 0
166
rw11::div_testd2  $cpu sym      -1    3      0     -1   0 1 0 0
167
rw11::div_testd2  $cpu sym      -2    3      0     -2   0 1 0 0
168
rw11::div_testd2  $cpu sym      -3    3     -1      0   1 0 0 0
169
rw11::div_testd2  $cpu sym      -4    3     -1     -1   1 0 0 0
170
rlc log "    dr<0"
171
rw11::div_testd2  $cpu sym       0   -3      0      0   0 1 0 0
172
rw11::div_testd2  $cpu sym       1   -3      0      1   0 1 0 0
173
rw11::div_testd2  $cpu sym       2   -3      0      2   0 1 0 0
174
rw11::div_testd2  $cpu sym       3   -3     -1      0   1 0 0 0
175
rw11::div_testd2  $cpu sym       4   -3     -1      1   1 0 0 0
176
rw11::div_testd2  $cpu sym      -1   -3      0     -1   0 1 0 0
177
rw11::div_testd2  $cpu sym      -2   -3      0     -2   0 1 0 0
178
rw11::div_testd2  $cpu sym      -3   -3      1      0   0 0 0 0
179
rw11::div_testd2  $cpu sym      -4   -3      1     -1   0 0 0 0
180
rlc log "    dr==0"
181
rw11::div_testd2  $cpu sym       0    0      0      0   0 1 1 1
182
rw11::div_testd2  $cpu sym       1    0      0      0   0 1 1 1
183
rw11::div_testd2  $cpu sym      -1    0      0      0   0 1 1 1
184
 
185
rlc log "  test 4 quadrant  basics (via testd2)"
186
#                               dd   dr      q      r   n z v c     
187
rw11::div_testd2  $cpu sym      34    5      6      4   0 0 0 0
188
rw11::div_testd2  $cpu sym      34   -5     -6      4   1 0 0 0
189
rw11::div_testd2  $cpu sym     -34    5     -6     -4   1 0 0 0
190
rw11::div_testd2  $cpu sym     -34   -5      6     -4   0 0 0 0
191
 
192
rlc log "  test 4 quadrant basics (via testdqr)"
193
#                                dr       q      r
194
rw11::div_testdqr $cpu sym        5       6      4;
195
rw11::div_testdqr $cpu sym       -5      -6      4;
196
rw11::div_testdqr $cpu sym        5      -6     -4;
197
rw11::div_testdqr $cpu sym       -5       6     -4;
198
 
199
rlc log "  test q=100000 boundary cases (q = max neg value)"
200
rlc log "    case dd>0, dr<0 -- factor 21846"
201
#                                dr       q      r
202
rw11::div_testdqr $cpu sym   -21846 0100000      0;      #      BAD-R4
203
rw11::div_testdqr $cpu sym   -21846 0100000      1;      #      BAD-R4
204
rw11::div_testdqr $cpu sym   -21846 0100000  21844;      #      BAD-R4
205
rw11::div_testdqr $cpu sym   -21846 0100000  21845;      #      BAD-R4
206
rw11::div_testdqr $cpu sym   -21846 0100000  21846;      # v=1
207
rw11::div_testdqr $cpu sym   -21846 0100000  21847;      # v=1
208
 
209
rlc log "    case dd<0, dr>0 -- factor 21846"
210
rw11::div_testdqr $cpu sym    21846 0100000       0;     #      BAD-R4
211
rw11::div_testdqr $cpu sym    21846 0100000      -1;     #      BAD-R4
212
rw11::div_testdqr $cpu sym    21846 0100000  -21844;     #      BAD-R4
213
rw11::div_testdqr $cpu sym    21846 0100000  -21845;     #      BAD-R4
214
rw11::div_testdqr $cpu sym    21846 0100000  -21846;     # v=1
215
rw11::div_testdqr $cpu sym    21846 0100000  -21847;     # v=1
216
 
217
rlc log "    case dd>0, dr<0 -- factor 21847"
218
rw11::div_testdqr $cpu sym   -21847 0100000       0;     #      BAD-R4
219
rw11::div_testdqr $cpu sym   -21847 0100000       1;     #      BAD-R4
220
rw11::div_testdqr $cpu sym   -21847 0100000   21845;     #      BAD-R4
221
rw11::div_testdqr $cpu sym   -21847 0100000   21846;     #      BAD-R4
222
rw11::div_testdqr $cpu sym   -21847 0100000   21847;     # v=1
223
rw11::div_testdqr $cpu sym   -21847 0100000   21848;     # v=1
224
 
225
rlc log "    case dd<0, dr>0 -- factor 21847"
226
rw11::div_testdqr $cpu sym    21847 0100000       0;     #      BAD-R4
227
rw11::div_testdqr $cpu sym    21847 0100000      -1;     #      BAD-R4
228
rw11::div_testdqr $cpu sym    21847 0100000  -21845;     #      BAD-R4
229
rw11::div_testdqr $cpu sym    21847 0100000  -21846;     #      BAD-R4
230
rw11::div_testdqr $cpu sym    21847 0100000  -21847;     # v=1
231
rw11::div_testdqr $cpu sym    21847 0100000  -21848;     # v=1
232
 
233
#
234
#
235
rlc log "  test q=077777 boundary cases (q = max pos value)"
236
rlc log "    case dd>0, dr>0 -- factor 21846"
237
rw11::div_testdqr $cpu sym    21846 0077777       0;     #
238
rw11::div_testdqr $cpu sym    21846 0077777       1;     #
239
rw11::div_testdqr $cpu sym    21846 0077777   21844;     #
240
rw11::div_testdqr $cpu sym    21846 0077777   21845;     #
241
rw11::div_testdqr $cpu sym    21846 0077777   21846;     # v=1
242
rw11::div_testdqr $cpu sym    21846 0077777   21847;     # v=1
243
rlc log "    case dd<0, dr<0 -- factor 21846"
244
rw11::div_testdqr $cpu sym   -21846 0077777       0;     #
245
rw11::div_testdqr $cpu sym   -21846 0077777      -1;     #
246
rw11::div_testdqr $cpu sym   -21846 0077777  -21844;     #
247
rw11::div_testdqr $cpu sym   -21846 0077777  -21845;     #
248
rw11::div_testdqr $cpu sym   -21846 0077777  -21846;     # v=1
249
rw11::div_testdqr $cpu sym   -21846 0077777  -21847;     # v=1
250
rlc log "    case dd>0, dr>0 -- factor 21847"
251
rw11::div_testdqr $cpu sym    21847 0077777       0;     #
252
rw11::div_testdqr $cpu sym    21847 0077777       1;     #
253
rw11::div_testdqr $cpu sym    21847 0077777   21845;     #
254
rw11::div_testdqr $cpu sym    21847 0077777   21846;     #
255
rw11::div_testdqr $cpu sym    21847 0077777   21847;     # v=1
256
rw11::div_testdqr $cpu sym    21847 0077777   21848;     # v=1
257
rlc log "    case dd<0, dr<0 -- factor 21847"
258
rw11::div_testdqr $cpu sym   -21847 0077777       0;     #
259
rw11::div_testdqr $cpu sym   -21847 0077777      -1;     #
260
rw11::div_testdqr $cpu sym   -21847 0077777  -21845;     #
261
rw11::div_testdqr $cpu sym   -21847 0077777  -21846;     #
262
rw11::div_testdqr $cpu sym   -21847 0077777  -21846;     # v=1
263
rw11::div_testdqr $cpu sym   -21847 0077777  -21847;     # v=1
264
#
265
#
266
rlc log "  test dr=100000 boundary cases (dr = max neg value)"
267
rlc log "    case dd<0, q>0"
268
rw11::div_testdqr $cpu sym  0100000       1       0;     #
269
rw11::div_testdqr $cpu sym  0100000       1      -1;     #
270
rw11::div_testdqr $cpu sym  0100000       1  -32767;     #
271
rw11::div_testdqr $cpu sym  0100000       2       0;     #      BAD-R4
272
rw11::div_testdqr $cpu sym  0100000       2      -1;     #
273
rw11::div_testdqr $cpu sym  0100000       2  -32767;     #
274
rw11::div_testdqr $cpu sym  0100000       3       0;     #
275
rw11::div_testdqr $cpu sym  0100000       3      -1;     #
276
rw11::div_testdqr $cpu sym  0100000       3  -32767;     #
277
rw11::div_testdqr $cpu sym  0100000       4       0;     #      BAD-R4
278
rw11::div_testdqr $cpu sym  0100000       4      -1;     #
279
rw11::div_testdqr $cpu sym  0100000       4  -32767;     #
280
rw11::div_testdqr $cpu sym  0100000       6       0;     #      BAD-R4
281
rw11::div_testdqr $cpu sym  0100000   32762       0;     #      BAD-R4
282
rw11::div_testdqr $cpu sym  0100000   32764       0;     #      BAD-R4
283
rw11::div_testdqr $cpu sym  0100000   32765       0;     #
284
rw11::div_testdqr $cpu sym  0100000   32766       0;     #      BAD-R4
285
rw11::div_testdqr $cpu sym  0100000   32766      -1;     #
286
rw11::div_testdqr $cpu sym  0100000   32766  -32767;     #
287
rw11::div_testdqr $cpu sym  0100000   32767       0;     #
288
rw11::div_testdqr $cpu sym  0100000   32767      -1;     #
289
rw11::div_testdqr $cpu sym  0100000   32767  -32767;     #
290
rlc log "    case dd>0, q<0"
291
rw11::div_testdqr $cpu sym  0100000      -1       0;     #
292
rw11::div_testdqr $cpu sym  0100000      -1       1;     #
293
rw11::div_testdqr $cpu sym  0100000      -1   32767;     #
294
rw11::div_testdqr $cpu sym  0100000      -2       0;     #
295
rw11::div_testdqr $cpu sym  0100000      -2       1;     #
296
rw11::div_testdqr $cpu sym  0100000      -2   32767;     #
297
rw11::div_testdqr $cpu sym  0100000  -32767       0;     #
298
rw11::div_testdqr $cpu sym  0100000  -32767       1;     #
299
rw11::div_testdqr $cpu sym  0100000  -32767   32767;     #
300
rw11::div_testdqr $cpu sym  0100000  -32768       0;     #      BAD-R4
301
rw11::div_testdqr $cpu sym  0100000  -32768       1;     #      BAD-R4
302
rw11::div_testdqr $cpu sym  0100000  -32768   32767;     #      BAD-R4
303
#
304
#
305
rlc log "  test dr=077777 boundary cases (dr = max pos value)"
306
rlc log "    case dd>0, q>0"
307
rw11::div_testdqr $cpu sym   077777       1       0;     #
308
rw11::div_testdqr $cpu sym   077777       1       1;     #
309
rw11::div_testdqr $cpu sym   077777       1   32766;     #
310
rw11::div_testdqr $cpu sym   077777       2       0;     #
311
rw11::div_testdqr $cpu sym   077777       2       1;     #
312
rw11::div_testdqr $cpu sym   077777       2   32766;     #
313
rw11::div_testdqr $cpu sym   077777   32766       0;     #
314
rw11::div_testdqr $cpu sym   077777   32766       1;     #
315
rw11::div_testdqr $cpu sym   077777   32766   32766;     #
316
rw11::div_testdqr $cpu sym   077777   32767       0;     #
317
rw11::div_testdqr $cpu sym   077777   32767       1;     #
318
rw11::div_testdqr $cpu sym   077777   32767   32766;     #
319
rlc log "    case dd<0, q<0"
320
rw11::div_testdqr $cpu sym   077777      -1       0;     #
321
rw11::div_testdqr $cpu sym   077777      -1      -1;     #
322
rw11::div_testdqr $cpu sym   077777      -1  -32766;     #
323
rw11::div_testdqr $cpu sym   077777      -2       0;     #
324
rw11::div_testdqr $cpu sym   077777      -2      -1;     #
325
rw11::div_testdqr $cpu sym   077777      -2  -32766;     #
326
rw11::div_testdqr $cpu sym   077777  -32767       0;     #
327
rw11::div_testdqr $cpu sym   077777  -32767      -1;     #
328
rw11::div_testdqr $cpu sym   077777  -32767  -32766;     #
329
rw11::div_testdqr $cpu sym   077777  -32768       0;     #      BAD-R4
330
rw11::div_testdqr $cpu sym   077777  -32768      -1;     #      BAD-R4
331
rw11::div_testdqr $cpu sym   077777  -32768  -32766;     #      BAD-R4
332
#
333
#
334
rlc log "  test dd max cases"
335
rlc log "    case dd>0 dr<0 near  nmax*nmax+nmax-1 = +1073774591"
336
rw11::div_testdqr $cpu sym   -32768  -32768      -1;     #
337
rw11::div_testdqr $cpu sym   -32768  -32768       0;     #      BAD-R4
338
rw11::div_testdqr $cpu sym   -32768  -32768       1;     #      BAD-R4
339
rw11::div_testdqr $cpu sym   -32768  -32768   32766;     #      BAD-R4
340
rw11::div_testdqr $cpu sym   -32768  -32768   32767;     # c.c  BAD-R4
341
rw11::div_testdqr $cpu sym   -32768  -32768   32768;     # v=1
342
rw11::div_testdqr $cpu sym   -32768  -32768   32769;     # v=1
343
rlc log "    case dd>0 dr>0 near  pmax*pmax+pmax-1 = +1073709055"
344
rw11::div_testdqr $cpu sym    32767   32767      -1;     #
345
rw11::div_testdqr $cpu sym    32767   32767       0;     #
346
rw11::div_testdqr $cpu sym    32767   32767       1;     #
347
rw11::div_testdqr $cpu sym    32767   32767   32765;     #
348
rw11::div_testdqr $cpu sym    32767   32767   32766;     # c.c
349
rw11::div_testdqr $cpu sym    32767   32767   32767;     # v=1
350
rw11::div_testdqr $cpu sym    32767   32767   32768;     # v=1
351
rlc log "    case dd<0 dr>0 near  nmax*pmax+pmax-1 = -1073741822"
352
rw11::div_testdqr $cpu sym    32767  -32768       1;     #
353
rw11::div_testdqr $cpu sym    32767  -32768       0;     #      BAD-R4
354
rw11::div_testdqr $cpu sym    32767  -32768      -1;     #      BAD-R4
355
rw11::div_testdqr $cpu sym    32767  -32768  -32765;     #      BAD-R4
356
rw11::div_testdqr $cpu sym    32767  -32768  -32766;     # c.c  BAD-R4
357
rw11::div_testdqr $cpu sym    32767  -32768  -32767;     # v=1
358
rw11::div_testdqr $cpu sym    32767  -32768  -32768;     # v=1
359
rlc log "    case dd<0 dr<0 near  pmax*nmax+nmax-1 = -1073741823"
360
rw11::div_testdqr $cpu sym   -32768   32767       1;     #
361
rw11::div_testdqr $cpu sym   -32768   32767       0;     #
362
rw11::div_testdqr $cpu sym   -32768   32767      -1;     #
363
rw11::div_testdqr $cpu sym   -32768   32767  -32766;     #
364
rw11::div_testdqr $cpu sym   -32768   32767  -32767;     # c.c
365
rw11::div_testdqr $cpu sym   -32768   32767  -32768;     # v=1
366
rw11::div_testdqr $cpu sym   -32768   32767  -32769;     # v=1
367
#
368
#
369
rlc log "  test late div quit cases in 2 quadrant algorithm"
370
#                                 dd   dr      q      r   n z v c     
371
rw11::div_testd2 $cpu sym    -32767    -1  32767      0   0 0 0 0;     #
372
rw11::div_testd2 $cpu sym    -32768    -1      0      0   0 0 1 0;     #
373
rw11::div_testd2 $cpu sym    -32769    -1      0      0   0 0 1 0;     #
374
#
375
rw11::div_testd2 $cpu sym    -65534    -2  32767      0   0 0 0 0;     #
376
rw11::div_testd2 $cpu sym    -65535    -2  32767     -1   0 0 0 0;     #
377
rw11::div_testd2 $cpu sym    -65536    -2      0      0   0 0 1 0;     #
378
rw11::div_testd2 $cpu sym    -65537    -2      0      0   0 0 1 0;     #
379
#
380
#
381
rlc log "  test big divident overflow cases"
382
#                                 dd   dr      q      r   n z v c     
383
rw11::div_testd2 $cpu sym 0x7fffffff    1      0      0   0 0 1 0;     #
384
rw11::div_testd2 $cpu sym 0x7fffffff    2      0      0   0 0 1 0;     #
385
rw11::div_testd2 $cpu sym 0x7fffffff   -1      0      0   1 0 1 0;     #
386
rw11::div_testd2 $cpu sym 0x7fffffff   -2      0      0   1 0 1 0;     #
387
rw11::div_testd2 $cpu sym 0x80000000    1      0      0   1 0 1 0;     #
388
rw11::div_testd2 $cpu sym 0x80000000    2      0      0   1 0 1 0;     #
389
rw11::div_testd2 $cpu sym 0x80000000   -1      0      0   0 0 1 0;     #
390
rw11::div_testd2 $cpu sym 0x80000000   -2      0      0   0 0 1 0;     #

powered by: WebSVN 2.1.0

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