Esempio n. 1
0
 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
Esempio n. 2
0
 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
Esempio n. 3
0
 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
Esempio n. 4
0
 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()
Esempio n. 5
0
 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
Esempio n. 6
0
 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()
Esempio n. 7
0
 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
Esempio n. 8
0
	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()
Esempio n. 9
0
	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())
Esempio n. 10
0
def _RandomLengthIt(A, B):
    while not RandProb(A, B):
        yield