Initial commit of project!
This commit is contained in:
commit
62e13b6cb0
4 changed files with 138 additions and 0 deletions
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 A.M. Rowsell
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
22
Makefile
Normal file
22
Makefile
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
APP=main
|
||||||
|
AWK=awk
|
||||||
|
CC=gcc
|
||||||
|
CFLAGS=-std=gnu11 -O2
|
||||||
|
|
||||||
|
SRCS = $(wildcard *.c)
|
||||||
|
OBJS = $(SRCS:.c=.o)
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
all: clean $(APP) plot
|
||||||
|
|
||||||
|
$(APP): $(OBJS)
|
||||||
|
$(CC) $(LDFLAGS) $^ $(LIBS) -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(OBJS) $(APP) plot.png
|
||||||
|
|
||||||
|
plot: $(APP)
|
||||||
|
./$(APP) $(TAPS) | $(AWK) -v k=0 '{ print k " " $$1; k++ }' > 16bit.txt
|
||||||
|
gnuplot plot
|
||||||
|
xdg-open plot.png
|
74
main.c
Normal file
74
main.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
// x^16 + x^15 + x^13 + x^1 + 1 -- D4 LFSR
|
||||||
|
// 0, 7, 12, 14 works for 16-bits
|
||||||
|
// 1, 12, 14, 15 works for 16-bits
|
||||||
|
// 16,14,13,11
|
||||||
|
// 0, 12, 14, 15 works for 15-bits
|
||||||
|
// 31, 9, 7, 6, 3, 2
|
||||||
|
// 29, 28, 25, 24, 22, 0
|
||||||
|
// 0x8000019F
|
||||||
|
|
||||||
|
void createGnuplot(int tap1, int tap2, int tap3, int tap4) {
|
||||||
|
char buf[1] = " ";
|
||||||
|
FILE *template = fopen("plottemplate", "r");
|
||||||
|
FILE *plotout = fopen("plot", "w");
|
||||||
|
if(template == NULL || plotout == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while(1) {
|
||||||
|
*buf = fgetc(template);
|
||||||
|
if (*buf == EOF) {
|
||||||
|
fflush(plotout);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(*buf == '$') {
|
||||||
|
fprintf(plotout, "%d, %d, %d, %d", tap1, tap2, tap3, tap4);
|
||||||
|
} else {
|
||||||
|
fputc(*buf, plotout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(template);
|
||||||
|
fclose(plotout);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
uint16_t startState = 0x0005;
|
||||||
|
uint16_t lfsr = startState;
|
||||||
|
uint16_t bit;
|
||||||
|
uint32_t count = 0;
|
||||||
|
char *c;
|
||||||
|
int tap1, tap2, tap3, tap4;
|
||||||
|
|
||||||
|
|
||||||
|
if(argc == 5) {
|
||||||
|
tap1 = strtol(argv[1], NULL, 10);
|
||||||
|
tap2 = strtol(argv[2], NULL, 10);
|
||||||
|
tap3 = strtol(argv[3], NULL, 10);
|
||||||
|
tap4 = strtol(argv[4], NULL, 10);
|
||||||
|
} else {
|
||||||
|
tap1 = 15;
|
||||||
|
tap2 = 4;
|
||||||
|
tap3 = 2;
|
||||||
|
tap4 = 1;
|
||||||
|
}
|
||||||
|
//printf("Initial state: %0x\n", lfsr);
|
||||||
|
|
||||||
|
do {
|
||||||
|
bit = ((lfsr >> tap1) ^ (lfsr >> tap2) ^ (lfsr >> tap3) ^ (lfsr >> tap4));
|
||||||
|
lfsr = (lfsr >> 1) | (bit << 15);
|
||||||
|
count++;
|
||||||
|
//count % 100000000 == 0 ? printf("0x%08x\t%032b\n", lfsr, lfsr) : 0; // comment this line for speed check
|
||||||
|
printf("%d\n", lfsr);
|
||||||
|
// *c = scanf("%s");
|
||||||
|
} while(lfsr != startState && count < 70000); //while(lfsr != startState);
|
||||||
|
//printf("Final count: %u\n", count);
|
||||||
|
createGnuplot(tap1, tap2, tap3, tap4);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
21
plottemplate
Normal file
21
plottemplate
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
set border linewidth 5
|
||||||
|
|
||||||
|
set style line 101 lt 0 lc rgb "gray20" lw 0.5
|
||||||
|
set style line 102 lt 2 lc rgb "black" lw 1
|
||||||
|
|
||||||
|
set xlabel 'Sequence number'
|
||||||
|
set ylabel 'LFSR value'
|
||||||
|
|
||||||
|
set ytics 2500
|
||||||
|
set mytics 2
|
||||||
|
set xrange [0:65535]
|
||||||
|
set yrange [0:65535]
|
||||||
|
set xtics 2500 rotate by 60 right
|
||||||
|
set mxtics 2
|
||||||
|
set tics scale 1
|
||||||
|
|
||||||
|
set title "16-bit LFSR: Taps $"
|
||||||
|
|
||||||
|
set terminal png size 3840,2160 font 'Fira Code Nerd Font,30'
|
||||||
|
set output "plot.png"
|
||||||
|
plot "16bit.txt" using 1:2 notitle with points lc 14 pt 6 ps 0.5
|
Loading…
Add table
Add a link
Reference in a new issue