def recv(self, nbits=0): ''' Retrieve `nbits` bits from the hardware. If `nbits` > 0, return the bits retrieved. If there are no enough bits currently available, `recv` will block until enough bits become available. If `nbits` is 0, return a iterable which when iterated over will retrieve 1 bit at a time. Equivalent to: recv() while True: yield recv(1) ''' if not nbits: return iter(functools.partial(self.recv, 1), None) while True: while True: try: self.ebuffer += self.iqueue.get(block=False) except Queue.Empty: break if len(self.ebuffer) >= nbits: ret, self.ebuffer = utils.split_at(self.ebuffer, nbits) return ret else: mint.wait(0) continue
def send(self, frame): if len(frame) > self._max_frame_size: raise NIC.FrameTooLarge() while not self.fit(frame, self.obuffer_used): mint.wait(0) self._oframes.append(frame) self.obuffer_used += len(frame)
def run(self): out0, out1 = self.setup() while True: self.ports[1].send(out0.popleft()) self.ports[0].send(out1.popleft()) out0.append(self.ports[0].recv()) out1.append(self.ports[1].recv()) mint.wait(0)
def send(self, frame): while True: try: self.oframes.put(frame, block=False) break except Queue.Full: mint.wait(0) continue
def recv(self): while True: try: frame = self.iframes.popleft() self.ibuffer_used -= len(frame) return frame except IndexError: mint.wait(0)
def recv(self, n_bits): bits = deque() while len(bits) < n_bits: try: bit = self.nic.ibuffer.get(block=False) bits.append(bit) except Queue.Empty: mint.wait(0) return ''.join(map(str, bits))
def send(self, frame, block=True): if len(frame) > self._max_frame_size: raise NIC.FrameTooLarge() if not block and not self.fit(frame, self.obuffer_used): raise mint.exceptions.WouldBlock while not self.fit(frame, self.obuffer_used): mint.wait(0) self._oframes.append(frame) self.obuffer_used += len(frame)
def link_layer_sender(self): while True: if self.acked: data = self.pull() frame = self.NOT_ACK + data self.nic.send(frame) self.acked = False else: mint.wait(0)
def run(self): while True: self.pull_frame() try: obit = self.oframe.popleft() except IndexError: obit = 0 ibit = self.port.io(obit) self.push_frame(ibit) mint.wait(0)
def recv(self, block=True): while True: try: frame = self.iframes.popleft() self.ibuffer_used -= len(frame) return frame except IndexError: if block: mint.wait(0) else: raise mint.exceptions.WouldBlock
def run(self): while True: if not self.oframe: self.pull_frame() try: obit = self.oframe.popleft() except IndexError: obit = 0 self.port.send(obit) mint.wait(0) ibit = self.port.recv() self.push_frame(ibit) mint.wait(0)
def recv(self, nbits): while True: while True: try: self.ebuffer += self.iqueue.get(block=False) except Queue.Empty: break if len(self.ebuffer) >= nbits: ret, self.ebuffer = utils.split_at(self.ebuffer, nbits) return ret else: mint.wait(0) continue
def sender(self): while True: if self.acked: payload = self.master.pull() header = self.build( acking=False, ack=0, # meaningless seq=self.sending_seq) self.frame = self.compose(header, payload) self.servant.send(self.frame) self.timer.start() self.acked = False else: mint.wait(0)
def sender(self): while True: while self.events: e = self.events.popleft() if e.type == RESEND: self.servant.send(frame) e.timer.start() if self.allowed_to_send(): payload = self.master.pull() header = self.build(seq=self.oseq) frame = self.compose(header, payload) self.servant.send(frame) timer = self.timer(self.resend_timeout, utils.Bunch(type=RESEND, frame=frame, acked=False)) self.oframes.append(utils.Bunch(seq=self.oseq, timer=timer)) self.oseq = (self.oseq + 1) & self.MAX_SEQ else: mint.wait(0)
def pop_from(buf): while True: try: return buf.popleft() except IndexError: mint.wait()
def io(self, osymbol=None): if osymbol is not None: self.osymbol = osymbol mint.wait(0) return self.isymbol
def recver(self): while True: self.switch_frames() mint.wait(0)
def recv(self): while True: try: return self.iframes.get(block=False) except Queue.Empty: mint.wait(1)
def pull(self): while True: try: return self.obuffer.popleft() except IndexError: mint.wait(0)