]> rtime.felk.cvut.cz Git - fpga/lx-cpu1/lx-rocon.git/blob - hw/tb/convert_bin2bits.c
TUMBL GHDL simulation testbed prepared.
[fpga/lx-cpu1/lx-rocon.git] / hw / tb / convert_bin2bits.c
1 #include <stdint.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 int
7 fprintbin(FILE *stream, uint32_t num, unsigned dig)
8 {
9   uint32_t mask = 1 << (dig - 1);
10   for(; mask; mask >>= 1) {
11     if (fputc((num & mask)?'1':'0', stream) == EOF)
12       return -1;
13   }
14   return dig;
15 }
16
17 int main(int argc, char *argv[])
18 {
19   char *fin_fname = NULL;
20   FILE *fin;
21   int ret = 0;
22   int vector_bits      = 32;
23   size_t vector_bytes  = 0;
24   int vector_be        = 1;
25   int vector_be_ralign = 0;
26
27   if (argc >= 2)
28     fin_fname = argv[1];
29
30   if (!vector_bytes)
31     vector_bytes = (vector_bits + 7) / 8;
32
33   if (!vector_bits)
34     vector_bits = vector_bytes * 8;
35
36   if (fin_fname != NULL) {
37     fin = fopen(fin_fname, "rb");
38     if (fin == NULL) {
39       fprintf(stderr, "%s: cannot open input file %s\n", argv[0], fin_fname);
40       exit(1);
41     }
42   } else {
43     fin = stdin;
44   }
45
46   {
47     uint8_t buff[vector_bytes];
48     size_t read_res;
49     uint8_t *p;
50     uint8_t b;
51     size_t br;
52     size_t bn;
53
54     do {
55       read_res = fread(buff, 1, vector_bytes, fin);
56       if (read_res == 0)
57         break;
58       if (read_res == -1) {
59         fprintf(stderr, "%s: data read error\n", argv[0]);
60         ret = 1;
61         break;
62       }
63       if (read_res < vector_bytes) {
64         fprintf(stderr, "%s: partial read of last element\n", argv[0]);
65         ret = 1;
66         memset(buff + read_res, 0, vector_bytes - read_res);
67       }
68
69       p = buff + (vector_be? 0: vector_bytes - 1);
70       bn = (vector_be & !vector_be_ralign)? 8: vector_bits % 8;
71
72       for (br = vector_bits; br; br -= bn, bn = 8) {
73         if (bn > br)
74           bn = br;
75         b = *p;
76         if (vector_be) {
77           if (!vector_be_ralign)
78             b >>= (8 - bn);
79           p++;
80         } else {
81           p--;
82         }
83         if (fprintbin(stdout, b, bn) < 0) {
84           fprintf(stderr, "%s: output stream write error\n", argv[0]);
85           ret = 1;
86           break;
87         }
88       }
89
90       if (fputc('\n', stdout) == EOF) {
91         ret = -1;
92         break;
93       }
94     } while(1);
95   }
96
97   if (fin_fname != NULL)
98     fclose(fin);
99
100   return ret;
101 }