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. References ---------- * ``_ * ``_ * ``_ * ``_