From 9e80cadfcc392f9df5d2d6944bba16cc5b07c8c8 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Mon, 16 Oct 2017 02:35:12 +0200 Subject: [PATCH] Add bitread PGM support Signed-off-by: Clifford Wolf Signed-off-by: Tim 'mithro' Ansell --- fuzzers/005-tilegrid/generate.sh | 2 +- fuzzers/010-lutinit/generate.sh | 2 +- gridinfo/runme.sh | 4 +- tools/bitread.cc | 75 +++++++++++++++++++++++++++++--- 4 files changed, 72 insertions(+), 11 deletions(-) diff --git a/fuzzers/005-tilegrid/generate.sh b/fuzzers/005-tilegrid/generate.sh index c837c1ae..46628e4e 100644 --- a/fuzzers/005-tilegrid/generate.sh +++ b/fuzzers/005-tilegrid/generate.sh @@ -11,7 +11,7 @@ cd $1 vivado -mode batch -source ../generate.tcl for x in design*.bit; do - ../../../tools/bitread -F $XRAY_ROI_FRAMES -o ${x}s -zy < $x + ../../../tools/bitread -F $XRAY_ROI_FRAMES -o ${x}s -zy $x done for x in design_*.bits; do diff --git a/fuzzers/010-lutinit/generate.sh b/fuzzers/010-lutinit/generate.sh index e90af8ab..db485182 100644 --- a/fuzzers/010-lutinit/generate.sh +++ b/fuzzers/010-lutinit/generate.sh @@ -13,7 +13,7 @@ echo '`define SEED 32'"'h$(echo $1 | md5sum | cut -c1-8)" > setseed.vh vivado -mode batch -source ../generate.tcl for i in 0 1 2; do - ../../../tools/bitread -F $XRAY_ROI_FRAMES -o design_$i.bits -zy < design_$i.bit + ../../../tools/bitread -F $XRAY_ROI_FRAMES -o design_$i.bits -zy design_$i.bit python3 ../generate.py $i done diff --git a/gridinfo/runme.sh b/gridinfo/runme.sh index fac99e4a..0193a1ca 100644 --- a/gridinfo/runme.sh +++ b/gridinfo/runme.sh @@ -59,8 +59,8 @@ vivado -nojournal -log design.log -mode batch -source design.tcl for f0 in logicframes_SLICE_*_0.bit; do f1=${f0%_0.bit}_1.bit - ../tools/bitread -xo ${f0%.bit}.asc < $f0 > /dev/null - ../tools/bitread -xo ${f1%.bit}.asc < $f1 > /dev/null + ../tools/bitread -xo ${f0%.bit}.asc $f0 > /dev/null + ../tools/bitread -xo ${f1%.bit}.asc $f1 > /dev/null f0=${f0%.bit}.asc f1=${f1%.bit}.asc n=${f0%_0.asc} diff --git a/tools/bitread.cc b/tools/bitread.cc index 4bfbb490..9b206874 100644 --- a/tools/bitread.cc +++ b/tools/bitread.cc @@ -13,6 +13,7 @@ bool mode_m = false; bool mode_x = false; bool mode_y = false; bool mode_z = false; +bool mode_p = false; bool chksum = false; char *outfile = nullptr; std::set frames; @@ -229,7 +230,7 @@ public: int main(int argc, char **argv) { int opt; - while ((opt = getopt(argc, argv, "crmxyzCf:F:o:")) != -1) + while ((opt = getopt(argc, argv, "crmxyzpCf:F:o:")) != -1) switch (opt) { case 'c': @@ -250,6 +251,9 @@ int main(int argc, char **argv) case 'z': mode_z = true; break; + case 'p': + mode_p = true; + break; case 'C': chksum = true; break; @@ -267,10 +271,10 @@ int main(int argc, char **argv) goto help; } - if (optind != argc) { + if (optind != argc && optind+1 != argc) { help: fprintf(stderr, "\n"); - fprintf(stderr, "Usage: %s [options] < bitfile.bit\n", argv[0]); + fprintf(stderr, "Usage: %s [options] [bitfile]\n", argv[0]); fprintf(stderr, "\n"); fprintf(stderr, " -c\n"); fprintf(stderr, " continuation mode. output '*' for repeating patterns\n"); @@ -290,6 +294,9 @@ help: fprintf(stderr, " -y\n"); fprintf(stderr, " use format 'bit_%%08x_%%02x_%%02x'\n"); fprintf(stderr, "\n"); + fprintf(stderr, " -p\n"); + fprintf(stderr, " output a binary netpgm image\n"); + fprintf(stderr, "\n"); fprintf(stderr, " -C\n"); fprintf(stderr, " do not ignore the checksum in each frame\n"); fprintf(stderr, "\n"); @@ -317,10 +324,24 @@ help: return 1; } - while (1) { - int c = getchar(); - if (c == EOF) break; - bitdata.push_back(c); + if (optind+1 == argc) { + FILE *f = fopen(argv[optind], "rb"); + if (f == nullptr) { + printf("Can't open input file '%s' for writing!\n", outfile); + return 1; + } + while (1) { + int c = fgetc(f); + if (c == EOF) break; + bitdata.push_back(c); + } + fclose(f); + } else { + while (1) { + int c = getchar(); + if (c == EOF) break; + bitdata.push_back(c); + } } printf("Bitstream size: %d bytes\n", int(bitdata.size())); @@ -511,6 +532,9 @@ help: if (outfile == nullptr) fprintf(f, "\n"); + std::vector> pgmdata; + std::vector pgmsep; + for (auto &it : configframes) { if (mode_z && it.second == zero_frame) @@ -533,7 +557,18 @@ help: return 1; } + if (mode_p) + { + if (fid.get_minor() == 0 && !pgmdata.empty()) + pgmsep.push_back(pgmdata.size()); + pgmdata.push_back(std::vector()); + + for (int i = 0; i < 101; i++) + for (int k = 0; k < 32; k++) + pgmdata.back().push_back((it.second.at(i) & (1 << k)) != 0); + } + else if (mode_x || mode_y) { for (int i = 0; i < 101; i++) @@ -560,6 +595,32 @@ help: } } + if (mode_p) + { + int width = pgmdata.size() + pgmsep.size(); + int height = 101*32+100; + fprintf(f, "P5 %d %d 15\n", width, height); + + for (int y = 0, bit = 0; y < height; y++, bit++) + { + if (bit % 32 == 0 && y) { + for (int x = 0; x < width; x++) + fputc(8, f); + y++; + } + + for (int x = 0, frame = 0, sep = 0; x < width; x++, frame++) + { + if (sep < int(pgmsep.size()) && frame == pgmsep.at(sep)) { + fputc(8, f); + x++, sep++; + } + + fputc(pgmdata.at(frame).at(bit) ? 15 : 0, f); + } + } + } + if (outfile != nullptr) fclose(f); }