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.