Skip to content

Commit cf2ebe9

Browse files
Fix RegBitField decode/encode (#242)
1 parent ef4f2c6 commit cf2ebe9

File tree

2 files changed

+12
-4
lines changed

2 files changed

+12
-4
lines changed

sonic_platform_base/sonic_xcvr/fields/xcvr_field.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,15 @@ def read_before_write(self):
9494
return True
9595

9696
def decode(self, raw_data, **decoded_deps):
97-
return bool((raw_data[0] >> self.bitpos) & 1)
97+
return bool((raw_data[0] >> self.bitpos % 8) & 1)
9898

9999
def encode(self, val, raw_state=None):
100100
assert not self.ro and raw_state is not None
101101
curr_state = raw_state[0]
102102
if val:
103-
curr_state |= (1 << self.bitpos)
103+
curr_state |= (1 << self.bitpos % 8)
104104
else:
105-
curr_state &= ~(1 << self.bitpos)
105+
curr_state &= ~(1 << self.bitpos % 8)
106106
return bytearray([curr_state])
107107

108108

@@ -249,7 +249,7 @@ def decode(self, raw_data, **decoded_deps):
249249
for field in self.fields:
250250
offset = field.get_offset()
251251
if not field.get_deps():
252-
result[field.name] = field.decode(raw_data[offset - start: offset + field.get_size() - start],
252+
result[field.name] = field.decode(raw_data[offset - start: offset + field.get_size() - start],
253253
**decoded_deps)
254254

255255
# Now decode any fields that have dependant fields in the same RegGroupField scope

tests/sonic_xcvr/test_xcvr_field.py

+8
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ def __init__(self, codes):
4747
self.NUM_REG = NumberRegField("NumReg", 100, format=">Q", size=8, ro=False)
4848
self.SCALE_NUM_REG = NumberRegField("ScaleNumReg", 120, format=">i", size=4, scale=100, ro=False)
4949
self.FIXED_NUM_REG = FixedNumberRegField("FixedNumReg", 130, 8, format=">f", size=4, ro=False)
50+
self.NUM_REG_WITH_BIT = NumberRegField("NumRegWithBit", 140,
51+
RegBitField("NumRegBit", bitpos=20, ro=False),
52+
format="<I", size=4, ro=False
53+
)
5054
self.STRING_REG = StringRegField("StringReg", 12, size=15)
5155
self.HEX_REG = HexRegField("HexReg", 30, size=3)
5256
self.REG_GROUP = RegGroupField("RegGroup",
@@ -168,6 +172,10 @@ def test_encode_decode(self):
168172
assert field.decode(field.encode(True, bytearray(b'\x00')))
169173
assert not field.decode(field.encode(False, bytearray(b'\x00')))
170174

175+
field = mem_map.get_field("NumRegBit")
176+
assert field.decode(field.encode(True, bytearray(b'\x00')))
177+
assert not field.decode(field.encode(False, bytearray(b'\xFF')))
178+
171179
class TestRegField(object):
172180
def test_offset(self):
173181
field = mem_map.get_field("Field0")

0 commit comments

Comments
 (0)