11"""
22
3- Copyright (c) 2014-2017 Alex Forencich
3+ Copyright (c) 2014-2018 Alex Forencich
44
55Permission is hereby granted, free of charge, to any person obtaining a copy
66of this software and associated documentation files (the "Software"), to deal
2727skip_asserts = False
2828
2929class AXIStreamFrame (object ):
30- def __init__ (self , data = b'' , keep = None , dest = None , user = None ):
30+ def __init__ (self , data = b'' , keep = None , id = None , dest = None , user = None , last_cycle_user = None ):
3131 self .B = 0
3232 self .N = 8
3333 self .M = 1
3434 self .WL = 8
3535 self .data = b''
3636 self .keep = None
37+ self .id = 0
3738 self .dest = 0
3839 self .user = None
40+ self .last_cycle_user = None
3941
40- if type (data ) is bytes or type ( data ) is bytearray :
42+ if type (data ) in ( bytes , bytearray ) :
4143 self .data = bytearray (data )
4244 self .keep = keep
45+ self .id = id
4346 self .dest = dest
4447 self .user = user
48+ self .last_cycle_user = last_cycle_user
4549 elif type (data ) is AXIStreamFrame :
4650 self .N = data .N
4751 self .WL = data .WL
@@ -51,21 +55,29 @@ def __init__(self, data=b'', keep=None, dest=None, user=None):
5155 self .data = list (data .data )
5256 if data .keep is not None :
5357 self .keep = list (data .keep )
58+ if data .id is not None :
59+ if type (data .id ) in (int , bool ):
60+ self .id = data .id
61+ else :
62+ self .id = list (data .id )
5463 if data .dest is not None :
55- if type (data .dest ) is int :
64+ if type (data .dest ) in ( int , bool ) :
5665 self .dest = data .dest
5766 else :
5867 self .dest = list (data .dest )
5968 if data .user is not None :
60- if type (data .user ) is int or type ( data . user ) is bool :
69+ if type (data .user ) in ( int , bool ) :
6170 self .user = data .user
6271 else :
6372 self .user = list (data .user )
73+ self .last_cycle_user = data .last_cycle_user
6474 else :
6575 self .data = list (data )
6676 self .keep = keep
77+ self .id = id
6778 self .dest = dest
6879 self .user = user
80+ self .last_cycle_user = last_cycle_user
6981
7082 def build (self ):
7183 if self .data is None :
@@ -74,75 +86,67 @@ def build(self):
7486 f = list (self .data )
7587 tdata = []
7688 tkeep = []
89+ tid = []
7790 tdest = []
7891 tuser = []
7992 i = 0
8093
81- dest = 0
82- if type (self .dest ) is int :
83- dest = self .dest
84- self .dest = None
85-
86- assert_tuser = False
87- if (type (self .user ) is int or type (self .user ) is bool ) and self .user :
88- assert_tuser = True
89- self .user = None
90-
91- if self .B == 0 :
92- while len (f ) > 0 :
94+ while len (f ) > 0 :
95+ if self .B == 0 :
9396 data = 0
9497 keep = 0
9598 for j in range (self .M ):
9699 data = data | (f .pop (0 ) << (j * self .WL ))
97100 keep = keep | (1 << j )
98101 if len (f ) == 0 : break
99102 tdata .append (data )
103+
100104 if self .keep is None :
101105 tkeep .append (keep )
102106 else :
103107 tkeep .append (self .keep [i ])
104- if self .dest is None :
105- tdest .append (dest )
106- else :
107- tdest .append (self .dest [i ])
108- if self .user is None :
109- tuser .append (0 )
110- else :
111- tuser .append (self .user [i ])
112- i += 1
113- else :
114- # multiple tdata signals
115- while len (f ) > 0 :
108+ else :
109+ # multiple tdata signals
116110 data = 0
117111 tdata .append (f .pop (0 ))
118112 tkeep .append (0 )
119- if self .dest is None :
120- tdest .append (dest )
121- else :
122- tdest .append (self .dest [i ])
123- if self .user is None :
124- tuser .append (0 )
125- else :
126- tuser .append (self .user [i ])
127- i += 1
128113
129- if assert_tuser :
130- tuser [- 1 ] = 1
131- self .user = 1
114+ if self .id is None :
115+ tid .append (0 )
116+ elif type (self .id ) is int :
117+ tid .append (self .id )
118+ else :
119+ tid .append (self .id [i ])
132120
133- if self .dest == None :
134- self .dest = dest
121+ if self .dest is None :
122+ tdest .append (0 )
123+ elif type (self .dest ) is int :
124+ tdest .append (self .dest )
125+ else :
126+ tdest .append (self .dest [i ])
135127
136- return tdata , tkeep , tdest , tuser
128+ if self .user is None :
129+ tuser .append (0 )
130+ elif type (self .user ) is int :
131+ tuser .append (self .user )
132+ else :
133+ tuser .append (self .user [i ])
134+ i += 1
135+
136+ if self .last_cycle_user :
137+ tuser [- 1 ] = self .last_cycle_user
138+
139+ return tdata , tkeep , tid , tdest , tuser
137140
138- def parse (self , tdata , tkeep , tdest , tuser ):
141+ def parse (self , tdata , tkeep , tid , tdest , tuser ):
139142 if tdata is None or tkeep is None or tuser is None :
140143 return
141- if len (tdata ) != len (tkeep ) or len (tdata ) != len (tdest ) or len (tdata ) != len (tuser ):
144+ if len (tdata ) != len (tkeep ) or len (tdata ) != len (tid ) or len ( tdata ) != len ( tdest ) or len (tdata ) != len (tuser ):
142145 raise Exception ("Invalid data" )
143146
144147 self .data = []
145148 self .keep = []
149+ self .id = []
146150 self .dest = []
147151 self .user = []
148152
@@ -154,24 +158,89 @@ def parse(self, tdata, tkeep, tdest, tuser):
154158 if tkeep [i ] & (1 << j ):
155159 self .data .append ((tdata [i ] >> (j * self .WL )) & mask )
156160 self .keep .append (tkeep [i ])
161+ self .id .append (tid [i ])
157162 self .dest .append (tdest [i ])
158163 self .user .append (tuser [i ])
159164 else :
160165 for i in range (len (tdata )):
161166 self .data .append (tdata [i ])
162167 self .keep .append (tkeep [i ])
168+ self .id .append (tid [i ])
163169 self .dest .append (tdest [i ])
164170 self .user .append (tuser [i ])
165171
166172 if self .WL == 8 :
167173 self .data = bytearray (self .data )
168174
175+ self .last_cycle_user = self .user [- 1 ]
176+
169177 def __eq__ (self , other ):
170- if type (other ) is AXIStreamFrame :
171- return self .data == other .data
178+ if not isinstance (other , AXIStreamFrame ):
179+ return False
180+ if self .data != other .data :
181+ return False
182+ if self .keep is not None and other .keep is not None :
183+ if self .keep != other .keep :
184+ return False
185+ if self .id is not None and other .id is not None :
186+ if type (self .id ) in (int , bool ) and type (other .id ) is list :
187+ for k in other .id :
188+ if self .id != k :
189+ return False
190+ elif type (other .id ) in (int , bool ) and type (self .id ) is list :
191+ for k in self .id :
192+ if other .id != k :
193+ return False
194+ elif self .id != other .id :
195+ return False
196+ if self .dest is not None and other .dest is not None :
197+ if type (self .dest ) in (int , bool ) and type (other .dest ) is list :
198+ for k in other .dest :
199+ if self .dest != k :
200+ return False
201+ elif type (other .dest ) in (int , bool ) and type (self .dest ) is list :
202+ for k in self .dest :
203+ if other .dest != k :
204+ return False
205+ elif self .dest != other .dest :
206+ return False
207+ if self .last_cycle_user is not None and other .last_cycle_user is not None :
208+ if self .last_cycle_user != other .last_cycle_user :
209+ return False
210+ if self .user is not None and other .user is not None :
211+ if type (self .user ) in (int , bool ) and type (other .user ) is list :
212+ for k in other .user [:- 1 ]:
213+ if self .user != k :
214+ return False
215+ elif type (other .user ) in (int , bool ) and type (self .user ) is list :
216+ for k in self .user [:- 1 ]:
217+ if other .user != k :
218+ return False
219+ elif self .user != other .user :
220+ return False
221+ else :
222+ if self .user is not None and other .user is not None :
223+ if type (self .user ) in (int , bool ) and type (other .user ) is list :
224+ for k in other .user :
225+ if self .user != k :
226+ return False
227+ elif type (other .user ) in (int , bool ) and type (self .user ) is list :
228+ for k in self .user :
229+ if other .user != k :
230+ return False
231+ elif self .user != other .user :
232+ return False
233+ return True
172234
173235 def __repr__ (self ):
174- return 'AXIStreamFrame(data=%s, keep=%s, dest=%s, user=%s)' % (repr (self .data ), repr (self .keep ), repr (self .dest ), repr (self .user ))
236+ return (
237+ ('AXIStreamFrame(data=%s, ' % repr (self .data )) +
238+ ('keep=%s, ' % repr (self .keep )) +
239+ ('id=%s, ' % repr (self .id )) +
240+ ('dest=%s, ' % repr (self .dest )) +
241+ ('user=%s, ' % repr (self .user )) +
242+ ('last_cycle_user=%s)' % repr (self .last_cycle_user ))
243+ )
175244
176245 def __iter__ (self ):
177246 return self .data .__iter__ ()
@@ -202,8 +271,9 @@ def create_logic(self,
202271 tvalid = Signal (bool (False )),
203272 tready = Signal (bool (True )),
204273 tlast = Signal (bool (False )),
274+ tid = Signal (intbv (0 )),
205275 tdest = Signal (intbv (0 )),
206- tuser = Signal (bool ( False )),
276+ tuser = Signal (intbv ( 0 )),
207277 pause = 0 ,
208278 name = None
209279 ):
@@ -225,6 +295,7 @@ def logic():
225295 frame = AXIStreamFrame ()
226296 data = []
227297 keep = []
298+ id = []
228299 dest = []
229300 user = []
230301 B = 0
@@ -249,6 +320,7 @@ def logic():
249320 else :
250321 tdata .next = 0
251322 tkeep .next = 0
323+ tid .next = 0
252324 tdest .next = 0
253325 tuser .next = False
254326 tvalid_int .next = False
@@ -263,6 +335,7 @@ def logic():
263335 else :
264336 tdata .next = data .pop (0 )
265337 tkeep .next = keep .pop (0 )
338+ tid .next = id .pop (0 )
266339 tdest .next = dest .pop (0 )
267340 tuser .next = user .pop (0 )
268341 tvalid_int .next = True
@@ -277,7 +350,7 @@ def logic():
277350 frame .N = N
278351 frame .M = M
279352 frame .WL = WL
280- data , keep , dest , user = frame .build ()
353+ data , keep , id , dest , user = frame .build ()
281354 if name is not None :
282355 print ("[%s] Sending frame %s" % (name , repr (frame )))
283356 if B > 0 :
@@ -287,12 +360,13 @@ def logic():
287360 else :
288361 tdata .next = data .pop (0 )
289362 tkeep .next = keep .pop (0 )
363+ tid .next = id .pop (0 )
290364 tdest .next = dest .pop (0 )
291365 tuser .next = user .pop (0 )
292366 tvalid_int .next = True
293367 tlast .next = len (data ) == 0
294368
295- return logic , pause_logic
369+ return instances ()
296370
297371
298372class AXIStreamSink (object ):
@@ -329,8 +403,9 @@ def create_logic(self,
329403 tvalid = Signal (bool (False )),
330404 tready = Signal (bool (True )),
331405 tlast = Signal (bool (True )),
406+ tid = Signal (intbv (0 )),
332407 tdest = Signal (intbv (0 )),
333- tuser = Signal (bool ( False )),
408+ tuser = Signal (intbv ( 0 )),
334409 pause = 0 ,
335410 name = None
336411 ):
@@ -352,6 +427,7 @@ def logic():
352427 frame = AXIStreamFrame ()
353428 data = []
354429 keep = []
430+ id = []
355431 dest = []
356432 user = []
357433 B = 0
@@ -375,6 +451,7 @@ def logic():
375451 frame = AXIStreamFrame ()
376452 data = []
377453 keep = []
454+ id = []
378455 dest = []
379456 user = []
380457 first = True
@@ -410,6 +487,7 @@ def logic():
410487 else :
411488 data .append (int (tdata ))
412489 keep .append (int (tkeep ))
490+ id .append (int (tid ))
413491 dest .append (int (tdest ))
414492 user .append (int (tuser ))
415493 first = False
@@ -418,16 +496,17 @@ def logic():
418496 frame .N = N
419497 frame .M = M
420498 frame .WL = WL
421- frame .parse (data , keep , dest , user )
499+ frame .parse (data , keep , id , dest , user )
422500 self .queue .append (frame )
423501 if name is not None :
424502 print ("[%s] Got frame %s" % (name , repr (frame )))
425503 frame = AXIStreamFrame ()
426504 data = []
427505 keep = []
506+ id = []
428507 dest = []
429508 user = []
430509 first = True
431510
432- return logic , pause_logic
511+ return instances ()
433512
0 commit comments