1from pymtl3.datatypes import Bits32
2from pymtl3.dsl import *
3
4from ..PassGroups import UnrollSim
5
6
7def test_very_deep_dag():
8
9  class Inner(Component):
10    def construct( s ):
11      s.in_ = InPort(Bits32)
12      s.out = OutPort(Bits32)
13
14      @update
15      def up():
16        s.out @= s.in_ + 1
17
18    def done( s ):
19      return True
20
21    def line_trace( s ):
22      return "{} > {}".format( s.a, s.b )
23
24  class Top(Component):
25    def construct( s, N=2000 ):
26      s.inners = [ Inner() for i in range(N) ]
27      for i in range(N-1):
28        s.inners[i].out //= s.inners[i+1].in_
29
30      s.out = OutPort(Bits32)
31      @update_ff
32      def ff():
33        if s.reset:
34          s.out <<= 0
35        else:
36          s.out <<= s.out + s.inners[N-1].out
37
38    def line_trace( s ):
39      return str(s.inners[-1].out) + " " + str(s.out)
40
41  N = 2000
42  A = Top( N )
43
44  A.apply( UnrollSim() )
45  A.sim_reset()
46
47  T = 0
48  while T < 5:
49    assert A.out == T * N
50    A.sim_tick()
51    T += 1
52  return A
53
54def test_equal_top_level():
55  class A(Component):
56    def construct( s ):
57      @update
58      def up():
59        print(1)
60
61  a = A()
62  a.apply( UnrollSim() )
63  a.sim_reset()
64
65  try:
66    a.reset = 0
67    a.sim_tick()
68  except AssertionError as e:
69    print(e)
70    assert str(e).startswith("Please use @= to assign top level InPort")
71    return
72