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

95 lines
2.3 KiB
Python

import subprocess
import myhdl
from myhdl import *
from myhdl.conversion import analyze
DESCENDING, ASCENDING = False, True
@block
def comp(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
@block
def feedthru(a, z):
@always_comb
def logic():
z.next = a
return logic
@block
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)]
comps = [comp(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)
lomerge.name = "lomerge"
himerge.name = "hiMerge"
return comps, lomerge, himerge
else:
return feedthru(a[0], z[0])
@block
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)
losort.name = "losort"
hisort.name = "hisort"
merge.name = "merge"
return losort, hisort, merge
else:
return feedthru(a[0], z[0])
@block
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)
sort.name = "sort"
return sort
def Array8Sorter_v(a0, a1, a2, a3, a4, a5, a6, a7,
z0, z1, z2, z3, z4, z5, z6, z7):
analyze.simulator = 'iverilog'
toVerilog(Array8Sorter(a0, a1, a2, a3, a4, a5, a6, a7,
z0, z1, z2, z3, z4, z5, z6, z7))
analyze(Array8Sorter(a0, a1, a2, a3, a4, a5, a6, a7,
z0, z1, z2, z3, z4, z5, z6, z7))
# cmd = "cver -q +loadvpi=../../../cosimulation/cver/myhdl_vpi:vpi_compat_bootstrap " + \
# "Array8Sorter.v tb_Array8Sorter.v"
subprocess.call("iverilog -o Array8Sorter.o Array8Sorter.v tb_Array8Sorter.v", shell=True)
cmd = "vvp -m ../../../cosimulation/icarus/myhdl.vpi Array8Sorter.o"
return Cosimulation(cmd, **locals())