/* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * * This file is part of PortaPack. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ #include "lfsr_random.hpp" static void lfsr_iterate_internal(lfsr_word_t& v) { /* Generated with lfsr-generator: http://lfsr-generator.sourceforge.net ============================================= config : fibonacci length : 31 taps : (31, 18) shift-amounts : (12, 12, 8) shift-direction : left */ enum { length = 31, tap_0 = 31, tap_1 = 18, shift_amount_0 = 12, shift_amount_1 = 12, shift_amount_2 = 8 }; const lfsr_word_t zero = 0; v = (( v << shift_amount_0) | (( (v >> (tap_0 - shift_amount_0)) ^ (v >> (tap_1 - shift_amount_0))) & (~(~zero << shift_amount_0)))); v = (( v << shift_amount_1) | (( (v >> (tap_0 - shift_amount_1)) ^ (v >> (tap_1 - shift_amount_1))) & (~(~zero << shift_amount_1)))); v = (( v << shift_amount_2) | (( (v >> (tap_0 - shift_amount_2)) ^ (v >> (tap_1 - shift_amount_2))) & (~(~zero << shift_amount_2)))); } lfsr_word_t lfsr_iterate(lfsr_word_t v) { lfsr_iterate_internal(v); return v; } void lfsr_fill(lfsr_word_t& v, lfsr_word_t* buffer, size_t word_count) { while (word_count != 0) { lfsr_iterate_internal(v); *(buffer++) = v; word_count--; } } bool lfsr_compare(lfsr_word_t& v, const lfsr_word_t* buffer, size_t word_count) { while (word_count != 0) { lfsr_iterate_internal(v); if (*(buffer++) != v) { return false; } word_count--; } return true; }