def SendIter(self, cmds): # cmd : [address, data, rw] rdata = [] for a, d, rw in cmds: self.psel.value = 1 self.penable.value = 0 self.paddr.value = a if rw: self.pwdata.value = d self.pwrite.value = 1 else: self.pwdata.value = 0 self.pwrite.value = 0 self.buses.Write() yield self.clk self.penable.value = 1 self.buses.Write() while True: self.pready.Read() if self.pready.value[0] == 1: if not rw: rdata.append(self.prdata.value) break yield self.clk self.psel.value = 0 self.penable.value = 0 self.buses.Write() if not RandProb(self.A, self.B): yield self.clk while not RandProb(self.A, self.B): yield self.clk self.buses.SetTo(0) self.buses.Write() yield self.clk
def SendIter(self, it): for data in it: self._D(data) while True: yield self.clk self.ack.Read() if self.ack.x[0] == 0 and self.ack.value[0] != 0: break super(Master, self).Get(data) if not RandProb(self.A, self.B): self._X() yield self.clk while not RandProb(self.A, self.B): yield self.clk self._X() yield self.clk
def Send(self, data, imm=True): while not (imm or RandProb(self.A, self.B)): yield self.clk self._D(data) yield self.clk super(Master, self).Get(data) self._X() yield self.clk
def Monitor(self): while True: yield self.clk self.rdy.Read() if self.rdy.x[0] != 0 or self.rdy.value[0] == 0: continue if self.ack.value[0] != 0: self.data.Read() super(Slave, self).Get(self.data) self.ack.value[0] = RandProb(self.A, self.B) self.ack.Write()
def Send(self, data, imm=True): while not (imm or RandProb(self.A, self.B)): yield self.clk self._D(data) while True: yield self.clk self.ack.Read() if self.ack.x[0] == 0 and self.ack.value[0] != 0: break super(Master, self).Get(data) self._X() yield self.clk
def __init__( self, rdy: Bus, ack: Bus, data: Bus, clk: int, A=1, B=5, callbacks=list() ): super(TwoWire.Slave, self).__init__(callbacks) self.rdy = GetBus(rdy) self.ack = GetBus(ack) self.data = GetBus(data) self.clk = GetEvent(clk) self.A = A self.B = B self.ack.value[0] = RandProb(self.A, self.B) self.ack.Write()
def MyMonitor(self, n): for i in range(n): while True: yield self.clk self.rdy.Read() if self.rdy.x[0] != 0 or self.rdy.value[0] == 0: continue if self.ack.value[0] != 0: self.data.Read() super(TwoWire.Slave, self).Get(self.data) break self.ack.value[0] = RandProb(self.A, self.B) self.ack.Write() print("monitor done") self.ack.value[0] = 0 self.ack.Write() yield self.clk
def _Response(self): while True: yield self.clk self.wen.Read() self.ren.Read() if ( self.wen.x[0] != 0 or self.ren.x[0] != 0 or self.ren.value[0] == 0 and self.wen.value[0] == 0 ): continue if self.wait_req.value[0] == 0: self.addr.Read() if self.ren.value[0] == 1: rd_int = self.read_fn(self.addr.value[0]) rd = np.empty_like(self.rd.values[0]) rd[0] = rd_int self.resp.Append((rd,)) else: self.wd.Read() self.write_fn(self.addr.value[0], self.wd.value[0]) self.wait_req.value[0] = RandProb(self.A, self.B) self.wait_req.Write()
def __init__( self, wen: Bus, ren: Bus, wait_req: Bus, rval: Bus, addr: Bus, wd: Bus, rd: Bus, write_fn, read_fn, clk: int, A=1, B=5, Aresp=0, Bresp=1, read_callbacks=list() ): clk = GetEvent(clk) self.clk = clk self.write_fn = write_fn self.read_fn = read_fn self.A = B-A self.B = B ( self.wen, self.ren, self.wait_req, self.addr, self.wd ) = CreateBuses([wen, ren, wait_req, addr, wd]) self.rd = OneWire.Master(rval, rd, clk, callbacks=read_callbacks) self.resp = Response.Response(self.rd.SendIter, clk, Aresp, Bresp) self.wait_req.value[0] = RandProb(self.A, self.B) self.wait_req.Write() Fork(self._Response())
def _RandomLengthIt(A, B): while not RandProb(A, B): yield