Skip to content

Commit

Permalink
Convert send/recv to blocking, add nonblocking send_nowait/recv_nowait
Browse files Browse the repository at this point in the history
  • Loading branch information
alexforencich committed Dec 18, 2020
1 parent 7a5473a commit c3207d6
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 24 deletions.
18 changes: 12 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,10 @@ To receive data with a `GmiiSink`, call `recv()`. Call `wait()` to wait for new

#### Methods

* `send(frame)`: send _frame_ (source)
* `recv()`: receive a frame as a `GmiiFrame` (sink)
* `send(frame)`: send _frame_ (blocking) (source)
* `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)
* `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)
Expand Down Expand Up @@ -147,8 +149,10 @@ To receive data with an `RgmiiSink`, call `recv()`. Call `wait()` to wait for n

#### Methods

* `send(frame)`: send _frame_ (source)
* `recv()`: receive a frame as a `GmiiFrame` (sink)
* `send(frame)`: send _frame_ (blocking) (source)
* `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)
* `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)
Expand Down Expand Up @@ -198,8 +202,10 @@ To receive data with an `XgmiiSink`, call `recv()`. Call `wait()` to wait for n

#### Methods

* `send(frame)`: send _frame_ (source)
* `recv()`: receive a frame as an `XgmiiFrame` (sink)
* `send(frame)`: send _frame_ (blocking) (source)
* `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)
* `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)
Expand Down
13 changes: 11 additions & 2 deletions cocotbext/eth/gmii.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,10 @@ def __init__(self, data, er, dv, clock, reset=None, enable=None, mii_select=None

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)
self.queue_occupancy_bytes += len(frame)
self.queue_occupancy_frames += 1
Expand Down Expand Up @@ -278,7 +281,13 @@ def __init__(self, data, er, dv, clock, reset=None, enable=None, mii_select=None

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:
frame = self.queue.popleft()
self.queue_occupancy_bytes -= len(frame)
Expand Down
13 changes: 11 additions & 2 deletions cocotbext/eth/rgmii.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,10 @@ def __init__(self, data, ctrl, clock, reset=None, enable=None, mii_select=None,

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)
self.queue_occupancy_bytes += len(frame)
self.queue_occupancy_frames += 1
Expand Down Expand Up @@ -200,7 +203,13 @@ def __init__(self, data, ctrl, clock, reset=None, enable=None, mii_select=None,

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:
frame = self.queue.popleft()
self.queue_occupancy_bytes -= len(frame)
Expand Down
13 changes: 11 additions & 2 deletions cocotbext/eth/xgmii.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,10 @@ def __init__(self, data, ctrl, clock, reset=None, enable=None, *args, **kwargs):

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)
self.queue_occupancy_bytes += len(frame)
self.queue_occupancy_frames += 1
Expand Down Expand Up @@ -305,7 +308,13 @@ def __init__(self, data, ctrl, clock, reset=None, enable=None, *args, **kwargs):

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:
frame = self.queue.popleft()
self.queue_occupancy_bytes -= len(frame)
Expand Down
5 changes: 2 additions & 3 deletions tests/gmii/test_gmii.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_

for test_data in test_frames:
test_frame = GmiiFrame.from_payload(test_data)
tb.source.send(test_frame)
await tb.source.send(test_frame)

for test_data in test_frames:
await tb.sink.wait()
rx_frame = tb.sink.recv()
rx_frame = await tb.sink.recv()

assert rx_frame.get_payload() == test_data
assert rx_frame.check_fcs()
Expand Down
5 changes: 2 additions & 3 deletions tests/rgmii/test_rgmii.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_

for test_data in test_frames:
test_frame = GmiiFrame.from_payload(test_data)
tb.source.send(test_frame)
await tb.source.send(test_frame)

for test_data in test_frames:
await tb.sink.wait()
rx_frame = tb.sink.recv()
rx_frame = await tb.sink.recv()

assert rx_frame.get_payload() == test_data
assert rx_frame.check_fcs()
Expand Down
10 changes: 4 additions & 6 deletions tests/xgmii/test_xgmii.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_

for test_data in test_frames:
test_frame = XgmiiFrame.from_payload(test_data)
tb.source.send(test_frame)
await tb.source.send(test_frame)

for test_data in test_frames:
await tb.sink.wait()
rx_frame = tb.sink.recv()
rx_frame = await tb.sink.recv()

assert rx_frame.get_payload() == test_data
assert rx_frame.check_fcs()
Expand Down Expand Up @@ -142,11 +141,10 @@ async def run_test_alignment(dut, payload_data=None, ifg=12, enable_dic=True,

for test_data in test_frames:
test_frame = XgmiiFrame.from_payload(test_data)
tb.source.send(test_frame)
await tb.source.send(test_frame)

for test_data in test_frames:
await tb.sink.wait()
rx_frame = tb.sink.recv()
rx_frame = await tb.sink.recv()

assert rx_frame.get_payload() == test_data
assert rx_frame.check_fcs()
Expand Down

0 comments on commit c3207d6

Please sign in to comment.