Linear Feedback Shift Register Toolkit¶
lfsr_if (poly, init=1)
Linear Feedback Shift Register with internal feedback (Galois implementation).
Example (visualization):
poly = 0x0D (x**3+x**2+1)
init = 0x01
+----<-----+-------<-------+
| | |
+-----[0]-XOR-[0]-----[1]--+-->-- out
x**3 x**2 x**1 x**0
cycle state
0 001
1 110
2 011
3 111
4 101
5 100
6 010
Example (code):
>>> n = 3
>>> taps = max_len_lfsr_min_taps[n]
>>> poly = taps_to_poly(taps)
>>> prng = lfsr_if(poly)
>>> for i in range(10):
... print(i, next(prng))
0 1
1 6
2 3
3 7
4 5
5 4
6 2
7 1
8 6
9 3
Reference: http://www.eng.auburn.edu/~strouce/class/elec6250/LFSRs.pdf
lfsr_ef (poly, init=1)
Linear Feedback Shift Register with external feedback (Fibonacci implementation).
Implements LFSR counter for many use cases. For instance for certain polynomial and init, LSB of the output can be considered as pseudo-random sequence.
Example (visualization):
poly = 0x0D (x**3+x**2+1)
init = 0x01
+----<----XOR------<-------+
| | |
+-----[0]--+--[0]-----[1]--+-->-- out
x**3 x**2 x**1 x**0
cycle state
0 001
1 100
2 110
3 111
4 011
5 101
6 010
Example (code):
>>> n = 3
>>> taps = max_len_lfsr_min_taps[n]
>>> poly = taps_to_poly(taps)
>>> prng = lfsr_ef(poly)
>>> for i in range(10):
... print(i, next(prng))
0 1
1 4
2 6
3 7
4 3
5 5
6 2
7 1
8 4
9 6
Reference: http://www.eng.auburn.edu/~strouce/class/elec6250/LFSRs.pdf
taps_to_poly (taps, append0=True)
Converts vector of taps to corresponding polynomial.
Note that tap #0 defaults to 1, unles append0 is False.
Example:
Vector of taps [4,3,0] correspond to polynomial x**4+x**3+1 which is represented as 0x19.
measure_period (cntr)
Measures how many cycles it takes for the counter overflow.