You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
3.0 KiB

def get_retimer_inv(self, route):
ocs_list = self.get_cmis()
assert len(ocs_list) == 8
retimer_inv_table = {
'oneta' : [
0b0010000000000000,
0b0000000000010000,
0b0101000011110000,
0b1010000011110000],
'onetb' : [
0b0010000000000000,
0b0000000000010000,
0b0101000011110000,
0b1010000011110000],
'onoc1' : [
0b1000000010000000,
0b1110000000100000,
0b1111000001110000,
0b0100000011000000],
'onoc2' : [
0b0000000000100000,
0b0000000000010000,
0b0101000011110000,
0b0111000000100000],
'onoc3' : [
0b0000000000000000,
0b0000000000110000,
0b1110000010010000,
0b1100000001000000],
'onoc4' : [
0b1000000010000000,
0b0011000011110000,
0b1101000001010000,
0b0100000011000000],
'onoc5' : [
0b1110000000110000,
0b1000000010010000,
0b1101000001110000,
0b0110000011000000],
'onoc6' : [
0b0011000011100000,
0b1000000010010000,
0b1101000001110000,
0b0100000011100000],
'onoc7' : [
0b0000000000000000,
0b0010000000010000,
0b0011000001000000,
0b1100000001000000]
}
retimer_inv = retimer_inv_table[route]
route_list = abc_ocs.ROUTE_TABLE[route] if 'onoc' in route else list(range(1, 9))
for ocs in ocs_list:
ocs_inv_flag = bin(ocs.read_mzm_direction())[2:].zfill(8)
inv_flag = ''
for i in range(0, 8):
inv_flag += ocs_inv_flag[route_list[i] - 1]
log.inf(f'inv: {ocs}: {ocs_inv_flag}, -> rtm: {inv_flag}')
if inv_flag[7] == '1':
mask_ = 1 << (ocs.index_)
retimer_inv[1] ^= mask_
if inv_flag[6] == '1':
mask_ = 1 << (ocs.index_)
retimer_inv[3] ^= mask_
if inv_flag[5] == '1':
mask_ = 1 << (ocs.index_ + 8)
retimer_inv[3] ^= mask_
if inv_flag[4] == '1':
mask_ = 1 << (ocs.index_ + 8)
retimer_inv[1] ^= mask_
if inv_flag[3] == '1':
mask_ = 1 << (ocs.index_)
retimer_inv[0] ^= mask_
if inv_flag[2] == '1':
mask_ = 1 << (ocs.index_)
retimer_inv[2] ^= mask_
if inv_flag[1] == '1':
mask_ = 1 << (ocs.index_ + 8)
retimer_inv[2] ^= mask_
if inv_flag[0] == '1':
mask_ = 1 << (ocs.index_ + 8)
retimer_inv[0] ^= mask_
return retimer_inv