1322 lines
41 KiB
Python
1322 lines
41 KiB
Python
import array
|
||
|
||
|
||
HOST_WRITE = 0
|
||
HOST_READ = 1
|
||
LVDS_WRITE = 2
|
||
LVDS_READ = 3
|
||
|
||
class ArrayUintRef:
|
||
"""对 array 某个元素的引用代理"""
|
||
def __init__(self, arr, index, t = 0):
|
||
self.arr = arr
|
||
self.index = index
|
||
self.t = t
|
||
|
||
@property
|
||
def value(self):
|
||
val = 0
|
||
if self.t == 0:
|
||
val = self.arr[self.index]
|
||
elif self.t == 1:
|
||
val = (self.arr[self.index]
|
||
| (self.arr[self.index + 1] << 8))
|
||
elif self.t == 2:
|
||
val = (self.arr[self.index]
|
||
| (self.arr[self.index + 1] << 8)
|
||
| (self.arr[self.index + 2] << 16)
|
||
| (self.arr[self.index + 3] << 24))
|
||
#elif self.t == 3:
|
||
else:
|
||
val = (self.arr[self.index]
|
||
| (self.arr[self.index + 1] << 8)
|
||
| (self.arr[self.index + 2] << 16)
|
||
| (self.arr[self.index + 3] << 24)
|
||
| (self.arr[self.index + 4] << 32)
|
||
| (self.arr[self.index + 5] << 40)
|
||
| (self.arr[self.index + 6] << 48)
|
||
| (self.arr[self.index + 7] << 56))
|
||
|
||
return val
|
||
|
||
@value.setter
|
||
def value(self, val):
|
||
self.arr[self.index] = (val & 0xff)
|
||
|
||
if self.t >= 1:
|
||
self.arr[self.index + 1] = ((val >> 8) & 0xff)
|
||
|
||
if self.t >= 2:
|
||
self.arr[self.index + 2] = ((val >> 16) & 0xff)
|
||
self.arr[self.index + 3] = ((val >> 24) & 0xff)
|
||
|
||
if self.t >= 3:
|
||
self.arr[self.index + 4] = ((val >> 32) & 0xff)
|
||
self.arr[self.index + 5] = ((val >> 40) & 0xff)
|
||
self.arr[self.index + 6] = ((val >> 48) & 0xff)
|
||
self.arr[self.index + 7] = ((val >> 56) & 0xff)
|
||
|
||
#print('setter:', self.t)
|
||
|
||
def __repr__(self):
|
||
return f"ArrayUintRef(value={self.value})"
|
||
|
||
|
||
class MemroyQueueMgr:
|
||
class MemoryQueue:
|
||
def __init__(self, mq):
|
||
self.mq = mq
|
||
self.data = list()
|
||
|
||
def __getitem__(self, index):
|
||
if len(self.data) == 0:
|
||
if isinstance(index, slice):
|
||
return list()[index]
|
||
else:
|
||
return 0
|
||
|
||
val = self.data[0]
|
||
if isinstance(index, slice):
|
||
return val[index]
|
||
else:
|
||
if index < 2048:
|
||
return val[index]
|
||
else:
|
||
return 0
|
||
|
||
def __setitem__(self, index, value):
|
||
if len(self.data) != 0:
|
||
pass
|
||
|
||
if index < 2048:
|
||
self.data[0][index] = value
|
||
|
||
def __len__(self):
|
||
return len(self.data)
|
||
|
||
|
||
def deq(self):
|
||
if len(self.data) != 0:
|
||
v = self.data.pop(0)
|
||
return v
|
||
else:
|
||
return None
|
||
|
||
def enq(self, item):
|
||
if type(item) != array.array:
|
||
print('Error, item type:', type(item))
|
||
return
|
||
else:
|
||
self.data.append(item)
|
||
|
||
def reset(self):
|
||
self.data = list()
|
||
|
||
def __init__(self, item_num):
|
||
self.memory = list()
|
||
self.item_num = item_num
|
||
|
||
self.din = MemroyQueueMgr.MemoryQueue(self)
|
||
self.dout = MemroyQueueMgr.MemoryQueue(self)
|
||
self.reset()
|
||
|
||
def reset(self):
|
||
self.din.reset()
|
||
self.dout.reset()
|
||
|
||
self.memory = list()
|
||
for i in range(self.item_num):
|
||
self.memory.append(array.array('B', [0] * 2048))
|
||
for i in range(self.item_num):
|
||
self.din.enq(self.memory[i])
|
||
|
||
|
||
def __getitem__(self, index):
|
||
return self.dout[index]
|
||
|
||
def __setitem__(self, index, value):
|
||
self.din[index] = value
|
||
|
||
def __len__(self):
|
||
return len(self.dout)
|
||
|
||
|
||
def enq_data(self):
|
||
self.dout.enq(self.din.deq())
|
||
|
||
def free_data(self):
|
||
#这里
|
||
self.din.enq(self.dout.deq())
|
||
|
||
|
||
@staticmethod
|
||
def clear(arr):
|
||
if type(arr) != array.array:
|
||
return
|
||
for i in range(len(arr)): arr[i] = 0
|
||
|
||
|
||
class device(object):
|
||
def __init__(self):
|
||
super().__init__()
|
||
self.reset()
|
||
|
||
|
||
def reset(self):
|
||
self.reg = array.array('B', [0, ] * 2048)
|
||
|
||
# 配置各SM的item数量(sm0~sm7)
|
||
self.sm = dict()
|
||
syncMemNum = [4, 4, 4, 4, 2, 2, 2, 2]
|
||
for i in range(8):
|
||
self.sm[f'mem{i}'] = MemroyQueueMgr(syncMemNum[i])
|
||
self.sm[f'mem{i}_ctrl'] = ArrayUintRef(self.reg, 0x300 + i * 4)
|
||
self.sm[f'mem{i}_item_num'] = ArrayUintRef(self.reg, 0x301 + i * 4)
|
||
self.sm[f'mem{i}_len'] = ArrayUintRef(self.reg, 0x302 + i * 4, 1)
|
||
|
||
#print(self.sm)
|
||
|
||
self.ebmmu = dict()
|
||
for i in range(16):
|
||
self.ebmmu[f'va{i}'] = ArrayUintRef(self.reg, 0x200 + i * 0xa, 2)
|
||
self.ebmmu[f'pa{i}'] = ArrayUintRef(self.reg, 0x204 + i * 0xa, 1)
|
||
self.ebmmu[f'op{i}'] = ArrayUintRef(self.reg, 0x208 + i * 0xa, 0)
|
||
self.ebmmu[f'en{i}'] = ArrayUintRef(self.reg, 0x209 + i * 0xa, 0)
|
||
|
||
#看门狗
|
||
self.watchdog = dict()
|
||
self.watchdog["status"] = ArrayUintRef(self.reg, 0x400, 2)
|
||
self.watchdog["enable"] = ArrayUintRef(self.reg, 0x404, 2)
|
||
for i in range(18):
|
||
self.watchdog[f"{i}"] = ArrayUintRef(self.reg, 0x408 + i * 4, 2)
|
||
|
||
#事件
|
||
self.event = dict()
|
||
self.event['ctrl0'] = ArrayUintRef(self.reg, 0x500, 1)
|
||
self.event['ctrl1'] = ArrayUintRef(self.reg, 0x502, 1)
|
||
self.event['status0'] = ArrayUintRef(self.reg, 0x504, 1)
|
||
self.event['status1'] = ArrayUintRef(self.reg, 0x506, 1)
|
||
self.event['rise0'] = ArrayUintRef(self.reg, 0x508, 3)
|
||
self.event['fall0'] = ArrayUintRef(self.reg, 0x510, 3)
|
||
self.event['rise1'] = ArrayUintRef(self.reg, 0x518, 3)
|
||
self.event['fall1'] = ArrayUintRef(self.reg, 0x520, 3)
|
||
self.event['host_sm_w'] = ArrayUintRef(self.reg, 0x528, 3)
|
||
self.event['host_sm_r'] = ArrayUintRef(self.reg, 0x530, 3)
|
||
self.event['lvds_sm_w'] = ArrayUintRef(self.reg, 0x538, 3)
|
||
self.event['lvds_sm_r'] = ArrayUintRef(self.reg, 0x540, 3)
|
||
|
||
#主/从设备
|
||
self.role = ArrayUintRef(self.reg, 0)
|
||
|
||
#硬件版本号
|
||
self.reg[1] = 0x1
|
||
|
||
#硬件编码
|
||
self.reg[2] = 0x4c
|
||
self.reg[3] = 0x58
|
||
self.reg[4] = 0x50
|
||
self.reg[5] = 0x30
|
||
self.reg[6] = 0x30
|
||
self.reg[7] = 0x31
|
||
|
||
#硬件接口
|
||
self.reg[9] = 0x01
|
||
|
||
#中断状态
|
||
self.reg[0x73] = 0x80
|
||
self.reg[0x77] = 0x80
|
||
|
||
self.int_en = ArrayUintRef(self.reg, 0x70, 2)
|
||
self.int_status = ArrayUintRef(self.reg, 0x74, 2)
|
||
self.int_clear = ArrayUintRef(self.reg, 0x78, 2)
|
||
self.int_mode = ArrayUintRef(self.reg, 0x7c, 1)
|
||
|
||
#SYNC同步点
|
||
self.sync_point = ArrayUintRef(self.reg, 0x130, 3)
|
||
self.sync_point.value = 0xffffffffffffffff
|
||
|
||
#print('sync_point', self.reg[0x130:0x138], hex(self.sync_point.value))
|
||
|
||
'''
|
||
self.reg[0x130] = 0xff
|
||
self.reg[0x131] = 0xff
|
||
self.reg[0x132] = 0xff
|
||
self.reg[0x133] = 0xff
|
||
self.reg[0x134] = 0xff
|
||
self.reg[0x135] = 0xff
|
||
self.reg[0x136] = 0xff
|
||
self.reg[0x137] = 0xff
|
||
'''
|
||
|
||
self.__init_temp_regs()
|
||
|
||
self.next_dev = None
|
||
self.prev_dev = None
|
||
|
||
def connect_next(self, dev):
|
||
if isinstance(dev, device):
|
||
self.next_dev = dev
|
||
dev.prev_dev = self
|
||
return True
|
||
return False
|
||
|
||
def __init_temp_regs(self):
|
||
#临时寄存器
|
||
#LVDS侧写入锁
|
||
self.lvds_0x18 = 0x0
|
||
self.lvds_0x19 = 0x0
|
||
|
||
#RESET
|
||
self.reset_0x40 = 0x0
|
||
self.reset_0x41 = 0x0
|
||
self.reset_0x42 = 0x0
|
||
self.reset_0x43 = 0x0
|
||
|
||
#交换上下行管脚
|
||
self.swap_dir_0x4a = 0x0
|
||
self.swap_dir_0x4b = 0x0
|
||
|
||
#code_sel, 4b5b, 8b10b
|
||
self.code_sel_0x4c = 0x0
|
||
self.code_sel_0x4d = 0x0
|
||
|
||
#cdr_type
|
||
self.cdr_type_0x4e = 0x0
|
||
self.cdr_type_0x4f = 0x0
|
||
|
||
#int_status temp reg
|
||
self.int_status = [0x0, 0x0, 0x0, 0x80]
|
||
|
||
|
||
def hostwrite(self, addr, data):
|
||
l = len(data)
|
||
ret = False
|
||
for k, v in enumerate(range(addr, addr+l)):
|
||
ret = (self.__ctrl_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__trans_ctrl_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__reset_ctrl_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__int_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__stat_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__link_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__sync_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__custom_def_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__ebmmu_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__sm_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__watch_dog_regs_wr(HOST_WRITE, v, data[k])
|
||
or self.__event_regs_wr(HOST_WRITE, v, data[k])
|
||
)
|
||
|
||
# self.__init_temp_regs()
|
||
|
||
return ret
|
||
|
||
def hostread(self, addr, l):
|
||
data = [0, ] * l
|
||
for k, v in enumerate(range(addr, addr+l)):
|
||
if v < 2048:
|
||
data[k] = self.reg[v]
|
||
if v >= 2048:
|
||
pass
|
||
return data
|
||
|
||
def trans_2_next_dev(self, packet):
|
||
pass
|
||
|
||
def trans_2_prev_dev(self, packet):
|
||
pass
|
||
|
||
|
||
def __ctrl_regs_wr(self, op, regaddr, val, *args):
|
||
if 0x0 <= regaddr <= 0x19:
|
||
pass
|
||
else:
|
||
return False
|
||
|
||
if regaddr == 0x00:
|
||
if op == HOST_WRITE:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif op == LVDS_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif regaddr == 0x01:
|
||
# 硬件版本号,写入无效
|
||
if (op == HOST_WRITE) or (op == LVDS_WRITE):
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0x02 <= regaddr <= 0x07:
|
||
# 硬件编码,写入无效
|
||
if (op == HOST_WRITE) or (op == LVDS_WRITE):
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
elif regaddr == 0x09:
|
||
#硬件接口(0,1,2,3,4,5)
|
||
if op == HOST_WRITE:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif op == LVDS_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
elif 0xa <= regaddr <= 0xb:
|
||
#EasyBus站点地址
|
||
if (op == HOST_READ) or (op == LVDS_READ):
|
||
if self.role.value == 2:
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
elif 0x10 <= regaddr <= 0x17:
|
||
#硬件唯一编码,写入无效
|
||
if (op == HOST_WRITE) or (op == LVDS_WRITE):
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
elif 0x18 <= regaddr <= 0x19:
|
||
#lvds写入锁
|
||
if (op == HOST_WRITE) or (op == LVDS_WRITE):
|
||
if self.role.value == 1:
|
||
pass
|
||
elif self.role.value == 2:
|
||
if regaddr == 0x18:
|
||
self.lvds_0x18 = val & 0x1
|
||
elif regaddr == 0x19:
|
||
if val == 0x58:
|
||
self.reg[regaddr] = self.lvds_0x18
|
||
else:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
def __trans_ctrl_regs_wr(self, op, regaddr, val, *args):
|
||
if 0x20 <= regaddr <= 0x25:
|
||
pass
|
||
else:
|
||
return False
|
||
|
||
if (self.role.value >= 2) or (self.role.value < 1):
|
||
return True
|
||
|
||
if regaddr == 0x20:
|
||
if op == HOST_WRITE:
|
||
self.reg[regaddr] = val & 0xff
|
||
en_tx = (val & 0x1)
|
||
buf_no = (val >> 1) & 0x3
|
||
#buf_rx = (val >> 3) & 0x3
|
||
if en_tx == 0x1:
|
||
self.reg[regaddr] = self.reg[regaddr] & 0xfe
|
||
#发送数据
|
||
pass
|
||
elif op == LVDS_WRITE:
|
||
pass
|
||
elif (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
elif (op == LVDS_READ):
|
||
#val[args[0]] = 0
|
||
pass
|
||
else:
|
||
pass
|
||
|
||
elif 0x22 <= regaddr <= 0x23:
|
||
if op == HOST_WRITE:
|
||
self.reg[0x22] = 0
|
||
self.reg[0x23] = 0
|
||
elif op == LVDS_WRITE:
|
||
pass
|
||
elif (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
elif (op == LVDS_READ):
|
||
pass
|
||
else:
|
||
pass
|
||
|
||
elif 0x24 <= regaddr <= 0x25:
|
||
if op == HOST_WRITE:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif op == LVDS_WRITE:
|
||
pass
|
||
elif (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
elif (op == LVDS_READ):
|
||
pass
|
||
else:
|
||
pass
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
def __reset_ctrl_regs_wr(self, op, regaddr, val, *args):
|
||
if 0x40 <= regaddr <= 0x55:
|
||
pass
|
||
else:
|
||
return False
|
||
|
||
#EasyBus复位
|
||
if 0x40 <= regaddr <= 0x43:
|
||
if (op == LVDS_WRITE) and (op == LVDS_READ):
|
||
pass
|
||
|
||
elif op == HOST_WRITE:
|
||
if regaddr == 0x40:
|
||
self.reset_0x40 = val & 0x1
|
||
elif regaddr == 0x41:
|
||
self.reset_0x41 = 0
|
||
elif regaddr == 0x42:
|
||
self.reset_0x42 = val & 0xff
|
||
elif regaddr == 0x43:
|
||
self.reset_0x43 = val & 0xff
|
||
else:
|
||
pass
|
||
|
||
if (self.reset_0x42 == 0x66) and (self.reset_0x43 == 0x79):
|
||
if self.reset_0x40 == 0x1:
|
||
#重启芯片
|
||
self.reset_0x42 = 0
|
||
self.reset_0x43 = 0
|
||
#self.reset_0x40 = 0
|
||
#self.reset_0x41 = 0
|
||
else:
|
||
pass
|
||
elif op == HOST_READ:
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#交换上下行管脚
|
||
elif 0x4a <= regaddr <= 0x4b:
|
||
if (op == LVDS_WRITE) and (op == LVDS_READ):
|
||
pass
|
||
|
||
elif op == HOST_WRITE:
|
||
if regaddr == 0x4a:
|
||
self.swap_dir_0x4a = val & 0xff
|
||
elif regaddr == 0x4b:
|
||
self.swap_dir_0x4b = val & 0xff
|
||
if self.swap_dir_0x4b == 0x58:
|
||
self.reg[0x4a] = self.swap_dir_0x4a
|
||
self.swap_dir_0x4b = 0x0
|
||
#进行管脚交换
|
||
else:
|
||
pass
|
||
else:
|
||
pass
|
||
elif op == HOST_READ:
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#4b5b,8b10b选择
|
||
#BIT0:0,选择8b10b编码;1选择4b5b编码
|
||
#BIT15-BIT8:key,当KEY = 0x59,且BIT0为1时,4b5b;BIT0为0时,8b10b。
|
||
#读取时KEY始终为0。KEY不正确,不响应修改
|
||
elif 0x4c <= regaddr <= 0x4d:
|
||
if (op == LVDS_WRITE) and (op == LVDS_READ):
|
||
pass
|
||
|
||
elif op == HOST_WRITE:
|
||
if regaddr == 0x4c:
|
||
self.code_sel_0x4c = val & 0xff
|
||
elif regaddr == 0x4d:
|
||
self.code_sel_0x4d = val & 0xff
|
||
if self.code_sel_0x4d == 0x59:
|
||
self.reg[0x4c] = self.code_sel_0x4c
|
||
self.code_sel_0x4d = 0
|
||
#切换编码
|
||
else:
|
||
pass
|
||
else:
|
||
pass
|
||
elif op == HOST_READ:
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#CDR参数
|
||
elif 0x4e <= regaddr <= 0x4f:
|
||
if (op == LVDS_WRITE) and (op == LVDS_READ):
|
||
pass
|
||
|
||
elif op == HOST_WRITE:
|
||
if regaddr == 0x4e:
|
||
self.cdr_type_0x4e = val & 0xff
|
||
elif regaddr == 0x4f:
|
||
self.cdr_type_0x4f = val & 0xff
|
||
if self.cdr_type_0x4f == 0x60:
|
||
self.reg[0x4e] = self.cdr_type_0x4e
|
||
self.cdr_type_0x4f = 0x0
|
||
#执行cdr参数
|
||
else:
|
||
pass
|
||
else:
|
||
pass
|
||
elif op == HOST_READ:
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#4倍频分频系数
|
||
elif regaddr == 0x55:
|
||
if (op == LVDS_WRITE) and (op == LVDS_READ):
|
||
pass
|
||
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
|
||
elif op == HOST_READ:
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
def __int_regs_wr(self, op, regaddr, val, *args):
|
||
if 0x70 <= regaddr <= 0x7d:
|
||
pass
|
||
else:
|
||
return False
|
||
|
||
#中断使能
|
||
if 0x70 <= regaddr <= 0x73:
|
||
if (op == LVDS_WRITE):
|
||
pass
|
||
elif op == HOST_WRITE:
|
||
self.reg[regaddr] = val & 0xff
|
||
self.reg[0x73] = self.reg[0x73] | 0x80
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#中断状态
|
||
elif 0x74 <= regaddr <= 0x77:
|
||
#只读
|
||
#warning
|
||
if (op == LVDS_WRITE) or (op == HOST_WRITE):
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#中断状态清除
|
||
elif 0x78 <= regaddr <= 0x7b:
|
||
if (op == LVDS_WRITE):
|
||
pass
|
||
elif op == HOST_WRITE:
|
||
self.reg[regaddr - 0x4] = (~val) & self.reg[regaddr - 0x4]
|
||
self.int_status[regaddr - 0x78] = (~val) & self.int_status[regaddr - 0x78]
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#中断模式
|
||
elif 0x7c <= regaddr <= 0x7d:
|
||
if (op == LVDS_WRITE):
|
||
pass
|
||
elif op == HOST_WRITE:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
def __stat_regs_wr(self, op, regaddr, val, *args):
|
||
#统计
|
||
#下行接收错误计数器(包括包不完全、CDR、CRC、超时)
|
||
if 0x80 <= regaddr <= 0x81:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0x80] = 0
|
||
regaddr[0x81] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
elif 0x82 <= regaddr <= 0x83:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0x82] = 0
|
||
regaddr[0x83] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0x84 <= regaddr <= 0x85:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0x84] = 0
|
||
regaddr[0x85] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0x86 <= regaddr <= 0x87:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0x86] = 0
|
||
regaddr[0x87] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0x88 <= regaddr <= 0x89:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0x88] = 0
|
||
regaddr[0x89] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0x8a <= regaddr <= 0x8b:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0x8a] = 0
|
||
regaddr[0x8b] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0x8c <= regaddr <= 0x8f:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0x8c] = 0
|
||
regaddr[0x8f] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0x90 <= regaddr <= 0x97:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0x90] = 0
|
||
regaddr[0x91] = 0
|
||
regaddr[0x92] = 0
|
||
regaddr[0x93] = 0
|
||
regaddr[0x94] = 0
|
||
regaddr[0x95] = 0
|
||
regaddr[0x96] = 0
|
||
regaddr[0x97] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#上行
|
||
elif 0xa0 <= regaddr <= 0xa1:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0xa0] = 0
|
||
regaddr[0xa1] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0xa2 <= regaddr <= 0xa3:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0xa2] = 0
|
||
regaddr[0xa3] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0xa4 <= regaddr <= 0xa5:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0xa4] = 0
|
||
regaddr[0xa5] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0xa6 <= regaddr <= 0xa7:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0xa6] = 0
|
||
regaddr[0xa7] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0xa8 <= regaddr <= 0xa9:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0xa8] = 0
|
||
regaddr[0xa9] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0xaa <= regaddr <= 0xab:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0xaa] = 0
|
||
regaddr[0xab] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0xac <= regaddr <= 0xaf:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0xac] = 0
|
||
regaddr[0xad] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif 0xb0 <= regaddr <= 0xb7:
|
||
if (op == LVDS_WRITE):
|
||
regaddr[0xb0] = 0
|
||
regaddr[0xb1] = 0
|
||
regaddr[0xb2] = 0
|
||
regaddr[0xb3] = 0
|
||
regaddr[0xb4] = 0
|
||
regaddr[0xb5] = 0
|
||
regaddr[0xb6] = 0
|
||
regaddr[0xb7] = 0
|
||
elif op == HOST_WRITE:
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
def __link_regs_wr(self, op, regaddr, val, *args):
|
||
#两个寄存器都是只读
|
||
#链路状态
|
||
if 0xc0 <= regaddr <= 0xc1:
|
||
if (op == LVDS_WRITE) or (op == HOST_WRITE):
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
#右侧设备地址
|
||
elif 0xc2 <= regaddr <= 0xc3:
|
||
if (op == LVDS_WRITE) or (op == HOST_WRITE):
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
|
||
def __sync_regs_wr(self, op, regaddr, val, *args):
|
||
#同步
|
||
#这里注意一个问题,主站是否要考虑lvds侧锁不锁的问题
|
||
'''
|
||
if 0x0100 <= regaddr <= 0x107:
|
||
pass
|
||
elif 0x0108 <= regaddr <= 0x10f:
|
||
pass
|
||
elif 0x0110 <= regaddr <= 0x113:
|
||
pass
|
||
elif 0x0114 <= regaddr <= 0x117:
|
||
pass
|
||
elif 0x0118 <= regaddr <= 0x11f:
|
||
pass
|
||
'''
|
||
if 0x0100 <= regaddr <= 0x11f:
|
||
if (op == LVDS_WRITE) or (op == HOST_WRITE):
|
||
pass
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
'''
|
||
elif 0x0120 <= regaddr <= 0x121:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif 0x0122 <= regaddr <= 0x123:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif 0x0124 <= regaddr <= 0x125:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif 0x0126 <= regaddr <= 0x127:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif 0x0128 <= regaddr <= 0x129:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
'''
|
||
elif 0x0120 <= regaddr <= 0x129:
|
||
if (op == LVDS_WRITE):
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_WRITE):
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
|
||
'''
|
||
elif 0x0130 <= regaddr <= 0x137:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
|
||
elif 0x0138 <= regaddr <= 0x13b:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif 0x013c <= regaddr <= 0x13f:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif 0x0140 <= regaddr <= 0x143:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif 0x0144 <= regaddr <= 0x147:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
|
||
elif 0x0148 <= regaddr <= 0x14f:
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
'''
|
||
elif 0x0130 <= regaddr <= 0x14f:
|
||
if (op == LVDS_WRITE):
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_WRITE):
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_READ) or (op == LVDS_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
def __custom_def_regs_wr(self, op, regaddr, val, *args):
|
||
if 0x180 <= regaddr <= 0x1FF:
|
||
if self.role.value == 2:
|
||
if (op == LVDS_WRITE) or (op == HOST_WRITE):
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
else:
|
||
pass
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
def __ebmmu_regs_wr(self, op, regaddr, val, *args):
|
||
ebmmu_base = 0x200
|
||
ebmmu_no = 16
|
||
|
||
for i in range(ebmmu_no):
|
||
if (ebmmu_base + i * 0xa) <= regaddr <= ((ebmmu_base + i * 0xa) + 0x3):
|
||
if self.role.value == 2:
|
||
if (op == LVDS_WRITE):
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_WRITE):
|
||
pass
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif ((ebmmu_base + i * 0xa) + 0x4) <= regaddr <= ((ebmmu_base + i * 0xa) + 0x5):
|
||
if self.role.value == 2:
|
||
if (op == LVDS_WRITE):
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_WRITE):
|
||
pass
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif ((ebmmu_base + i * 0xa) + 0x6) <= regaddr <= ((ebmmu_base + i * 0xa) + 0x7):
|
||
if self.role.value == 2:
|
||
if (op == LVDS_WRITE):
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_WRITE):
|
||
pass
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif regaddr == ((ebmmu_base + i * 0xa) + 0x8):
|
||
if self.role.value == 2:
|
||
if (op == LVDS_WRITE):
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_WRITE):
|
||
pass
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif regaddr == ((ebmmu_base + i * 0xa) + 0x9):
|
||
if self.role.value == 2:
|
||
if (op == LVDS_WRITE):
|
||
if (self.reg[0x18] & 0x1) == 0x1:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == HOST_WRITE):
|
||
pass
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
else:
|
||
continue
|
||
|
||
return True
|
||
|
||
return False
|
||
|
||
def __sm_regs_wr(self, op, regaddr, val, *args):
|
||
#数据缓冲区描述寄存器组
|
||
'''
|
||
self.sm[f'mem{i}'] = MemroyQueueMgr(syncMemNum[i])
|
||
self.sm[f'mem{i}_ctrl'] = ArrayUintRef(self.reg, 0x300 + i * 4)
|
||
self.sm[f'mem{i}_item_num'] = ArrayUintRef(self.reg, 0x301 + i * 4)
|
||
self.sm[f'mem{i}_len'] = ArrayUintRef(self.reg, 0x302 + i * 4, 1)
|
||
'''
|
||
for i in range(8):
|
||
if regaddr == (0x300 + i * 0x4):
|
||
if (op == LVDS_WRITE):
|
||
pass
|
||
elif (op == HOST_WRITE):
|
||
self.sm[f'mem{i}_ctrl'].value = 0
|
||
#复位
|
||
self.sm[f'mem{i}'].reset()
|
||
self.sm[f'mem{i}_item_num'].value = 0
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif regaddr == (0x301 + i * 0x4):
|
||
if (op == LVDS_WRITE):
|
||
pass
|
||
elif (op == HOST_WRITE):
|
||
pass
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
elif (0x302 + i * 0x4) <= regaddr <= (0x303 + i * 0x4):
|
||
if (op == LVDS_WRITE) or (op == HOST_WRITE):
|
||
if self.sm[f'mem{i}_item_num'].value == 0:
|
||
self.reg[regaddr] = val & 0xff
|
||
elif (op == LVDS_READ) or (op == HOST_READ):
|
||
val[args[0]] = self.reg[regaddr]
|
||
else:
|
||
pass
|
||
else:
|
||
continue
|
||
|
||
return True
|
||
|
||
for i in range(8):
|
||
if self.role.value == 1:
|
||
if ((op == LVDS_WRITE)) or ((op == HOST_WRITE)):
|
||
if (0x800 + i * 0x800) <= regaddr < (0x1000 + i * 0x800):
|
||
self.sm[f'mem{i}'][regaddr - 0x800 - i * 0x800] = val
|
||
if (regaddr - 0x800 - i * 0x800 + 1) == self.sm[f'mem{i}_len'].value:
|
||
self.sm[f'mem{i}'].enq_data()
|
||
self.sm[f'mem{i}_item_num'].value = len(self.sm[f'mem{i}'])
|
||
return True
|
||
elif ((op == LVDS_READ)) or ((op == HOST_READ)):
|
||
if (0x800 + i * 0x800) <= regaddr < (0x1000 + i * 0x800):
|
||
val[args[0]] = self.sm[f'mem{i}'][regaddr - 0x800 - i * 0x800]
|
||
if (regaddr - 0x800 - i * 0x800 + 1) == self.sm[f'mem{i}_len'].value:
|
||
self.sm[f'mem{i}'].free_data()
|
||
self.sm[f'mem{i}_item_num'].value = len(self.sm[f'mem{i}'])
|
||
return True
|
||
else:
|
||
pass
|
||
elif self.role.value == 2:
|
||
if ((op == LVDS_WRITE)) or ((op == HOST_WRITE)):
|
||
if (0x800 + i * 0x800) <= regaddr < (0x1000 + i * 0x800):
|
||
self.sm[f'mem{i}'][regaddr - 0x800 - i * 0x800] = val
|
||
if (regaddr - 0x800 - i * 0x800 + 1) == self.sm[f'mem{i}_len'].value:
|
||
self.sm[f'mem{i}'].enq_data()
|
||
self.sm[f'mem{i}_item_num'].value = len(self.sm[f'mem{i}'])
|
||
return True
|
||
elif ((op == LVDS_READ)) or ((op == HOST_READ)):
|
||
if (0x800 + i * 0x800) <= regaddr < (0x1000 + i * 0x800):
|
||
val[args[0]] = self.sm[f'mem{i}'][regaddr - 0x800 - i * 0x800]
|
||
if (regaddr - 0x800 - i * 0x800 + 1) == self.sm[f'mem{i}_len'].value:
|
||
self.sm[f'mem{i}'].free_data()
|
||
self.sm[f'mem{i}_item_num'].value = len(self.sm[f'mem{i}'])
|
||
return True
|
||
else:
|
||
pass
|
||
else:
|
||
pass
|
||
|
||
return False
|
||
|
||
|
||
def __watch_dog_regs_wr(self, op, regaddr, val):
|
||
#看门狗
|
||
if 0x400 <= regaddr <= 0x403:
|
||
pass
|
||
elif 0x404 <= regaddr <= 0x407:
|
||
pass
|
||
elif 0x408 <= regaddr <= 0x40B:
|
||
pass
|
||
elif 0x40C <= regaddr <= 0x40F:
|
||
pass
|
||
|
||
elif 0x410 <= regaddr <= 0x413:
|
||
pass
|
||
elif 0x414 <= regaddr <= 0x417:
|
||
pass
|
||
elif 0x418 <= regaddr <= 0x40B:
|
||
pass
|
||
elif 0x41C <= regaddr <= 0x41F:
|
||
pass
|
||
|
||
elif 0x420 <= regaddr <= 0x423:
|
||
pass
|
||
elif 0x424 <= regaddr <= 0x427:
|
||
pass
|
||
elif 0x428 <= regaddr <= 0x42B:
|
||
pass
|
||
elif 0x42C <= regaddr <= 0x42F:
|
||
pass
|
||
|
||
elif 0x430 <= regaddr <= 0x433:
|
||
pass
|
||
elif 0x434 <= regaddr <= 0x437:
|
||
pass
|
||
elif 0x438 <= regaddr <= 0x43B:
|
||
pass
|
||
elif 0x43C <= regaddr <= 0x43F:
|
||
pass
|
||
|
||
elif 0x440 <= regaddr <= 0x443:
|
||
pass
|
||
elif 0x444 <= regaddr <= 0x447:
|
||
pass
|
||
elif 0x448 <= regaddr <= 0x44B:
|
||
pass
|
||
elif 0x44C <= regaddr <= 0x44F:
|
||
pass
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
def __event_regs_wr(self, op, regaddr, val):
|
||
if 0x500 <= regaddr <= 0x501:
|
||
pass
|
||
elif 0x502 <= regaddr <= 0x503:
|
||
pass
|
||
elif 0x504 <= regaddr <= 0x505:
|
||
pass
|
||
elif 0x506 <= regaddr <= 0x507:
|
||
pass
|
||
elif 0x508 <= regaddr <= 0x50F:
|
||
pass
|
||
elif 0x510 <= regaddr <= 0x517:
|
||
pass
|
||
elif 0x518 <= regaddr <= 0x51F:
|
||
pass
|
||
elif 0x520 <= regaddr <= 0x527:
|
||
pass
|
||
elif 0x528 <= regaddr <= 0x52F:
|
||
pass
|
||
elif 0x530 <= regaddr <= 0x537:
|
||
pass
|
||
elif 0x538 <= regaddr <= 0x53F:
|
||
pass
|
||
elif 0x540 <= regaddr <= 0x547:
|
||
pass
|
||
else:
|
||
return False
|
||
|
||
return True
|
||
|
||
|
||
if __name__ == '__main__':
|
||
m = device()
|
||
d0 = device()
|
||
d1 = device()
|
||
d2 = device()
|
||
d3 = device()
|
||
|
||
m.connect_next(d0)
|
||
d0.connect_next(d1)
|
||
d1.connect_next(d2)
|
||
d2.connect_next(d3)
|
||
|
||
m.hostwrite(0, [1, ])
|
||
d0.hostwrite(0, [2, ])
|
||
d1.hostwrite(0, [2, ])
|
||
d2.hostwrite(0, [2, ])
|
||
d3.hostwrite(0, [2, ])
|
||
|
||
data = m.hostread(0, 128)
|
||
print(data)
|
||
data = d0.hostread(0, 128)
|
||
print(data)
|
||
|
||
'''
|
||
m = device()
|
||
d0 = device()
|
||
d1 = device()
|
||
d2 = device()
|
||
d3 = device()
|
||
|
||
m.connect_next(d0)
|
||
d0.connect_next(d1)
|
||
d1.connect_next(d2)
|
||
d2.connect_next(d3)
|
||
|
||
m.hostwrite(0, [2,])
|
||
data = m.hostread(0, 128)
|
||
#print(data)
|
||
data = m.hostread(0x74, 4)
|
||
#print(data)
|
||
m.hostwrite(0x78, [0xff, 0xff, 0xff, 0xff])
|
||
data = m.hostread(0x74, 4)
|
||
#print(data)
|
||
|
||
|
||
sm0 = MemroyQueueMgr(4)
|
||
sm0[0] = 1
|
||
sm0[1] = 2
|
||
sm0[2] = 3
|
||
sm0[3] = 4
|
||
print(len(sm0))
|
||
sm0.enq_data()
|
||
print(len(sm0))
|
||
sm0[0] = 4
|
||
sm0[1] = 3
|
||
sm0[2] = 2
|
||
sm0[3] = 1
|
||
sm0.enq_data()
|
||
print(len(sm0))
|
||
|
||
#print(len(sm0.din))
|
||
#print(len(sm0.dout))
|
||
|
||
print(sm0[:4], len(sm0))
|
||
sm0.free_data()
|
||
print(sm0[:4], len(sm0))
|
||
sm0.free_data()
|
||
print(sm0[:4], len(sm0))
|
||
#sm0.clear(sm0.dout.data[0])
|
||
#print(sm0.dout.data[0][:4])
|
||
sm0.reset()
|
||
|
||
sm0[0] = 1
|
||
sm0[1] = 2
|
||
sm0[2] = 3
|
||
sm0[3] = 4
|
||
print(len(sm0))
|
||
sm0.enq_data()
|
||
print(len(sm0))
|
||
sm0[0] = 4
|
||
sm0[1] = 3
|
||
sm0[2] = 2
|
||
sm0[3] = 1
|
||
sm0.enq_data()
|
||
print(len(sm0))
|
||
|
||
#print(len(sm0.din))
|
||
#print(len(sm0.dout))
|
||
|
||
print(sm0[:4], len(sm0))
|
||
sm0.free_data()
|
||
print(sm0[:4], len(sm0))
|
||
sm0.free_data()
|
||
print(sm0[:4], len(sm0))
|
||
|
||
|
||
def testfunc(op):
|
||
if op == 0:
|
||
return False, 1, 2, 3
|
||
else:
|
||
return True, 3, 2, 1
|
||
|
||
def testfunc2(op, val, *args):
|
||
if isinstance(val, list):
|
||
val[args[0]] = op
|
||
return True
|
||
|
||
|
||
a = testfunc(0)
|
||
b = testfunc(1)
|
||
print(a)
|
||
print(b)
|
||
|
||
arr = [1, 2, 3]
|
||
|
||
print(arr)
|
||
testfunc2(100, arr, 0)
|
||
print(arr)
|
||
'''
|