mac/crc: Another cleanup pass.
This commit is contained in:
parent
aded91f8cb
commit
d9f7ae4882
|
@ -33,27 +33,29 @@ class LiteEthMACCRCEngine(LiteXModule):
|
||||||
The polynomial used for the CRC calculation, specified as an integer (e.g., 0x04C11DB7 for IEEE 802.3).
|
The polynomial used for the CRC calculation, specified as an integer (e.g., 0x04C11DB7 for IEEE 802.3).
|
||||||
"""
|
"""
|
||||||
def __init__(self, data_width, width, polynom):
|
def __init__(self, data_width, width, polynom):
|
||||||
self.data = Signal(data_width)
|
self.data = Signal(data_width) # Data (Input).
|
||||||
self.crc_prev = Signal(width)
|
self.crc_prev = Signal(width) # CRC Previous (Input).
|
||||||
self.crc_next = Signal(width)
|
self.crc_next = Signal(width) # CRC Next (Output).
|
||||||
|
|
||||||
# # #
|
# # #
|
||||||
|
|
||||||
# compute and optimize the parallel implementation of the CRC's LFSR
|
# Determine bits affected by the polynom.
|
||||||
taps = [x for x in range(width) if (1 << x) & polynom]
|
polynom_taps = [bit for bit in range(width) if (1 << bit) & polynom]
|
||||||
curval = [[("state", i)] for i in range(width)]
|
|
||||||
for i in range(data_width):
|
|
||||||
feedback = curval.pop() + [("din", i)]
|
|
||||||
for j in range(width-1):
|
|
||||||
if j+1 in taps:
|
|
||||||
curval[j] += feedback
|
|
||||||
curval[j] = self.optimize_xors(curval[j])
|
|
||||||
curval.insert(0, feedback)
|
|
||||||
|
|
||||||
# implement logic
|
# Prepare the list for CRC calculation through LFSR.
|
||||||
|
crc_bits = [[("state", i)] for i in range(width)]
|
||||||
|
for n in range(data_width):
|
||||||
|
feedback = crc_bits.pop(-1) + [("din", n)]
|
||||||
|
for pos in range(width - 1):
|
||||||
|
if (pos + 1) in polynom_taps:
|
||||||
|
crc_bits[pos] += feedback
|
||||||
|
crc_bits[pos] = self.optimize_xors(crc_bits[pos])
|
||||||
|
crc_bits.insert(0, feedback)
|
||||||
|
|
||||||
|
# Calculate the next CRC value based on XOR operations.
|
||||||
for i in range(width):
|
for i in range(width):
|
||||||
xors = []
|
xors = []
|
||||||
for t, n in curval[i]:
|
for t, n in crc_bits[i]:
|
||||||
if t == "state":
|
if t == "state":
|
||||||
xors += [self.crc_prev[n]]
|
xors += [self.crc_prev[n]]
|
||||||
elif t == "din":
|
elif t == "din":
|
||||||
|
|
Loading…
Reference in New Issue