hdd: rearrange code (will be easier to understand)
This commit is contained in:
parent
79e82d6ccd
commit
8b21e5fd21
|
@ -93,10 +93,6 @@ class LinkPacket(list):
|
||||||
self.append(dword)
|
self.append(dword)
|
||||||
|
|
||||||
class LinkRXPacket(LinkPacket):
|
class LinkRXPacket(LinkPacket):
|
||||||
def decode(self):
|
|
||||||
self.descramble()
|
|
||||||
return self.check_crc()
|
|
||||||
|
|
||||||
def descramble(self):
|
def descramble(self):
|
||||||
for i in range(len(self)):
|
for i in range(len(self)):
|
||||||
self[i] = self[i] ^ self.scrambled_datas[i]
|
self[i] = self[i] ^ self.scrambled_datas[i]
|
||||||
|
@ -114,15 +110,11 @@ class LinkRXPacket(LinkPacket):
|
||||||
self.pop()
|
self.pop()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
def decode(self):
|
||||||
|
self.descramble()
|
||||||
|
return self.check_crc()
|
||||||
|
|
||||||
class LinkTXPacket(LinkPacket):
|
class LinkTXPacket(LinkPacket):
|
||||||
def encode(self):
|
|
||||||
self.insert_crc()
|
|
||||||
self.scramble()
|
|
||||||
|
|
||||||
def scramble(self):
|
|
||||||
for i in range(len(self)):
|
|
||||||
self[i] = self[i] ^ self.scrambled_datas[i]
|
|
||||||
|
|
||||||
def insert_crc(self):
|
def insert_crc(self):
|
||||||
stdin = ""
|
stdin = ""
|
||||||
for v in self:
|
for v in self:
|
||||||
|
@ -134,6 +126,14 @@ class LinkTXPacket(LinkPacket):
|
||||||
crc = int(out.decode("ASCII"), 16)
|
crc = int(out.decode("ASCII"), 16)
|
||||||
self.append(crc)
|
self.append(crc)
|
||||||
|
|
||||||
|
def scramble(self):
|
||||||
|
for i in range(len(self)):
|
||||||
|
self[i] = self[i] ^ self.scrambled_datas[i]
|
||||||
|
|
||||||
|
def encode(self):
|
||||||
|
self.insert_crc()
|
||||||
|
self.scramble()
|
||||||
|
|
||||||
class LinkLayer(Module):
|
class LinkLayer(Module):
|
||||||
def __init__(self, phy, debug=False, random_level=0):
|
def __init__(self, phy, debug=False, random_level=0):
|
||||||
self.phy = phy
|
self.phy = phy
|
||||||
|
@ -159,46 +159,6 @@ class LinkLayer(Module):
|
||||||
def set_transport_callback(self, callback):
|
def set_transport_callback(self, callback):
|
||||||
self.transport_callback = callback
|
self.transport_callback = callback
|
||||||
|
|
||||||
def remove_cont(self, dword):
|
|
||||||
if dword == primitives["HOLD"]:
|
|
||||||
if self.rx_cont:
|
|
||||||
self.tx_lasts = [0, 0, 0]
|
|
||||||
if dword == primitives["CONT"]:
|
|
||||||
self.rx_cont = True
|
|
||||||
elif is_primitive(dword):
|
|
||||||
self.rx_last = dword
|
|
||||||
self.rx_cont = False
|
|
||||||
if self.rx_cont:
|
|
||||||
dword = self.rx_last
|
|
||||||
return dword
|
|
||||||
|
|
||||||
def callback(self, dword):
|
|
||||||
if dword == primitives["X_RDY"]:
|
|
||||||
self.phy.send(primitives["R_RDY"])
|
|
||||||
elif dword == primitives["WTRM"]:
|
|
||||||
self.phy.send(primitives["R_OK"])
|
|
||||||
if self.rx_packet.ongoing:
|
|
||||||
self.rx_packet.decode()
|
|
||||||
if self.transport_callback is not None:
|
|
||||||
self.transport_callback(self.rx_packet)
|
|
||||||
self.rx_packet.ongoing = False
|
|
||||||
elif dword == primitives["HOLD"]:
|
|
||||||
self.phy.send(primitives["HOLDA"])
|
|
||||||
elif dword == primitives["EOF"]:
|
|
||||||
pass
|
|
||||||
elif self.rx_packet.ongoing:
|
|
||||||
if dword != primitives["HOLD"]:
|
|
||||||
n = randn(100)
|
|
||||||
if n < self.random_level:
|
|
||||||
self.phy.send(primitives["HOLD"])
|
|
||||||
else:
|
|
||||||
self.phy.send(primitives["R_IP"])
|
|
||||||
if not is_primitive(dword):
|
|
||||||
self.rx_packet.append(dword)
|
|
||||||
elif dword == primitives["SOF"]:
|
|
||||||
self.rx_packet = LinkRXPacket()
|
|
||||||
self.rx_packet.ongoing = True
|
|
||||||
|
|
||||||
def send(self, dword):
|
def send(self, dword):
|
||||||
if self.send_state == "RDY":
|
if self.send_state == "RDY":
|
||||||
self.phy.send(primitives["X_RDY"])
|
self.phy.send(primitives["X_RDY"])
|
||||||
|
@ -243,6 +203,46 @@ class LinkLayer(Module):
|
||||||
else:
|
else:
|
||||||
self.tx_cont_nb = 0
|
self.tx_cont_nb = 0
|
||||||
|
|
||||||
|
def remove_cont(self, dword):
|
||||||
|
if dword == primitives["HOLD"]:
|
||||||
|
if self.rx_cont:
|
||||||
|
self.tx_lasts = [0, 0, 0]
|
||||||
|
if dword == primitives["CONT"]:
|
||||||
|
self.rx_cont = True
|
||||||
|
elif is_primitive(dword):
|
||||||
|
self.rx_last = dword
|
||||||
|
self.rx_cont = False
|
||||||
|
if self.rx_cont:
|
||||||
|
dword = self.rx_last
|
||||||
|
return dword
|
||||||
|
|
||||||
|
def callback(self, dword):
|
||||||
|
if dword == primitives["X_RDY"]:
|
||||||
|
self.phy.send(primitives["R_RDY"])
|
||||||
|
elif dword == primitives["WTRM"]:
|
||||||
|
self.phy.send(primitives["R_OK"])
|
||||||
|
if self.rx_packet.ongoing:
|
||||||
|
self.rx_packet.decode()
|
||||||
|
if self.transport_callback is not None:
|
||||||
|
self.transport_callback(self.rx_packet)
|
||||||
|
self.rx_packet.ongoing = False
|
||||||
|
elif dword == primitives["HOLD"]:
|
||||||
|
self.phy.send(primitives["HOLDA"])
|
||||||
|
elif dword == primitives["EOF"]:
|
||||||
|
pass
|
||||||
|
elif self.rx_packet.ongoing:
|
||||||
|
if dword != primitives["HOLD"]:
|
||||||
|
n = randn(100)
|
||||||
|
if n < self.random_level:
|
||||||
|
self.phy.send(primitives["HOLD"])
|
||||||
|
else:
|
||||||
|
self.phy.send(primitives["R_IP"])
|
||||||
|
if not is_primitive(dword):
|
||||||
|
self.rx_packet.append(dword)
|
||||||
|
elif dword == primitives["SOF"]:
|
||||||
|
self.rx_packet = LinkRXPacket()
|
||||||
|
self.rx_packet.ongoing = True
|
||||||
|
|
||||||
def gen_simulation(self, selfp):
|
def gen_simulation(self, selfp):
|
||||||
self.tx_packet.done = True
|
self.tx_packet.done = True
|
||||||
self.phy.send(primitives["SYNC"])
|
self.phy.send(primitives["SYNC"])
|
||||||
|
@ -443,6 +443,27 @@ class HDD(Module):
|
||||||
self.wr_length = 0
|
self.wr_length = 0
|
||||||
self.wr_cnt = 0
|
self.wr_cnt = 0
|
||||||
|
|
||||||
|
def allocate_mem(self, base, length):
|
||||||
|
if self.mem_debug:
|
||||||
|
print("[HDD] : Allocating {n} bytes at 0x{a}".format(n=length, a=base))
|
||||||
|
self.mem = HDDMemRegion(base, length)
|
||||||
|
|
||||||
|
def write_mem(self, adr, data):
|
||||||
|
if self.mem_debug:
|
||||||
|
print("[HDD] : Writing {n} bytes at 0x{a}".format(n=len(data)*4, a=adr))
|
||||||
|
current_adr = (adr-self.mem.base)//4
|
||||||
|
for i in range(len(data)):
|
||||||
|
self.mem.data[current_adr+i] = data[i]
|
||||||
|
|
||||||
|
def read_mem(self, adr, length=1):
|
||||||
|
if self.mem_debug:
|
||||||
|
print("[HDD] : Reading {n} bytes at 0x{a}".format(n=length, a=adr))
|
||||||
|
current_adr = (adr-self.mem.base)//4
|
||||||
|
data = []
|
||||||
|
for i in range(length//4):
|
||||||
|
data.append(self.mem.data[current_adr+i])
|
||||||
|
return data
|
||||||
|
|
||||||
def write_dma_cmd(self, fis):
|
def write_dma_cmd(self, fis):
|
||||||
self.wr_address = fis.lba_lsb
|
self.wr_address = fis.lba_lsb
|
||||||
self.wr_length = fis.count
|
self.wr_length = fis.count
|
||||||
|
@ -466,24 +487,3 @@ class HDD(Module):
|
||||||
return [FIS_REG_D2H()]
|
return [FIS_REG_D2H()]
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def allocate_mem(self, base, length):
|
|
||||||
if self.mem_debug:
|
|
||||||
print("[HDD] : Allocating {n} bytes at 0x{a}".format(n=length, a=base))
|
|
||||||
self.mem = HDDMemRegion(base, length)
|
|
||||||
|
|
||||||
def write_mem(self, adr, data):
|
|
||||||
if self.mem_debug:
|
|
||||||
print("[HDD] : Writing {n} bytes at 0x{a}".format(n=len(data)*4, a=adr))
|
|
||||||
current_adr = (adr-self.mem.base)//4
|
|
||||||
for i in range(len(data)):
|
|
||||||
self.mem.data[current_adr+i] = data[i]
|
|
||||||
|
|
||||||
def read_mem(self, adr, length=1):
|
|
||||||
if self.mem_debug:
|
|
||||||
print("[HDD] : Reading {n} bytes at 0x{a}".format(n=length, a=adr))
|
|
||||||
current_adr = (adr-self.mem.base)//4
|
|
||||||
data = []
|
|
||||||
for i in range(length//4):
|
|
||||||
data.append(self.mem.data[current_adr+i])
|
|
||||||
return data
|
|
||||||
|
|
Loading…
Reference in New Issue