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