mirror of
https://github.com/myhdl/myhdl.git
synced 2025-01-24 21:52:56 +08:00
next re-write
This commit is contained in:
parent
fddbd06595
commit
55e823e939
@ -685,21 +685,20 @@ class _AnalyzeVisitor(ast.NodeVisitor, _ConversionMixin):
|
|||||||
if sys.version_info >= (3, 8, 0):
|
if sys.version_info >= (3, 8, 0):
|
||||||
|
|
||||||
def visit_Constant(self, node):
|
def visit_Constant(self, node):
|
||||||
|
node.obj = None # safeguarding?
|
||||||
# ToDo check for tuples?
|
# ToDo check for tuples?
|
||||||
if node.value in (True, False, None):
|
if isinstance(node.value, int):
|
||||||
|
# Num
|
||||||
|
if node.value in (0, 1):
|
||||||
|
node.obj = bool(node.value)
|
||||||
|
else:
|
||||||
|
node.obj = node.value
|
||||||
|
elif node.value in (True, False, None):
|
||||||
# NameConstant
|
# NameConstant
|
||||||
node.obj = node.value
|
node.obj = node.value
|
||||||
elif isinstance(node.value, str):
|
elif isinstance(node.value, str):
|
||||||
# Str
|
# Str
|
||||||
node.obj = node.value
|
node.obj = node.value
|
||||||
else:
|
|
||||||
# Num?
|
|
||||||
if node.value in (0, 1):
|
|
||||||
node.obj = bool(node.value)
|
|
||||||
elif isinstance(node.value, int):
|
|
||||||
node.obj = node.value
|
|
||||||
else:
|
|
||||||
node.obj = None
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
|
@ -2,15 +2,16 @@ import os
|
|||||||
path = os.path
|
path = os.path
|
||||||
from random import randrange
|
from random import randrange
|
||||||
|
|
||||||
|
|
||||||
import myhdl
|
import myhdl
|
||||||
from myhdl import *
|
from myhdl import *
|
||||||
from myhdl.conversion import verify, analyze
|
from myhdl.conversion import verify, analyze
|
||||||
from myhdl import ConversionError
|
from myhdl import ConversionError
|
||||||
from myhdl.conversion._misc import _error
|
from myhdl.conversion._misc import _error
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForLoopError1(a, out):
|
def ForLoopError1(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -20,10 +21,13 @@ def ForLoopError1(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForLoopError2(a, out):
|
def ForLoopError2(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -33,10 +37,13 @@ def ForLoopError2(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForLoop1(a, out):
|
def ForLoop1(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -46,10 +53,13 @@ def ForLoop1(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForLoop2(a, out):
|
def ForLoop2(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -59,10 +69,13 @@ def ForLoop2(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForLoop3(a, out):
|
def ForLoop3(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -72,10 +85,13 @@ def ForLoop3(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForLoop4(a, out):
|
def ForLoop4(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -85,10 +101,13 @@ def ForLoop4(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForLoop5(a, out):
|
def ForLoop5(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -98,10 +117,13 @@ def ForLoop5(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForLoop6(a, out):
|
def ForLoop6(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -111,10 +133,13 @@ def ForLoop6(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForContinueLoop(a, out):
|
def ForContinueLoop(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -125,10 +150,13 @@ def ForContinueLoop(a, out):
|
|||||||
continue
|
continue
|
||||||
var += 1
|
var += 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForBreakLoop(a, out):
|
def ForBreakLoop(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -138,10 +166,13 @@ def ForBreakLoop(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
out.next = i
|
out.next = i
|
||||||
break
|
break
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def ForBreakContinueLoop(a, out):
|
def ForBreakContinueLoop(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -152,10 +183,13 @@ def ForBreakContinueLoop(a, out):
|
|||||||
continue
|
continue
|
||||||
out.next = i
|
out.next = i
|
||||||
break
|
break
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def NestedForLoop1(a, out):
|
def NestedForLoop1(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -167,13 +201,16 @@ def NestedForLoop1(a, out):
|
|||||||
else:
|
else:
|
||||||
for j in downrange(i):
|
for j in downrange(i):
|
||||||
if a[j] == 0:
|
if a[j] == 0:
|
||||||
var +=1
|
var += 1
|
||||||
break
|
break
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def NestedForLoop2(a, out):
|
def NestedForLoop2(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
@ -184,30 +221,36 @@ def NestedForLoop2(a, out):
|
|||||||
if a[i] == 0:
|
if a[i] == 0:
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
for j in downrange(i-1):
|
for j in downrange(i - 1):
|
||||||
if a[j] == 0:
|
if a[j] == 0:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
out.next = j
|
out.next = j
|
||||||
break
|
break
|
||||||
break
|
break
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
def ReturnFromFunction(a):
|
def ReturnFromFunction(a):
|
||||||
for i in downrange(len(a)):
|
for i in downrange(len(a)):
|
||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
return i
|
return i
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def FunctionCall(a, out):
|
def FunctionCall(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
yield a
|
yield a
|
||||||
out.next = ReturnFromFunction(a)
|
out.next = ReturnFromFunction(a)
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
# During the following check, I noticed that non-blocking assignments
|
# During the following check, I noticed that non-blocking assignments
|
||||||
# are not scheduled when a task is disabled in Icarus. Apparently
|
# are not scheduled when a task is disabled in Icarus. Apparently
|
||||||
# this is one of the many vague areas in the Verilog standard.
|
# this is one of the many vague areas in the Verilog standard.
|
||||||
@ -216,10 +259,12 @@ def ReturnFromTask(a, out):
|
|||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
out[:] = i
|
out[:] = i
|
||||||
return
|
return
|
||||||
out[:] = 23 # to notice it
|
out[:] = 23 # to notice it
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def TaskCall(a, out):
|
def TaskCall(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
var = intbv(0)[8:]
|
var = intbv(0)[8:]
|
||||||
@ -227,31 +272,37 @@ def TaskCall(a, out):
|
|||||||
yield a
|
yield a
|
||||||
ReturnFromTask(a, var)
|
ReturnFromTask(a, var)
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def WhileLoop(a, out):
|
def WhileLoop(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
yield a
|
yield a
|
||||||
var = 0
|
var = 0
|
||||||
i = len(a)-1
|
i = len(a) - 1
|
||||||
while i >= 0:
|
while i >= 0:
|
||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
var += 1
|
var += 1
|
||||||
i -= 1
|
i -= 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def WhileContinueLoop(a, out):
|
def WhileContinueLoop(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
yield a
|
yield a
|
||||||
var = 0
|
var = 0
|
||||||
i = len(a)-1
|
i = len(a) - 1
|
||||||
while i >= 0:
|
while i >= 0:
|
||||||
if a[i] == 0:
|
if a[i] == 0:
|
||||||
i -= 1
|
i -= 1
|
||||||
@ -259,41 +310,49 @@ def WhileContinueLoop(a, out):
|
|||||||
var += 1
|
var += 1
|
||||||
i -= 1
|
i -= 1
|
||||||
out.next = var
|
out.next = var
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def WhileBreakLoop(a, out):
|
def WhileBreakLoop(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
yield a
|
yield a
|
||||||
var = 0
|
var = 0
|
||||||
i = len(a)-1
|
i = len(a) - 1
|
||||||
out.next = 0
|
out.next = 0
|
||||||
while i >= 0:
|
while i >= 0:
|
||||||
if a[i] == 1:
|
if a[i] == 1:
|
||||||
out.next = i
|
out.next = i
|
||||||
break
|
break
|
||||||
i -= 1
|
i -= 1
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def WhileBreakContinueLoop(a, out):
|
def WhileBreakContinueLoop(a, out):
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def logic():
|
def logic():
|
||||||
while 1:
|
while 1:
|
||||||
yield a
|
yield a
|
||||||
var = 0
|
var = 0
|
||||||
i = len(a)-1
|
i = len(a) - 1
|
||||||
out.next = 0
|
out.next = 0
|
||||||
while i >= 0:
|
while i >= 0:
|
||||||
if a[i] == 0:
|
if a[i] == 0:
|
||||||
i -= 1
|
i -= 1
|
||||||
continue
|
continue
|
||||||
out.next = i
|
out.next = i
|
||||||
break
|
break
|
||||||
|
|
||||||
return logic
|
return logic
|
||||||
|
|
||||||
|
|
||||||
@block
|
@block
|
||||||
def LoopBench(LoopTest):
|
def LoopBench(LoopTest):
|
||||||
|
|
||||||
@ -301,7 +360,7 @@ def LoopBench(LoopTest):
|
|||||||
z = Signal(intbv(0)[16:])
|
z = Signal(intbv(0)[16:])
|
||||||
|
|
||||||
looptest_inst = LoopTest(a, z)
|
looptest_inst = LoopTest(a, z)
|
||||||
data = tuple([randrange(2**min(i, 16)) for i in range(100)])
|
data = tuple([randrange(2 ** min(i, 16)) for i in range(100)])
|
||||||
|
|
||||||
@instance
|
@instance
|
||||||
def stimulus():
|
def stimulus():
|
||||||
@ -321,6 +380,7 @@ def testForLoopError1():
|
|||||||
else:
|
else:
|
||||||
assert False
|
assert False
|
||||||
|
|
||||||
|
|
||||||
def testForLoopError2():
|
def testForLoopError2():
|
||||||
try:
|
try:
|
||||||
analyze(LoopBench(ForLoopError2))
|
analyze(LoopBench(ForLoopError2))
|
||||||
@ -329,47 +389,64 @@ def testForLoopError2():
|
|||||||
else:
|
else:
|
||||||
assert False
|
assert False
|
||||||
|
|
||||||
|
|
||||||
def testForLoop1():
|
def testForLoop1():
|
||||||
assert verify(LoopBench(ForLoop1)) == 0
|
assert verify(LoopBench(ForLoop1)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testForLoop2():
|
def testForLoop2():
|
||||||
assert verify(LoopBench(ForLoop2)) == 0
|
assert verify(LoopBench(ForLoop2)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testForLoop4():
|
def testForLoop4():
|
||||||
assert verify(LoopBench(ForLoop4)) == 0
|
assert verify(LoopBench(ForLoop4)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testForLoop5():
|
def testForLoop5():
|
||||||
assert verify(LoopBench(ForLoop5)) == 0
|
assert verify(LoopBench(ForLoop5)) == 0
|
||||||
|
|
||||||
# for loop 3 and 6 can't work in vhdl
|
# for loop 3 and 6 can't work in vhdl
|
||||||
|
|
||||||
|
|
||||||
def testForContinueLoop():
|
def testForContinueLoop():
|
||||||
assert verify(LoopBench(ForContinueLoop)) == 0
|
assert verify(LoopBench(ForContinueLoop)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testForBreakLoop():
|
def testForBreakLoop():
|
||||||
assert verify(LoopBench(ForBreakLoop)) == 0
|
assert verify(LoopBench(ForBreakLoop)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testForBreakContinueLoop():
|
def testForBreakContinueLoop():
|
||||||
assert verify(LoopBench(ForBreakContinueLoop))== 0
|
assert verify(LoopBench(ForBreakContinueLoop)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testNestedForLoop1():
|
def testNestedForLoop1():
|
||||||
assert verify(LoopBench(NestedForLoop1)) == 0
|
assert verify(LoopBench(NestedForLoop1)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testNestedForLoop2():
|
def testNestedForLoop2():
|
||||||
assert verify(LoopBench(NestedForLoop2)) == 0
|
assert verify(LoopBench(NestedForLoop2)) == 0
|
||||||
|
|
||||||
def testWhileLoop():
|
|
||||||
|
def testFunctionCall():
|
||||||
assert verify(LoopBench(FunctionCall)) == 0
|
assert verify(LoopBench(FunctionCall)) == 0
|
||||||
|
|
||||||
## def testTaskCall(self):
|
# # def testTaskCall(self):
|
||||||
## sim = self.bench(TaskCall)
|
# # sim = self.bench(TaskCall)
|
||||||
## Simulation(sim).run()
|
# # Simulation(sim).run()
|
||||||
|
|
||||||
|
|
||||||
def testWhileLoop():
|
def testWhileLoop():
|
||||||
assert verify(LoopBench(WhileLoop)) == 0
|
assert verify(LoopBench(WhileLoop)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testWhileContinueLoop():
|
def testWhileContinueLoop():
|
||||||
assert verify(LoopBench(WhileContinueLoop)) == 0
|
assert verify(LoopBench(WhileContinueLoop)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testWhileBreakLoop():
|
def testWhileBreakLoop():
|
||||||
assert verify(LoopBench(WhileBreakLoop)) == 0
|
assert verify(LoopBench(WhileBreakLoop)) == 0
|
||||||
|
|
||||||
|
|
||||||
def testWhileBreakContinueLoop():
|
def testWhileBreakContinueLoop():
|
||||||
assert verify(LoopBench(WhileBreakContinueLoop)) == 0
|
assert verify(LoopBench(WhileBreakContinueLoop)) == 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user