6 Commits

Author SHA1 Message Date
Alex Forencich
4dd82f1499 Release v0.1.2 2020-12-18 15:48:43 -08:00
Alex Forencich
c3207d68dc Convert send/recv to blocking, add nonblocking send_nowait/recv_nowait 2020-12-18 15:39:51 -08:00
Alex Forencich
7a5473ab39 Remove unnecessary __init__.py files 2020-12-15 18:49:28 -08:00
Alex Forencich
af8fda0250 Return data when XgmiiFrame is cast to bytes 2020-12-11 23:47:09 -08:00
Alex Forencich
58b22a2bd4 Return data when GmiiFrame is cast to bytes 2020-12-11 23:46:49 -08:00
Alex Forencich
fb553347d7 Bump to dev version v0.1.1 2020-12-06 01:22:50 -08:00
12 changed files with 60 additions and 25 deletions

View File

@@ -73,8 +73,10 @@ To receive data with a `GmiiSink`, call `recv()`. Call `wait()` to wait for new
#### Methods #### Methods
* `send(frame)`: send _frame_ (source) * `send(frame)`: send _frame_ (blocking) (source)
* `recv()`: receive a frame as a `GmiiFrame` (sink) * `send_nowait(frame)`: send _frame_ (non-blocking) (source)
* `recv()`: receive a frame as a `GmiiFrame` (blocking) (sink)
* `recv_nowait()`: receive a frame as a `GmiiFrame` (non-blocking) (sink)
* `count()`: returns the number of items in the queue (all) * `count()`: returns the number of items in the queue (all)
* `empty()`: returns _True_ if the queue is empty (all) * `empty()`: returns _True_ if the queue is empty (all)
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source) * `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)
@@ -147,8 +149,10 @@ To receive data with an `RgmiiSink`, call `recv()`. Call `wait()` to wait for n
#### Methods #### Methods
* `send(frame)`: send _frame_ (source) * `send(frame)`: send _frame_ (blocking) (source)
* `recv()`: receive a frame as a `GmiiFrame` (sink) * `send_nowait(frame)`: send _frame_ (non-blocking) (source)
* `recv()`: receive a frame as a `GmiiFrame` (blocking) (sink)
* `recv_nowait()`: receive a frame as a `GmiiFrame` (non-blocking) (sink)
* `count()`: returns the number of items in the queue (all) * `count()`: returns the number of items in the queue (all)
* `empty()`: returns _True_ if the queue is empty (all) * `empty()`: returns _True_ if the queue is empty (all)
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source) * `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)
@@ -198,8 +202,10 @@ To receive data with an `XgmiiSink`, call `recv()`. Call `wait()` to wait for n
#### Methods #### Methods
* `send(frame)`: send _frame_ (source) * `send(frame)`: send _frame_ (blocking) (source)
* `recv()`: receive a frame as an `XgmiiFrame` (sink) * `send_nowait(frame)`: send _frame_ (non-blocking) (source)
* `recv()`: receive a frame as an `XgmiiFrame` (blocking) (sink)
* `recv_nowait()`: receive a frame as an `XgmiiFrame` (non-blocking) (sink)
* `count()`: returns the number of items in the queue (all) * `count()`: returns the number of items in the queue (all)
* `empty()`: returns _True_ if the queue is empty (all) * `empty()`: returns _True_ if the queue is empty (all)
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source) * `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)

View File

@@ -110,6 +110,9 @@ class GmiiFrame(object):
def __iter__(self): def __iter__(self):
return self.data.__iter__() return self.data.__iter__()
def __bytes__(self):
return bytes(self.data)
class GmiiSource(object): class GmiiSource(object):
@@ -153,7 +156,10 @@ class GmiiSource(object):
cocotb.fork(self._run()) cocotb.fork(self._run())
def send(self, frame): async def send(self, frame):
self.send_nowait(frame)
def send_nowait(self, frame):
frame = GmiiFrame(frame) frame = GmiiFrame(frame)
self.queue_occupancy_bytes += len(frame) self.queue_occupancy_bytes += len(frame)
self.queue_occupancy_frames += 1 self.queue_occupancy_frames += 1
@@ -275,7 +281,13 @@ class GmiiSink(object):
cocotb.fork(self._run()) cocotb.fork(self._run())
def recv(self): async def recv(self, compact=True):
while self.empty():
self.sync.clear()
await self.sync.wait()
return self.recv_nowait(compact)
def recv_nowait(self, compact=True):
if self.queue: if self.queue:
frame = self.queue.popleft() frame = self.queue.popleft()
self.queue_occupancy_bytes -= len(frame) self.queue_occupancy_bytes -= len(frame)

View File

@@ -72,7 +72,10 @@ class RgmiiSource(object):
cocotb.fork(self._run()) cocotb.fork(self._run())
def send(self, frame): async def send(self, frame):
self.send_nowait(frame)
def send_nowait(self, frame):
frame = GmiiFrame(frame) frame = GmiiFrame(frame)
self.queue_occupancy_bytes += len(frame) self.queue_occupancy_bytes += len(frame)
self.queue_occupancy_frames += 1 self.queue_occupancy_frames += 1
@@ -200,7 +203,13 @@ class RgmiiSink(object):
cocotb.fork(self._run()) cocotb.fork(self._run())
def recv(self): async def recv(self, compact=True):
while self.empty():
self.sync.clear()
await self.sync.wait()
return self.recv_nowait(compact)
def recv_nowait(self, compact=True):
if self.queue: if self.queue:
frame = self.queue.popleft() frame = self.queue.popleft()
self.queue_occupancy_bytes -= len(frame) self.queue_occupancy_bytes -= len(frame)

View File

@@ -1 +1 @@
__version__ = "0.1.0" __version__ = "0.1.2"

View File

@@ -113,6 +113,9 @@ class XgmiiFrame(object):
def __iter__(self): def __iter__(self):
return self.data.__iter__() return self.data.__iter__()
def __bytes__(self):
return bytes(self.data)
class XgmiiSource(object): class XgmiiSource(object):
@@ -160,7 +163,10 @@ class XgmiiSource(object):
cocotb.fork(self._run()) cocotb.fork(self._run())
def send(self, frame): async def send(self, frame):
self.send_nowait(frame)
def send_nowait(self, frame):
frame = XgmiiFrame(frame) frame = XgmiiFrame(frame)
self.queue_occupancy_bytes += len(frame) self.queue_occupancy_bytes += len(frame)
self.queue_occupancy_frames += 1 self.queue_occupancy_frames += 1
@@ -302,7 +308,13 @@ class XgmiiSink(object):
cocotb.fork(self._run()) cocotb.fork(self._run())
def recv(self): async def recv(self, compact=True):
while self.empty():
self.sync.clear()
await self.sync.wait()
return self.recv_nowait(compact)
def recv_nowait(self, compact=True):
if self.queue: if self.queue:
frame = self.queue.popleft() frame = self.queue.popleft()
self.queue_occupancy_bytes -= len(frame) self.queue_occupancy_bytes -= len(frame)

View File

View File

@@ -103,11 +103,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_
for test_data in test_frames: for test_data in test_frames:
test_frame = GmiiFrame.from_payload(test_data) test_frame = GmiiFrame.from_payload(test_data)
tb.source.send(test_frame) await tb.source.send(test_frame)
for test_data in test_frames: for test_data in test_frames:
await tb.sink.wait() rx_frame = await tb.sink.recv()
rx_frame = tb.sink.recv()
assert rx_frame.get_payload() == test_data assert rx_frame.get_payload() == test_data
assert rx_frame.check_fcs() assert rx_frame.check_fcs()

View File

@@ -101,11 +101,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_
for test_data in test_frames: for test_data in test_frames:
test_frame = GmiiFrame.from_payload(test_data) test_frame = GmiiFrame.from_payload(test_data)
tb.source.send(test_frame) await tb.source.send(test_frame)
for test_data in test_frames: for test_data in test_frames:
await tb.sink.wait() rx_frame = await tb.sink.recv()
rx_frame = tb.sink.recv()
assert rx_frame.get_payload() == test_data assert rx_frame.get_payload() == test_data
assert rx_frame.check_fcs() assert rx_frame.check_fcs()

View File

@@ -103,11 +103,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_
for test_data in test_frames: for test_data in test_frames:
test_frame = XgmiiFrame.from_payload(test_data) test_frame = XgmiiFrame.from_payload(test_data)
tb.source.send(test_frame) await tb.source.send(test_frame)
for test_data in test_frames: for test_data in test_frames:
await tb.sink.wait() rx_frame = await tb.sink.recv()
rx_frame = tb.sink.recv()
assert rx_frame.get_payload() == test_data assert rx_frame.get_payload() == test_data
assert rx_frame.check_fcs() assert rx_frame.check_fcs()
@@ -142,11 +141,10 @@ async def run_test_alignment(dut, payload_data=None, ifg=12, enable_dic=True,
for test_data in test_frames: for test_data in test_frames:
test_frame = XgmiiFrame.from_payload(test_data) test_frame = XgmiiFrame.from_payload(test_data)
tb.source.send(test_frame) await tb.source.send(test_frame)
for test_data in test_frames: for test_data in test_frames:
await tb.sink.wait() rx_frame = await tb.sink.recv()
rx_frame = tb.sink.recv()
assert rx_frame.get_payload() == test_data assert rx_frame.get_payload() == test_data
assert rx_frame.check_fcs() assert rx_frame.check_fcs()