xref: /XiangShan/tools/readmemh/split-readmemh.c (revision b543b09fe259d66bc6815a12b33d14da14834c9f)
1*b543b09fSZihao Yu #include <stdio.h>
2*b543b09fSZihao Yu #include <assert.h>
3*b543b09fSZihao Yu #include <stdint.h>
4*b543b09fSZihao Yu #include <string.h>
5*b543b09fSZihao Yu 
6*b543b09fSZihao Yu char outname [4][4096];
7*b543b09fSZihao Yu 
8*b543b09fSZihao Yu int main(int argc, char *argv[]) {
9*b543b09fSZihao Yu   assert(argc == 2);
10*b543b09fSZihao Yu 
11*b543b09fSZihao Yu   FILE *in = fopen(argv[1], "rb");
12*b543b09fSZihao Yu   assert(in != NULL);
13*b543b09fSZihao Yu 
14*b543b09fSZihao Yu   strcat(stpcpy(outname[0], argv[1]), "_0");
15*b543b09fSZihao Yu   strcat(stpcpy(outname[1], argv[1]), "_1");
16*b543b09fSZihao Yu   strcat(stpcpy(outname[2], argv[1]), "_2");
17*b543b09fSZihao Yu   strcat(stpcpy(outname[3], argv[1]), "_3");
18*b543b09fSZihao Yu 
19*b543b09fSZihao Yu   FILE *out[4];
20*b543b09fSZihao Yu   out[0] = fopen(outname[0], "w");
21*b543b09fSZihao Yu   out[1] = fopen(outname[1], "w");
22*b543b09fSZihao Yu   out[2] = fopen(outname[2], "w");
23*b543b09fSZihao Yu   out[3] = fopen(outname[3], "w");
24*b543b09fSZihao Yu   assert(out[0] != NULL && out[1] != NULL && out[2] != NULL && out[3] != NULL);
25*b543b09fSZihao Yu 
26*b543b09fSZihao Yu   char line[128];
27*b543b09fSZihao Yu   int idx = 0;
28*b543b09fSZihao Yu   while (fgets(line, 128, in) != NULL) {
29*b543b09fSZihao Yu     if (line[0] == '@') {
30*b543b09fSZihao Yu       uint32_t addr;
31*b543b09fSZihao Yu       sscanf(line + 1, "%x", &addr);
32*b543b09fSZihao Yu       assert(addr % 4 == 0);
33*b543b09fSZihao Yu       fprintf(out[0], "\n@%08x\n", addr / 4);
34*b543b09fSZihao Yu       fprintf(out[1], "\n@%08x\n", addr / 4);
35*b543b09fSZihao Yu       fprintf(out[2], "\n@%08x\n", addr / 4);
36*b543b09fSZihao Yu       fprintf(out[3], "\n@%08x\n", addr / 4);
37*b543b09fSZihao Yu       idx = 0;
38*b543b09fSZihao Yu     }
39*b543b09fSZihao Yu     else {
40*b543b09fSZihao Yu       // remove white spaces at the end
41*b543b09fSZihao Yu       char *p = line + strlen(line) - 1;
42*b543b09fSZihao Yu       while (p >= line && (*p == ' ' || *p == '\n' || *p == '\r')) p --;
43*b543b09fSZihao Yu       p[1] = '\0';
44*b543b09fSZihao Yu 
45*b543b09fSZihao Yu       p = line;
46*b543b09fSZihao Yu       char *byte;
47*b543b09fSZihao Yu       while ((byte = strsep(&p, " "))) {
48*b543b09fSZihao Yu         fprintf(out[idx % 4], "%s ", byte);
49*b543b09fSZihao Yu         idx ++;
50*b543b09fSZihao Yu       }
51*b543b09fSZihao Yu 
52*b543b09fSZihao Yu       if ((idx >> 2) % 16 == 0) {
53*b543b09fSZihao Yu         fprintf(out[0], "\n");
54*b543b09fSZihao Yu         fprintf(out[1], "\n");
55*b543b09fSZihao Yu         fprintf(out[2], "\n");
56*b543b09fSZihao Yu         fprintf(out[3], "\n");
57*b543b09fSZihao Yu       }
58*b543b09fSZihao Yu     }
59*b543b09fSZihao Yu   }
60*b543b09fSZihao Yu 
61*b543b09fSZihao Yu   fclose(in);
62*b543b09fSZihao Yu   fclose(out[0]);
63*b543b09fSZihao Yu   fclose(out[1]);
64*b543b09fSZihao Yu   fclose(out[2]);
65*b543b09fSZihao Yu   fclose(out[3]);
66*b543b09fSZihao Yu 
67*b543b09fSZihao Yu   return 0;
68*b543b09fSZihao Yu }
69