1
0
mirror of https://github.com/myhdl/myhdl.git synced 2025-01-24 21:52:56 +08:00

83 lines
2.0 KiB
Python
Raw Normal View History

2006-08-18 21:13:16 +00:00
from myhdl import *
2006-09-19 19:58:18 +00:00
from myhdl.conversion import analyze
2006-08-18 21:13:16 +00:00
DESCENDING, ASCENDING = False, True
def compare(a1, a2, z1, z2, dir):
@always_comb
def logic():
z1.next = a1
z2.next = a2
if dir == (a1 > a2):
z1.next = a2
z2.next = a1
return logic
def feedthru(a, z):
@always_comb
def logic():
z.next = a
return logic
def bitonicMerge(a, z, dir):
n = len(a)
k = n//2
w = len(a[0])
if n > 1:
t = [Signal(intbv(0)[w:]) for i in range(n)]
comp = [compare(a[i], a[i+k], t[i], t[i+k], dir) for i in range(k)]
loMerge = bitonicMerge(t[:k], z[:k], dir)
hiMerge = bitonicMerge(t[k:], z[k:], dir)
return comp, loMerge, hiMerge
else:
feed = feedthru(a[0], z[0])
return feed
def bitonicSort(a, z, dir):
n = len(a)
k = n//2
w = len(a[0])
if n > 1:
t = [Signal(intbv(0)[w:]) for i in range(n)]
loSort = bitonicSort(a[:k], t[:k], ASCENDING)
hiSort = bitonicSort(a[k:], t[k:], DESCENDING)
merge = bitonicMerge(t, z, dir)
return loSort, hiSort, merge
else:
feed = feedthru(a[0], z[0])
return feed
def Array8Sorter(a0, a1, a2, a3, a4, a5, a6, a7,
z0, z1, z2, z3, z4, z5, z6, z7):
a = [a0, a1, a2, a3, a4, a5, a6, a7]
z = [z0, z1, z2, z3, z4, z5, z6, z7]
sort = bitonicSort(a, z, ASCENDING)
return sort
def Array8Sorter_v(a0, a1, a2, a3, a4, a5, a6, a7,
z0, z1, z2, z3, z4, z5, z6, z7):
toVerilog(Array8Sorter, a0, a1, a2, a3, a4, a5, a6, a7,
z0, z1, z2, z3, z4, z5, z6, z7)
2006-09-19 19:58:18 +00:00
analyze(Array8Sorter, a0, a1, a2, a3, a4, a5, a6, a7,
z0, z1, z2, z3, z4, z5, z6, z7)
2006-08-18 21:13:16 +00:00
cmd = "cver -q +loadvpi=myhdl_vpi:vpi_compat_bootstrap " + \
2006-08-21 22:00:46 +00:00
"Array8Sorter.v tb_Array8Sorter.v"
2006-08-18 21:13:16 +00:00
return Cosimulation(cmd, **locals())