Linear Feedback Shift Register Toolkit ====================================== **lfsr_if** `(poly, init=1)` Linear Feedback Shift Register with internal feedback. 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. 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 ---------- * ``_ * ``_ * ``_ * ``_