Skip to content

Commit a28eeae

Browse files
committed
Update axis_ep.py
1 parent 261d800 commit a28eeae

File tree

1 file changed

+134
-55
lines changed

1 file changed

+134
-55
lines changed

tb/axis_ep.py

Lines changed: 134 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""
22
3-
Copyright (c) 2014-2017 Alex Forencich
3+
Copyright (c) 2014-2018 Alex Forencich
44
55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal
@@ -27,21 +27,25 @@
2727
skip_asserts = False
2828

2929
class 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

298372
class 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

Comments
 (0)