1 from migen
.fhdl
.structure
import *
2 from migen
.fhdl
.module
import Module
5 class BitonicSort(Module
):
6 """Combinatorial sorting network
8 The Bitonic sort is implemented as a combinatorial sort using
9 comparators and multiplexers. Its asymptotic complexity (in terms of
10 number of comparators/muxes) is O(n log(n)**2), like mergesort or
13 http://www.dps.uibk.ac.at/~cosenza/teaching/gpu/sort-batcher.pdf
15 http://www.inf.fh-flensburg.de/lang/algorithmen/sortieren/bitonic/bitonicen.htm
17 http://www.myhdl.org/doku.php/cookbook:bitonic
22 Number of inputs and output signals.
24 Bit width of inputs and outputs. Or a tuple of `(m, signed)`.
26 Sort direction. `True` if input is to be sorted ascending,
27 `False` for descending. Defaults to ascending.
31 i : list of Signals, in
32 Input values, each `m` wide.
33 o : list of Signals, out
34 Output values, sorted, each `m` bits wide.
36 def __init__(self
, n
, m
, ascending
=True):
37 self
.i
= [Signal(m
) for i
in range(n
)]
38 self
.o
= [Signal(m
) for i
in range(n
)]
39 self
._sort
(self
.i
, self
.o
, int(ascending
), m
)
41 def _sort_two(self
, i0
, i1
, o0
, o1
, dir):
50 def _merge(self
, i
, o
, dir, m
):
54 t
= [Signal(m
) for j
in range(n
)]
56 self
._sort
_two
(i
[j
], i
[j
+ k
], t
[j
], t
[j
+ k
], dir)
57 self
._merge
(t
[:k
], o
[:k
], dir, m
)
58 self
._merge
(t
[k
:], o
[k
:], dir, m
)
60 self
.comb
+= o
[0].eq(i
[0])
62 def _sort(self
, i
, o
, dir, m
):
66 t
= [Signal(m
) for j
in range(n
)]
67 self
._sort
(i
[:k
], t
[:k
], 1, m
) # ascending
68 self
._sort
(i
[k
:], t
[k
:], 0, m
) # descending
69 self
._merge
(t
, o
, dir, m
)
71 self
.comb
+= o
[0].eq(i
[0])