source: soft/giet_vm/giet_xml/xml_parser.c @ 814

Last change on this file since 814 was 763, checked in by alain, 9 years ago

Introducing support for the MMAP vseg type in xml parser/driver.

  • Property svn:executable set to *
File size: 53.2 KB
RevLine 
[306]1//////////////////////////////////////////////////////////////////////////////////////
[258]2// File     : xml_parser.c
3// Date     : 14/04/2012
4// Author   : alain greiner
5// Copyright (c) UPMC-LIP6
6///////////////////////////////////////////////////////////////////////////////////////
7// This program translate a "map.xml" source file to a binary file "map.bin" that
8// can be directly loaded in memory and used by the GIET-VM operating system.
9//
10// This map.xml file contains :
11// 1) the multi-cluster/multi-processors hardware architecture description
12// 2) the various multi-threaded software applications
[709]13// 3) the mapping directives bor both the threads and the virtual segments.
[258]14// The corresponding C structures are defined in the "mapping_info.h" file.
15///////////////////////////////////////////////////////////////////////////////////////
16
17#include  <stdlib.h>
18#include  <fcntl.h>
19#include  <sys/types.h>
20#include  <sys/stat.h>
21#include  <unistd.h>
22#include  <stdio.h>
23#include  <string.h>
24#include  <assert.h>
25#include  <libxml/xmlreader.h>
26#include  <mapping_info.h>
27#include  <irq_handler.h>
[627]28#include  <giet_config.h>
[258]29
30#define MAX_CLUSTERS   1024
31#define MAX_PSEGS      4096
32#define MAX_VSPACES    1024
[709]33#define MAX_THREADS      4096
[258]34#define MAX_VSEGS      4096
35#define MAX_PROCS      1024
36#define MAX_IRQS       8192
37#define MAX_PERIPHS    8192
38
[511]39#define XML_PARSER_DEBUG  1
[258]40
41///////////////////////////////////////////////////////////////////////////////////
42//     global variables used to store and index the data structures
43///////////////////////////////////////////////////////////////////////////////////
44
45mapping_header_t *   header;
46mapping_cluster_t *  cluster[MAX_CLUSTERS];  // cluster array
47mapping_pseg_t *     pseg[MAX_PSEGS];        // pseg array
48mapping_vspace_t *   vspace[MAX_VSPACES];    // vspace array
49mapping_vseg_t *     vseg[MAX_VSEGS];        // vseg array
[709]50mapping_thread_t *   thread[MAX_THREADS];      // thread array
[258]51mapping_proc_t *     proc[MAX_PROCS];        // proc array
52mapping_irq_t *      irq[MAX_IRQS];          // irq array
53mapping_periph_t *   periph[MAX_PERIPHS];    // peripheral array
54
55// Index for the various arrays
56
57unsigned int cluster_index  = 0;
58unsigned int vspace_index = 0;
59unsigned int global_index = 0;
60unsigned int pseg_index = 0;       
61
62unsigned int proc_index = 0;
63unsigned int proc_loc_index = 0;
64
65unsigned int irq_index = 0;
66unsigned int irq_loc_index  = 0;
67
68unsigned int periph_index = 0;
69unsigned int periph_loc_index = 0;
70
71unsigned int vseg_index = 0;
72unsigned int vseg_loc_index = 0;
73
[709]74unsigned int thread_index = 0;
75unsigned int thread_loc_index = 0;
[258]76
77
78//////////////////////////////////////////////////
79unsigned int getIntValue( xmlTextReaderPtr reader, 
80                          const char * attributeName, 
81                          unsigned int * ok) 
82{
83    unsigned int value = 0;
84    unsigned int i;
85    char c;
86
87    char * string = (char *) xmlTextReaderGetAttribute(reader, 
88                                (const xmlChar *) attributeName);
89
90    if (string == NULL) 
91    {
92        // missing argument
93        *ok = 0;
94        return 0;
95    }
96    else 
97    {
98        if ((string[0] == '0') && ((string[1] == 'x') || (string[1] == 'X'))) 
99        {
100            // Hexa
101            for (i = 2 ; (string[i] != 0) && (i < 10) ; i++) 
102            {
103                c = string[i];
104                if      ((c >= '0') && (c <= '9')) { value = (value << 4) + string[i] - 48; }
105                else if ((c >= 'a') && (c <= 'f')) { value = (value << 4) + string[i] - 87; }
106                else if ((c >= 'A') && (c <= 'F')) { value = (value << 4) + string[i] - 55; }
107                else 
108                {
109                    *ok = 0;
110                    return 0;
111                }
112            }
113        }
114        else 
115        {
116            // Decimal
117            for (i = 0; (string[i] != 0) && (i < 9); i++) 
118            {
119                c = string[i];
120                if ((c >= '0') && (c <= '9')) value = (value * 10) + string[i] - 48;
121                else 
122                {
123                    *ok = 0;
124                    return 0;
125                }
126            }
127        }
128        *ok = 1;
129        return value; 
130    }
131} // end getIntValue()
132
133////////////////////////////////////////////////
134paddr_t getPaddrValue( xmlTextReaderPtr reader, 
135                       const char * attributeName, 
136                       unsigned int * ok) 
137{
138    paddr_t value = 0;
139    unsigned int i;
140    char c;
141
142    char * string = (char *) xmlTextReaderGetAttribute(reader, 
143                                (const xmlChar *) attributeName);
144
145    if (string == NULL) 
146    {
147        // missing argument
148        *ok = 0;
149        return 0;
150    }
151    else 
152    {
153        if ((string[0] == '0') && ((string[1] == 'x') || (string[1] == 'X'))) 
154        {
155            // Hexa
156            for (i = 2 ; (string[i] != 0) && (i < 18) ; i++) 
157            {
158                c = string[i];
159                if      ((c >= '0') && (c <= '9')) { value = (value << 4) + string[i] - 48; }
160                else if ((c >= 'a') && (c <= 'f')) { value = (value << 4) + string[i] - 87; }
161                else if ((c >= 'A') && (c <= 'F')) { value = (value << 4) + string[i] - 55; }
162                else 
163                {
164                    *ok = 0;
165                    return 0;
166                }
167            }
168        }
169        else 
170        {
171            // Decimal not supported for paddr_t
172            *ok = 0;
173            return 0;
174        }
175        *ok = 1;
176        return value; 
177    }
178} // end getPaddrValue()
179
180////////////////////////////////////////////////
181char * getStringValue( xmlTextReaderPtr reader, 
182                       const char * attributeName, 
183                       unsigned int * ok ) 
184{
185    char * string = (char *) xmlTextReaderGetAttribute(reader, 
186                               (const xmlChar *) attributeName);
187
188
189    if (string == NULL) 
190    {
191        // missing argument
192        *ok = 0;
193        return NULL;
194    }
195    else 
196    {
197        //we read only string smaller than 32 byte
198        if (strlen(string) > 32) 
199        {
200            printf("[XML ERROR] all strings must be less than 32 bytes\n");
201            exit(1);
202        }
203
204        *ok = 1;
205        return string;
206    }
207} // end getStringValue()
208
[263]209///////////////////////////////////////////////////////////////
210int getClusterId( unsigned int x, unsigned int y )
[258]211{
[263]212    // associative search of cluster index
213    unsigned int cluster_id;
214
215    for( cluster_id = 0 ; cluster_id < (header->x_size * header->y_size) ; cluster_id++ )
216    {
217        if( (cluster[cluster_id]->x == x) && (cluster[cluster_id]->y == y) )
218        {
219            return cluster_id;
220        }
221    }
222    return -1;
223}  // end getClusterId()
224
225///////////////////////////////////////////////////////////////
226int getPsegId(unsigned int x, unsigned int y, char * pseg_name) 
227{
228    int cluster_id = getClusterId( x, y );
229
230    if ( cluster_id == -1 ) return -1;
231
232    // associative search for pseg index
[258]233    unsigned int pseg_id;
234    unsigned int pseg_min = cluster[cluster_id]->pseg_offset;
235    unsigned int pseg_max = pseg_min + cluster[cluster_id]->psegs;
236
237    for (pseg_id = pseg_min; pseg_id < pseg_max; pseg_id++) 
238    {
239        if (strcmp(pseg[pseg_id]->name, pseg_name) == 0) 
240        {
241            return pseg_id;
242        }
243    }
244    return -1;
[263]245}  // end getPsegId()
[258]246
247///////////////////////////////////
248int getVspaceId(char * vspace_name) 
249{
250    unsigned int vspace_id;
251
252    for (vspace_id = 0; vspace_id < vspace_index; vspace_id++) 
253    {
254        if (strcmp(vspace[vspace_id]->name, vspace_name) == 0) 
255        {
256            return vspace_id;
257        }
258    }
259    return -1;
260}
261
[511]262///////////////////////////////////////////////////
263int getVsegId( unsigned int vspace_id, char *name )
[258]264{
[511]265    unsigned int vseg_id;
266    unsigned int vseg_min = vspace[vspace_id]->vseg_offset;
267    unsigned int vseg_max = vseg_min + vspace[vspace_id]->vsegs;
[258]268
[511]269    for (vseg_id = vseg_min ; vseg_id < vseg_max ; vseg_id++) 
[258]270    {
[511]271        if (strcmp(vseg[vseg_id]->name, name) == 0) return vseg_id;
[258]272    }
273    return -1;
274}
275
[295]276
[709]277////////////////////////////////////////
278void threadNode(xmlTextReaderPtr reader) 
[258]279{
280    unsigned int ok;
281    unsigned int value;
[263]282    unsigned int x,y;
[258]283    char * str;
284
285    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
286
[709]287    if (thread_index >= MAX_THREADS) 
[258]288    {
[709]289        printf("[XML ERROR] The number of threads is larger than %d\n", MAX_THREADS);
[258]290        exit(1);
291    }
292
293#if XML_PARSER_DEBUG
[709]294printf("   thread %d\n", thread_loc_index);
[258]295#endif
296
[709]297    thread[thread_index] = (mapping_thread_t *) malloc(sizeof(mapping_thread_t));
[258]298
299    ////////// get name attribute
300    str = getStringValue(reader, "name", &ok);
301    if (ok) 
302    {
303#if XML_PARSER_DEBUG
[263]304printf("      name      = %s\n", str);
[258]305#endif
[709]306        strncpy( thread[thread_index]->name, str, 31 );
[258]307    }
308    else 
309    {
[709]310        printf("[XML ERROR] illegal or missing <name> for thread %d in vspace %d\n", 
311                thread_loc_index, vspace_index);
[258]312        exit(1);
313    }
314
[709]315    ///////// get is_main attribute
316    value = getIntValue(reader, "is_main", &ok);
317    if ( ok ) 
318    {
[263]319#if XML_PARSER_DEBUG
[709]320printf("      is_main   = %d\n", value );
[263]321#endif
[709]322        thread[thread_index]->is_main = value;
323    }
324    else
325    {
326        printf("[XML ERROR] illegal or missing <is_main> for thread %d in vspace %d\n", 
327                thread_loc_index, vspace_index);
328    }
[267]329
330    ///////// get x coordinate
331    x = getIntValue(reader, "x", &ok);
332#if XML_PARSER_DEBUG
333printf("      x         = %d\n", x);
334#endif
[263]335    if ( !(ok && (x < header->x_size)) ) 
[258]336    {
[709]337        printf("[XML ERROR] illegal or missing < x > for thread %d in vspace %d)\n",
338                thread_loc_index, vspace_index);
[263]339        exit(1);
340    } 
341
342    ///////// get y coordinate
[267]343    y = getIntValue(reader, "y", &ok);
[258]344#if XML_PARSER_DEBUG
[263]345printf("      y         = %d\n", y);
[258]346#endif
[263]347    if ( !(ok && (y < header->y_size)) ) 
348    {
[709]349        printf("[XML ERROR] illegal or missing < y > for thread %d in vspace %d)\n",
350                thread_loc_index, vspace_index);
[263]351        exit(1);
[258]352    } 
[263]353
354    ///////// set clusterid attribute
355    int index = getClusterId( x, y );
356#if XML_PARSER_DEBUG
357printf("      clusterid = %d\n", index);
358#endif
359    if( index >= 0 )
[258]360    {
[709]361        thread[thread_index]->clusterid = index;
[263]362    }
363    else
364    {
[709]365        printf("[XML ERROR] <clusterid> not found for thread %d in vspace %d)\n",
366                thread_loc_index, vspace_index);
[258]367        exit(1);
368    }
369
[306]370    ////////// get p attribute
371    value = getIntValue(reader, "p", &ok);
[258]372    if (ok) 
373    {
374#if XML_PARSER_DEBUG
375printf("      proclocid = %x\n", value);
376#endif
[709]377        if (value >= cluster[thread[thread_index]->clusterid]->procs) 
[258]378        {
[709]379            printf("[XML ERROR] <proclocid> too large for thread %d in vspace %d\n",
380                    thread_loc_index, vspace_index);
[258]381            exit(1);
382        }
[709]383        thread[thread_index]->proclocid = value;
[258]384    } 
385    else 
386    {
[709]387        printf("[XML ERROR] illegal or missing < p > for thread %d in vspace %d)\n",
388                thread_loc_index, vspace_index);
[258]389        exit(1);
390    }
391
392    ////////// get stackname attribute
[511]393    char* stack_name = getStringValue(reader, "stackname" , &ok);
[258]394    if (ok) 
395    {
[511]396#if XML_PARSER_DEBUG
397printf("      stackname = %s\n", str);
398#endif
399        int index = getVsegId( vspace_index , stack_name );
[258]400        if (index >= 0) 
401        {
402#if XML_PARSER_DEBUG
[323]403printf("      stack_id  = %d\n", index);
[258]404#endif
[709]405            thread[thread_index]->stack_vseg_id = index;
[258]406        }
407        else 
408        {
[709]409            printf("[XML ERROR] illegal or missing <stackname> for thread %d in vspace %d)\n",
410                    thread_loc_index, vspace_index);
[258]411            exit(1);
412        }
413    } 
414    else 
415    {
[709]416        printf("[XML ERROR] illegal or missing <stackname> for thread %d in vspace %d)\n",
417                thread_loc_index, vspace_index);
[258]418        exit(1);
419    }
420
421    ////////// get heap attribute
[511]422    char* heap_name = getStringValue(reader, "heapname", &ok);
[258]423    if (ok) 
424    {
[511]425#if XML_PARSER_DEBUG
426printf("      heapname  = %s\n", str);
427#endif
428        int index = getVsegId( vspace_index , heap_name );
[258]429        if (index >= 0) 
430        {
431#if XML_PARSER_DEBUG
[323]432printf("      heap_id   = %d\n", index );
[258]433#endif
[709]434            thread[thread_index]->heap_vseg_id = index;
[258]435        }
436        else 
437        {
[709]438            printf("[XML ERROR] illegal or missing <heapname> for thread %d in vspace %d)\n", 
439                   thread_loc_index, vspace_index);
[258]440            exit(1);
441        }
442    } 
443    else 
444    {
[709]445        thread[thread_index]->heap_vseg_id = -1;
[258]446    }
447
448    ////////// get startid  attribute
449    value = getIntValue(reader, "startid", &ok);
450    if (ok) 
451    {
452#if XML_PARSER_DEBUG
[263]453printf("      startid   = %x\n", value);
[258]454#endif
[709]455        thread[thread_index]->startid = value;
[258]456    } 
457    else 
458    {
[709]459        printf("[XML ERROR] illegal or missing <startid> for thread %d in vspace %d\n", 
460                thread_loc_index, vspace_index);
[258]461        exit(1);
462    }
463
[709]464    thread_index++;
465    thread_loc_index++;
466} // end threadNode()
[258]467
468
469//////////////////////////////////////
470void vsegNode(xmlTextReaderPtr reader) 
471{
472    unsigned int ok;
473    unsigned int value;
[263]474    unsigned int x,y;
[258]475    char * str;
476
477    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
478
479    if (vseg_index >= MAX_VSEGS) 
480    {
481        printf("[XML ERROR] The number of vsegs is larger than %d\n", MAX_VSEGS);
482        exit(1);
483    }
484
485#if XML_PARSER_DEBUG
486printf("    vseg %d\n", vseg_loc_index);
487#endif
488
489    vseg[vseg_index] = (mapping_vseg_t *) malloc(sizeof(mapping_vseg_t));
490
491    ///////// set mapped attribute
492    vseg[vseg_index]->mapped = 0;
493
494    ///////// get name attribute
495    str = getStringValue(reader, "name", &ok);
496    if (ok) 
497    {
498#if XML_PARSER_DEBUG
[263]499printf("      name        = %s\n", str);
[258]500#endif
501        strncpy( vseg[vseg_index]->name, str, 31);
502    }
503    else 
504    {
505        printf("[XML ERROR] illegal or missing <name> attribute for vseg (%d,%d)\n", 
506                vspace_index, vseg_loc_index);
507        exit(1);
508    }
509
510    ////////// get ident attribute (optional : 0 if missing)
511    value = getIntValue(reader, "ident", &ok);
512    if (ok) 
513    {
514#if XML_PARSER_DEBUG
[263]515printf("      ident       = %d\n", value);
[258]516#endif
517        vseg[vseg_index]->ident = value;
518    } 
519    else 
520    {
521        vseg[vseg_index]->ident = 0;
522    }
523
[349]524    ////////// get local attribute (optional : 0 if missing)
525    value = getIntValue(reader, "local", &ok);
526    if (ok) 
527    {
528#if XML_PARSER_DEBUG
529printf("      local       = %d\n", value);
530#endif
531        vseg[vseg_index]->local = value;
532    } 
533    else 
534    {
535        vseg[vseg_index]->local = 0;
536    }
537
[511]538    ////////// get big attribute (optional : 0 if missing)
539    value = getIntValue(reader, "big", &ok);
540    if (ok) 
541    {
542#if XML_PARSER_DEBUG
543printf("      big         = %d\n", value);
544#endif
545        vseg[vseg_index]->big = value;
546    } 
547    else 
548    {
549        vseg[vseg_index]->big = 0;
550    }
551
[258]552    /////////// get vbase attribute
553    value = getIntValue(reader, "vbase", &ok);
554    if (ok) 
555    {
556#if XML_PARSER_DEBUG
[263]557printf("      vbase       = 0x%x\n", value);
[258]558#endif
559        vseg[vseg_index]->vbase = value;
560    }
561    else 
562    {
563        printf("[XML ERROR] illegal or missing <vbase> attribute for vseg (%d,%d)\n", 
564                vspace_index, vseg_loc_index);
565        exit(1);
566    }
567
[511]568    ////////// get length attribute
569    value = getIntValue(reader, "length", &ok);
570    if (ok)
571    {
572#if XML_PARSER_DEBUG
573printf("      length      = %x\n", value);
574#endif
575        vseg[vseg_index]->length = value;
576    }
577    else 
578    {
579        printf("[XML ERROR] illegal or missing <length> attribute for vseg (%d,%d)\n",
580                vspace_index, vseg_loc_index);
581        exit(1);
582    }
583
584    //////// get type attribute
585    str = getStringValue(reader, "type", &ok);
586
587#if XML_PARSER_DEBUG
588printf("      type        = %s\n", str);
589#endif
590
591    if      (ok && (strcmp(str, "ELF")    == 0)) vseg[vseg_index]->type = VSEG_TYPE_ELF;
592    else if (ok && (strcmp(str, "PERI")   == 0)) vseg[vseg_index]->type = VSEG_TYPE_PERI;
593    else if (ok && (strcmp(str, "BLOB")   == 0)) vseg[vseg_index]->type = VSEG_TYPE_BLOB;
594    else if (ok && (strcmp(str, "PTAB")   == 0)) vseg[vseg_index]->type = VSEG_TYPE_PTAB;
595    else if (ok && (strcmp(str, "BUFFER") == 0)) vseg[vseg_index]->type = VSEG_TYPE_BUFFER;
596    else if (ok && (strcmp(str, "SCHED")  == 0)) vseg[vseg_index]->type = VSEG_TYPE_SCHED;
597    else if (ok && (strcmp(str, "HEAP")   == 0)) vseg[vseg_index]->type = VSEG_TYPE_HEAP;
[763]598    else if (ok && (strcmp(str, "MMAP")   == 0)) vseg[vseg_index]->type = VSEG_TYPE_MMAP;
[511]599    else
600    {
601        printf("[XML ERROR] illegal or missing <type> attribute for vseg (%d,%d)\n",
602                vspace_index, vseg_loc_index);
603        exit(1);
604    }
605
[263]606    ////////// get x coordinate
607    x = getIntValue(reader, "x", &ok);
608#if XML_PARSER_DEBUG
609printf("      x           = %d\n", x);
610#endif
611    if ( !(ok && (x < header->x_size)) ) 
[258]612    {
[263]613        printf("[XML ERROR] illegal or missing < x > attribute for vseg %d\n", 
[258]614                vseg_loc_index);
615        exit(1);
616    }
[263]617
618    ////////// get y coordinate
619    y = getIntValue(reader, "y", &ok);
620#if XML_PARSER_DEBUG
621printf("      y           = %d\n", y);
622#endif
623    if ( !(ok && (y < header->y_size)) ) 
624    {
625        printf("[XML ERROR] illegal or missing < y > attribute for vseg %d\n", 
626                vseg_loc_index);
627        exit(1);
628    }
629
630    ///////// get psegname attribute
[258]631    str = getStringValue(reader, "psegname", &ok);
[263]632#if XML_PARSER_DEBUG
633printf("      psegname    = %s\n", str);
634#endif
[258]635    if (ok == 0) 
636    {
637        printf("[XML ERROR] illegal or missing <psegname> for vseg %d\n", 
638                vseg_loc_index);
639        exit(1);
640    }
641
642    /////////// set psegid field
[263]643    int psegid = getPsegId( x, y, str );
644#if XML_PARSER_DEBUG
645printf("      psegid      = %d\n", psegid);
646#endif
[306]647    if (psegid >= 0) 
[258]648    {
[263]649        vseg[vseg_index]->psegid = psegid;
[258]650    }
651    else 
652    {
[263]653        printf("[XML ERROR] pseg not found for vseg %d / x = %d / y = %d / psegname = %s\n", 
654                vseg_loc_index, x, y, str );
[258]655        exit(1);
656    } 
657
658    //////// get mode attribute
659    str = getStringValue(reader, "mode", &ok);
660#if XML_PARSER_DEBUG
[263]661printf("      mode        = %s\n", str);
[258]662#endif
663    if      (ok && (strcmp(str, "CXWU") == 0)) { vseg[vseg_index]->mode = 0xF; }
664    else if (ok && (strcmp(str, "CXW_") == 0)) { vseg[vseg_index]->mode = 0xE; }
665    else if (ok && (strcmp(str, "CX_U") == 0)) { vseg[vseg_index]->mode = 0xD; }
666    else if (ok && (strcmp(str, "CX__") == 0)) { vseg[vseg_index]->mode = 0xC; }
667    else if (ok && (strcmp(str, "C_WU") == 0)) { vseg[vseg_index]->mode = 0xB; }
668    else if (ok && (strcmp(str, "C_W_") == 0)) { vseg[vseg_index]->mode = 0xA; }
669    else if (ok && (strcmp(str, "C__U") == 0)) { vseg[vseg_index]->mode = 0x9; }
670    else if (ok && (strcmp(str, "C___") == 0)) { vseg[vseg_index]->mode = 0x8; }
671    else if (ok && (strcmp(str, "_XWU") == 0)) { vseg[vseg_index]->mode = 0x7; }
672    else if (ok && (strcmp(str, "_XW_") == 0)) { vseg[vseg_index]->mode = 0x6; }
673    else if (ok && (strcmp(str, "_X_U") == 0)) { vseg[vseg_index]->mode = 0x5; }
674    else if (ok && (strcmp(str, "_X__") == 0)) { vseg[vseg_index]->mode = 0x4; }
675    else if (ok && (strcmp(str, "__WU") == 0)) { vseg[vseg_index]->mode = 0x3; }
676    else if (ok && (strcmp(str, "__W_") == 0)) { vseg[vseg_index]->mode = 0x2; }
677    else if (ok && (strcmp(str, "___U") == 0)) { vseg[vseg_index]->mode = 0x1; }
678    else if (ok && (strcmp(str, "____") == 0)) { vseg[vseg_index]->mode = 0x0; }
679    else {
680        printf("[XML ERROR] illegal or missing <mode> attribute for vseg (%d,%d)\n", 
681                vspace_index, vseg_loc_index);
682        exit(1);
683    }
684
[511]685    ////////// get binpath attribute (optional : "" if missing)
686    str = getStringValue(reader, "binpath", &ok);
687    if (ok)
[258]688    {
[511]689#if XML_PARSER_DEBUG
690printf("      binpath = %s\n", str);
691#endif
692        strncpy(vseg[vseg_index]->binpath, str, 63);
693    }
694    else
695    {
696        vseg[vseg_index]->binpath[0] = 0;
697    }
[258]698
[511]699    vseg_index++;
700    vseg_loc_index++;
[258]701} // end vsegNode()
702
703////////////////////////////////////////
704void vspaceNode(xmlTextReaderPtr reader) 
705{
706    unsigned int ok;
707
[709]708    vseg_loc_index   = 0;
709    thread_loc_index = 0;
[258]710
711    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
712
713    vspace[vspace_index] = (mapping_vspace_t *) malloc(sizeof(mapping_vspace_t));
[295]714    header->vspaces      = header->vspaces + 1;
[258]715
716    ////////// get name attribute
[511]717    char* vspace_name = getStringValue(reader, "name", &ok);
718    if (ok) 
719    {
[258]720#if XML_PARSER_DEBUG
[511]721printf("\n  vspace = %s\n", vspace_name );
[258]722#endif
[511]723        strncpy( vspace[vspace_index]->name, vspace_name , 31 );
[258]724    }
725    else 
726    {
727        printf("[XML ERROR] illegal or missing <name> attribute for vspace %d\n", 
728                vspace_index);
729        exit(1);
730    }
731
[645]732    ////////// get active attribute (optional / default is 0)
733    unsigned int value = getIntValue(reader, "active", &ok);
734    if (ok) vspace[vspace_index]->active = value;
735    else    vspace[vspace_index]->active = 0;
736   
[709]737    ////////// set vseg_offset and thread_offset attributes
[258]738    vspace[vspace_index]->vseg_offset = vseg_index;
[709]739    vspace[vspace_index]->thread_offset = thread_index;
[258]740
[709]741    ////////// initialise vsegs and threads attributes
[511]742    vspace[vspace_index]->vsegs = 0;
[709]743    vspace[vspace_index]->threads = 0;
[258]744
745    ////////// get startname attribute
[511]746    char* start_name = getStringValue(reader, "startname", &ok);
747    if (ok == 0) 
[323]748    {
[258]749        printf("[XML ERROR] illegal or missing <startname> attribute for vspace %s\n", 
750                vspace[vspace_index]->name);
751        exit(1);
752    }
753
754    int status = xmlTextReaderRead(reader);
[295]755    while (status == 1) 
756    {
[258]757        const char * tag = (const char *) xmlTextReaderConstName(reader);
758
[263]759        if (strcmp(tag, "vseg") == 0) 
760        {
[258]761            vsegNode(reader);
[511]762            vspace[vspace_index]->vsegs += 1;
[258]763        }
[709]764        else if (strcmp(tag, "thread") == 0) 
[263]765        {
[709]766            threadNode(reader);
767            vspace[vspace_index]->threads += 1;
[258]768        }
769        else if (strcmp(tag, "#text")    == 0) { }
770        else if (strcmp(tag, "#comment") == 0) { }
[295]771        else if (strcmp(tag, "vspace")   == 0) 
772        {
[511]773            // get index of the vseg containing the start vector
774            int index = getVsegId( vspace_index, start_name );
[258]775            if (index == -1) 
776            {
[511]777                printf("[XML ERROR] vseg containing start vector not found in vspace %s\n",
[258]778                        vspace[vspace_index]->name);
779                exit(1);
780            }
781            else 
782            {
[511]783                vspace[vspace_index]->start_vseg_id = index;
784            }
785
[258]786#if XML_PARSER_DEBUG
[709]787printf("      vsegs         = %d\n", vspace[vspace_index]->vsegs );
788printf("      threads       = %d\n", vspace[vspace_index]->threads );
789printf("      vseg_offset   = %d\n", vspace[vspace_index]->vseg_offset );
790printf("      thread_offset = %d\n", vspace[vspace_index]->thread_offset );
791printf("      start_id      = %d\n", vspace[vspace_index]->start_vseg_id );
792printf("      active        = %x\n", vspace[vspace_index]->active );
[511]793printf("  end vspace %d\n\n", vspace_index);
[258]794#endif
795            vspace_index++;
796            return;
797        }
798        else 
799        {
800            printf("[XML ERROR] Unknown tag %s", tag);
801            exit(1);
802        }
803        status = xmlTextReaderRead(reader);
804    }
805} // end vspaceNode()
806
[295]807/////////////////////////////////////
808void irqNode(xmlTextReaderPtr reader) 
809{
810    unsigned int ok;
811    unsigned int value;
812    char * str;
813
814    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
815
816    if (irq_index >= MAX_IRQS) 
817    {
818        printf("[XML ERROR] The number of irqs is larger than %d\n", MAX_IRQS);
819    }
820
821#if XML_PARSER_DEBUG
822printf("      irq %d\n", irq_loc_index);
823#endif
824
825    irq[irq_index] = (mapping_irq_t *) malloc(sizeof(mapping_irq_t));
826
[306]827    ///////// get srcid attribute
828    value = getIntValue(reader, "srcid", &ok);
[295]829    if (ok) 
830    {
831#if XML_PARSER_DEBUG
[306]832printf("        srcid   = %d\n", value);
[295]833#endif
[306]834        irq[irq_index]->srcid = value;
835        if (value >= 32) 
[295]836        {
[306]837            printf("[XML ERROR] IRQ <srcid> too large for periph %d in cluster %d\n",
[295]838                    cluster_index, periph_loc_index);
839            exit(1);
840        }
841    }
842    else 
843    {
[306]844        printf("[XML ERROR] missing IRQ <srcid> for periph %d in cluster %d\n",
[295]845                cluster_index, periph_loc_index);
846        exit(1);
847    }
848
[323]849    ///////// get srctype attribute
850    str = getStringValue(reader, "srctype", &ok);
851    if (ok) 
[295]852    {
853#if XML_PARSER_DEBUG
[306]854printf("        srctype = %s\n", str);
[295]855#endif
[323]856        if      ( strcmp(str, "HWI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_HWI;
857        else if ( strcmp(str, "WTI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_WTI;
858        else if ( strcmp(str, "PTI") == 0 ) irq[irq_index]->srctype = IRQ_TYPE_PTI;
859        else   
[295]860        {
[323]861            printf("[XML ERROR] illegal IRQ <srctype> for periph %d in cluster %d\n",
[306]862                   cluster_index, periph_loc_index);
[295]863            exit(1);
864        }
865    }
[323]866    else 
867    {
868        printf("[XML ERROR] missing IRQ <srctype> for periph %d in cluster %d\n",
869               cluster_index, periph_loc_index);
870        exit(1);
871    }
[295]872
[323]873    ///////// get isr attribute
874    str = getStringValue(reader, "isr", &ok);
875    if (ok) 
[295]876    {
877#if XML_PARSER_DEBUG
878printf("        isr     = %s\n", str);
879#endif
[531]880        if      (strcmp(str, "ISR_DEFAULT") == 0)  irq[irq_index]->isr = ISR_DEFAULT;
881        else if (strcmp(str, "ISR_TICK"   ) == 0)  irq[irq_index]->isr = ISR_TICK;
[323]882        else if (strcmp(str, "ISR_TTY_RX" ) == 0)  irq[irq_index]->isr = ISR_TTY_RX;
883        else if (strcmp(str, "ISR_TTY_TX" ) == 0)  irq[irq_index]->isr = ISR_TTY_TX;
[531]884        else if (strcmp(str, "ISR_BDV"    ) == 0)  irq[irq_index]->isr = ISR_BDV;
[323]885        else if (strcmp(str, "ISR_TIMER"  ) == 0)  irq[irq_index]->isr = ISR_TIMER;
886        else if (strcmp(str, "ISR_WAKUP"  ) == 0)  irq[irq_index]->isr = ISR_WAKUP;
887        else if (strcmp(str, "ISR_NIC_RX" ) == 0)  irq[irq_index]->isr = ISR_NIC_RX;
888        else if (strcmp(str, "ISR_NIC_TX" ) == 0)  irq[irq_index]->isr = ISR_NIC_TX;
[531]889        else if (strcmp(str, "ISR_CMA"    ) == 0)  irq[irq_index]->isr = ISR_CMA;
[323]890        else if (strcmp(str, "ISR_MMC"    ) == 0)  irq[irq_index]->isr = ISR_MMC;
891        else if (strcmp(str, "ISR_DMA"    ) == 0)  irq[irq_index]->isr = ISR_DMA;
[548]892        else if (strcmp(str, "ISR_SDC"    ) == 0)  irq[irq_index]->isr = ISR_SDC;
[531]893        else if (strcmp(str, "ISR_MWR"    ) == 0)  irq[irq_index]->isr = ISR_MWR;
894        else if (strcmp(str, "ISR_HBA"    ) == 0)  irq[irq_index]->isr = ISR_HBA;
[295]895        else 
896        {
[323]897            printf("[XML ERROR] illegal IRQ <isr> for periph %d in cluster %d\n",
898                   periph_loc_index, cluster_index );
[295]899            exit(1);
900        }
[323]901    } 
902    else 
903    {
904        printf("[XML ERROR] missing IRQ <isr> for periph %d in cluster %d\n",
905                cluster_index, periph_loc_index);
906        exit(1);
[295]907    }
908
909    ///////// get channel attribute (optionnal : 0 if missing)
910    value = getIntValue(reader, "channel", &ok);
911    if (ok) 
912    {
913#if XML_PARSER_DEBUG
914printf("        channel = %d\n", value);
915#endif
916        irq[irq_index]->channel = value;
917    }
918    else 
919    {
920        irq[irq_index]->channel = 0;
921    }
922
923    irq_index++;
924    irq_loc_index++;
925
926} // end irqNode
927
928
[258]929////////////////////////////////////////
930void periphNode(xmlTextReaderPtr reader) 
931{
932    char * str;
933    unsigned int value;
934    unsigned int ok;
935
[295]936    irq_loc_index = 0;
937
[258]938    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
939
940    if (periph_index >= MAX_PERIPHS) 
941    {
942        printf("[XML ERROR] The number of periphs is larger than %d\n", MAX_PERIPHS);
943        exit(1);
944    }
945
946#if XML_PARSER_DEBUG
[295]947printf("\n    periph %d\n", periph_index);
[258]948#endif
949
950    periph[periph_index] = (mapping_periph_t *) malloc(sizeof(mapping_periph_t));
951
952    ///////// get channels attribute (optionnal : 1 if missing)
953    value = getIntValue(reader, "channels", &ok);
954    if (ok) 
955    {
956#if XML_PARSER_DEBUG
[295]957printf("      channels    = %d\n", value);
[258]958#endif
959        periph[periph_index]->channels = value;
960    }
961    else 
962    {
963        periph[periph_index]->channels = 1;
964    }
965
[522]966    ///////// get arg0 attribute (optionnal : undefined if missing)
967    value = getIntValue(reader, "arg0", &ok);
[323]968    if (ok) 
969    {
970#if XML_PARSER_DEBUG
[522]971printf("      arg0        = %d\n", value);
[323]972#endif
[522]973        periph[periph_index]->arg0 = value;
[323]974    }
[522]975
976    ///////// get arg1 attribute (optionnal : undefined if missing)
977    value = getIntValue(reader, "arg1", &ok);
978    if (ok) 
[323]979    {
[522]980#if XML_PARSER_DEBUG
981printf("      arg1        = %d\n", value);
982#endif
983        periph[periph_index]->arg1 = value;
[323]984    }
985
[522]986    ///////// get arg2 attribute (optionnal : undefined if missing)
987    value = getIntValue(reader, "arg2", &ok);
988    if (ok) 
989    {
990#if XML_PARSER_DEBUG
991printf("      arg2        = %d\n", value);
992#endif
993        periph[periph_index]->arg2 = value;
994    }
995
996    ///////// get arg3 attribute (optionnal : undefined if missing)
997    value = getIntValue(reader, "arg3", &ok);
998    if (ok) 
999    {
1000#if XML_PARSER_DEBUG
1001printf("      arg3        = %d\n", value);
1002#endif
1003        periph[periph_index]->arg3 = value;
1004    }
1005
[258]1006    /////////// get psegname attribute
1007    str = getStringValue(reader, "psegname", &ok);
1008    if (ok == 0) 
1009    {
[627]1010        printf("[XML ERROR] illegal or missing <psegname> for periph %d in cluster %d\n", 
1011                periph_index, cluster_index);
[258]1012        exit(1);
1013    }
1014
1015    /////////// set psegid attribute
[263]1016    int index = getPsegId( cluster[cluster_index]->x, cluster[cluster_index]->y, str);
[258]1017    if (index >= 0) 
1018    {
1019#if XML_PARSER_DEBUG
[295]1020printf("      clusterid   = %d\n", cluster_index);
1021printf("      psegname    = %s\n", str);
1022printf("      psegid      = %d\n", index);
[258]1023#endif
1024        periph[periph_index]->psegid = index;
1025    }
1026    else 
1027    {
1028        printf("[XML ERROR] pseg not found for periph %d / clusterid = %d / psegname = %s\n", 
1029                periph_loc_index, cluster_index, str );
1030        exit(1);
1031    } 
1032
1033    /////////// get type attribute
1034    str = getStringValue(reader, "type", &ok);
1035    if (ok) 
1036    {
1037#if XML_PARSER_DEBUG
[295]1038printf("      type        = %s\n", str);
[258]1039#endif
[511]1040        if      (strcmp(str, "CMA" ) == 0) periph[periph_index]->type = PERIPH_TYPE_CMA;
[522]1041        else if (strcmp(str, "DMA" ) == 0) periph[periph_index]->type = PERIPH_TYPE_DMA;
[511]1042        else if (strcmp(str, "FBF" ) == 0) periph[periph_index]->type = PERIPH_TYPE_FBF;
1043        else if (strcmp(str, "IOB" ) == 0) periph[periph_index]->type = PERIPH_TYPE_IOB;
1044        else if (strcmp(str, "IOC" ) == 0) periph[periph_index]->type = PERIPH_TYPE_IOC;
[522]1045        else if (strcmp(str, "MMC" ) == 0) periph[periph_index]->type = PERIPH_TYPE_MMC;
1046        else if (strcmp(str, "MWR" ) == 0) periph[periph_index]->type = PERIPH_TYPE_MWR;
[511]1047        else if (strcmp(str, "NIC" ) == 0) periph[periph_index]->type = PERIPH_TYPE_NIC;
1048        else if (strcmp(str, "ROM" ) == 0) periph[periph_index]->type = PERIPH_TYPE_ROM;
1049        else if (strcmp(str, "SIM" ) == 0) periph[periph_index]->type = PERIPH_TYPE_SIM;
[522]1050        else if (strcmp(str, "SIM" ) == 0) periph[periph_index]->type = PERIPH_TYPE_TIM;
[511]1051        else if (strcmp(str, "TTY" ) == 0) periph[periph_index]->type = PERIPH_TYPE_TTY;
[522]1052        else if (strcmp(str, "XCU" ) == 0) periph[periph_index]->type = PERIPH_TYPE_XCU;
[511]1053        else if (strcmp(str, "PIC" ) == 0) periph[periph_index]->type = PERIPH_TYPE_PIC;
1054        else if (strcmp(str, "DROM") == 0) periph[periph_index]->type = PERIPH_TYPE_DROM;
[491]1055        else
1056        {
[295]1057            printf("[XML ERROR] illegal peripheral type: %s in cluster %d\n",
1058                    str, cluster_index);
[258]1059            exit(1);
1060        }
[511]1061    }
[258]1062
[511]1063    ////////// get subtype if IOC
1064    if (periph[periph_index]->type == PERIPH_TYPE_IOC )
1065    {
1066        char* subtype = getStringValue(reader, "subtype", &ok);
1067        if (ok)
[258]1068        {
[511]1069#if XML_PARSER_DEBUG
1070printf("      subtype     = %s\n", str);
1071#endif
1072            if      (strcmp(subtype, "BDV") == 0) 
[522]1073            periph[periph_index]->subtype = IOC_SUBTYPE_BDV;
[511]1074            else if (strcmp(subtype, "HBA") == 0) 
[522]1075            periph[periph_index]->subtype = IOC_SUBTYPE_HBA;
[548]1076            else if (strcmp(subtype, "SDC") == 0) 
1077            periph[periph_index]->subtype = IOC_SUBTYPE_SDC;
[567]1078            else if (strcmp(subtype, "SPI") == 0) 
1079            periph[periph_index]->subtype = IOC_SUBTYPE_SPI;
[511]1080        }
1081        else
1082        {
1083            printf("[XML ERROR] illegal subtype for IOC peripheral\n");
[258]1084            exit(1);
1085        }
1086    }
[511]1087    else
[258]1088    {
[511]1089        periph[periph_index]->subtype = 0XFFFFFFFF;
[258]1090    }
1091
[522]1092    ////////// get subtype if MWR
1093    if (periph[periph_index]->type == PERIPH_TYPE_MWR )
1094    {
1095        char* subtype = getStringValue(reader, "subtype", &ok);
1096        if (ok)
1097        {
1098#if XML_PARSER_DEBUG
1099printf("      subtype     = %s\n", str);
1100#endif
1101            if      (strcmp(subtype, "GCD") == 0) 
1102            periph[periph_index]->subtype = MWR_SUBTYPE_GCD;
1103            else if (strcmp(subtype, "DCT") == 0) 
1104            periph[periph_index]->subtype = MWR_SUBTYPE_DCT;
[559]1105            else if (strcmp(subtype, "CPY") == 0) 
1106            periph[periph_index]->subtype = MWR_SUBTYPE_CPY;
[522]1107        }
1108        else
1109        {
1110            printf("[XML ERROR] illegal subtype for MWR peripheral\n");
1111            exit(1);
1112        }
1113    }
1114    else
1115    {
1116        periph[periph_index]->subtype = 0XFFFFFFFF;
1117    }
1118
[295]1119    ////////////// set irq_offset attribute
1120    periph[periph_index]->irq_offset = irq_index;
[258]1121
[295]1122    ///////////// get IRQs
1123    int status = xmlTextReaderRead(reader);
1124    while (status == 1) 
1125    {
1126        const char * tag = (const char *) xmlTextReaderConstName(reader);
1127
1128        if (strcmp(tag, "irq") == 0) 
1129        {
[472]1130            if ( (periph[periph_index]->type != PERIPH_TYPE_XCU) &&
[295]1131                 (periph[periph_index]->type != PERIPH_TYPE_PIC) )
1132            {
1133                printf("[XML ERROR] periph %d in cluster(%d,%d) "
[472]1134                       " only XCU and PIC can contain IRQs",
[295]1135                periph_loc_index, cluster[cluster_index]->x, cluster[cluster_index]->y);
1136                exit(1);
1137            }
1138            else
1139            {
1140                  irqNode(reader);
1141            }
1142        }
1143        else if (strcmp(tag, "#text")    == 0) { }
1144        else if (strcmp(tag, "#comment") == 0) { }
1145        else if (strcmp(tag, "periph")   == 0) 
1146        {
1147            periph[periph_index]->irqs = irq_loc_index;
1148            cluster[cluster_index]->periphs++;
1149            periph_loc_index++;
1150            periph_index++;
1151
1152#if XML_PARSER_DEBUG
1153printf("      irqs        = %d\n", irq_loc_index);
1154printf("      irq_offset  = %d\n", irq_index);
1155#endif
1156            return;
1157        }
1158        else 
1159        {
1160            printf("[XML ERROR] Unknown tag %s", tag);
1161            exit(1);
1162        }
1163        status = xmlTextReaderRead(reader);
1164    }
[258]1165} // end periphNode
1166
1167//////////////////////////////////////
1168void procNode(xmlTextReaderPtr reader) 
1169{
1170    unsigned int ok;
1171    unsigned int value;
1172
1173    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
1174
1175    if (proc_index >= MAX_PROCS) 
1176    {
1177        printf("[XML ERROR] The number of procs is larger than %d\n", MAX_PROCS);
1178        exit(1);
1179    }
1180
1181#if XML_PARSER_DEBUG
[295]1182printf("\n    proc %d\n", proc_index);
[258]1183#endif
1184
1185    proc[proc_index] = (mapping_proc_t *) malloc(sizeof(mapping_proc_t));
1186
1187    /////////// get index attribute (optional)
1188    value = getIntValue(reader, "index", &ok);
1189    if (ok && (value != proc_loc_index)) 
1190    {
[306]1191        printf("[XML ERROR] wrong local proc index / expected value is %d", 
[258]1192                proc_loc_index);
1193        exit(1);
1194    }
[295]1195    proc[proc_index]->index = proc_loc_index;
[258]1196
[295]1197    cluster[cluster_index]->procs++;
1198    proc_loc_index++;
1199    proc_index++;
[258]1200} // end procNode()
1201
1202
1203//////////////////////////////////////
1204void psegNode(xmlTextReaderPtr reader) 
1205{
1206    unsigned int ok;
1207    paddr_t      ll_value;
1208    char * str;
1209
1210    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
1211
1212    if (pseg_index >= MAX_PSEGS) 
1213    {
1214        printf("[XML ERROR] The number of psegs is larger than %d\n", MAX_PSEGS);
1215        exit(1);
1216    }
1217
1218#if XML_PARSER_DEBUG
[295]1219printf("    pseg %d\n", pseg_index);
[258]1220#endif
1221
1222    pseg[pseg_index] = (mapping_pseg_t *) malloc(sizeof(mapping_pseg_t));
1223
1224    /////// get name attribute
1225    str = getStringValue(reader, "name", &ok);
1226#if XML_PARSER_DEBUG
[295]1227printf("      name = %s\n", str);
[258]1228#endif
1229    if (ok) 
1230    {
1231        strncpy(pseg[pseg_index]->name, str, 31);
1232    }
1233    else 
1234    {
1235        printf("[XML ERROR] illegal or missing <name> for pseg %d in cluster %d\n",
1236                pseg_index, cluster_index);
1237        exit(1);
1238    }
1239
1240    //////// get type attribute
1241    str = getStringValue(reader, "type", &ok);
1242#if XML_PARSER_DEBUG
[295]1243printf("      type = %s\n", str);
[258]1244#endif
1245    if      (ok && (strcmp(str, "RAM" ) == 0)) { pseg[pseg_index]->type = PSEG_TYPE_RAM; }
1246    else if (ok && (strcmp(str, "PERI") == 0)) { pseg[pseg_index]->type = PSEG_TYPE_PERI; }
1247    else 
1248    {
1249        printf("[XML ERROR] illegal or missing <type> for pseg %s in cluster %d\n",
1250                pseg[pseg_index]->name, cluster_index);
1251        exit(1);
1252    }
1253
1254    //////// get base attribute
1255    ll_value = getPaddrValue(reader, "base", &ok);
1256#if XML_PARSER_DEBUG
[295]1257printf("      base = 0x%llx\n", ll_value);
[258]1258#endif
1259    if (ok) 
1260    {
1261        pseg[pseg_index]->base = ll_value;
1262    }
1263    else {
1264        printf("[XML ERROR] illegal or missing <base> for pseg %s in cluster %d\n",
1265                pseg[pseg_index]->name, cluster_index);
1266        exit(1);
1267    }
1268
1269    //////// get length attribute
1270    ll_value = getPaddrValue(reader, "length", &ok);
1271#if XML_PARSER_DEBUG
[295]1272printf("      length = 0x%llx\n", ll_value);
[258]1273#endif
1274    if (ok) 
1275    {
1276        pseg[pseg_index]->length = ll_value;
1277    } 
1278    else 
1279    {
1280        printf("[XML ERROR] illegal or missing <length> for pseg %s in cluster %d\n",
1281                pseg[pseg_index]->name, cluster_index);
1282        exit(1);
1283    }
1284
1285    //////// set cluster attribute
[263]1286    pseg[pseg_index]->clusterid = cluster_index;
[258]1287
1288    //////// set next_vseg attribute
1289    pseg[pseg_index]->next_vseg = 0;
1290
1291    pseg_index++;
1292    cluster[cluster_index]->psegs++;
1293} // end psegNode()
1294
1295
1296/////////////////////////////////////////
1297void clusterNode(xmlTextReaderPtr reader) 
1298{
1299    unsigned int ok;
1300    unsigned int value;
1301
1302    cluster[cluster_index] = (mapping_cluster_t *) malloc(sizeof(mapping_cluster_t));
1303
[263]1304    //initialise variables that will be incremented by *Node() functions
[258]1305    cluster[cluster_index]->psegs = 0;
1306    cluster[cluster_index]->procs = 0;
1307    cluster[cluster_index]->periphs = 0;
1308
1309    //initialise global variables
1310    proc_loc_index = 0;
1311    periph_loc_index = 0;
1312
[295]1313    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT)  return;
[258]1314
[263]1315#if XML_PARSER_DEBUG
1316printf("\n  cluster %d\n", cluster_index);
1317#endif
1318
1319    /////////// get x coordinate
1320    value = getIntValue(reader, "x", &ok);
1321#if XML_PARSER_DEBUG
1322printf("    x             = %d\n", value);
1323#endif
1324    if (ok && (value < header->x_size) ) 
[258]1325    {
[263]1326        cluster[cluster_index]->x = value;
1327    }
1328    else
1329    {
1330        printf("[XML ERROR] Illegal or missing < x > attribute for cluster %d", 
1331                cluster_index);
[258]1332        exit(1);
1333    }
1334
[263]1335    /////////// get y coordinate
1336    value = getIntValue(reader, "y", &ok);
[258]1337#if XML_PARSER_DEBUG
[263]1338printf("    y             = %d\n", value);
[258]1339#endif
[263]1340    if (ok && (value < header->y_size) ) 
[258]1341    {
[263]1342        cluster[cluster_index]->y = value;
1343    }
1344    else
1345    {
1346        printf("[XML ERROR] Illegal or missing < y > attribute for cluster %d", 
[258]1347                cluster_index);
1348        exit(1);
1349    }
1350
1351    ////////// set offsets
1352    cluster[cluster_index]->pseg_offset = pseg_index;
1353    cluster[cluster_index]->proc_offset = proc_index;
1354    cluster[cluster_index]->periph_offset = periph_index;
1355
1356#if XML_PARSER_DEBUG
[263]1357printf("    pseg_offset   = %d\n", pseg_index);
1358printf("    proc_offset   = %d\n", proc_index);
[627]1359printf("    periph_offset = %d\n", periph_index);
[258]1360#endif
1361
[627]1362    ////////// get psegs, procs, and periphs
[258]1363    int status = xmlTextReaderRead(reader);
1364
1365    while (status == 1) 
1366    {
1367        const char * tag = (const char *) xmlTextReaderConstName(reader);
1368
1369        if      (strcmp(tag, "pseg")     == 0) psegNode(reader);
1370        else if (strcmp(tag, "proc")     == 0) procNode(reader);
1371        else if (strcmp(tag, "periph")   == 0) periphNode(reader);
1372        else if (strcmp(tag, "#text")    == 0) { }
1373        else if (strcmp(tag, "#comment") == 0) { }
1374        else if (strcmp(tag, "cluster")  == 0) 
1375        {
[306]1376
[258]1377#if XML_PARSER_DEBUG
[263]1378printf("    psegs   = %d\n", cluster[cluster_index]->psegs);
1379printf("    procs   = %d\n", cluster[cluster_index]->procs);
1380printf("    periphs = %d\n", cluster[cluster_index]->periphs);
1381printf("    end cluster %d\n", cluster_index);
[258]1382#endif
1383            cluster_index++;
1384            return;
1385        }
1386        status = xmlTextReaderRead(reader);
1387    }
1388} // end clusterNode()
1389
1390
1391//////////////////////////////////////////////
1392void clusterSetNode(xmlTextReaderPtr reader) 
1393{
1394    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
1395
1396#if XML_PARSER_DEBUG
[263]1397printf("\n  clusters set\n");
[258]1398#endif
1399
1400    int status = xmlTextReaderRead(reader);
1401    while (status == 1) 
1402    {
1403        const char * tag = (const char *) xmlTextReaderConstName(reader);
1404
1405        if      (strcmp(tag, "cluster")    == 0) { clusterNode(reader); }
1406        else if (strcmp(tag, "#text")      == 0) { }
1407        else if (strcmp(tag, "#comment")   == 0) { }
1408        else if (strcmp(tag, "clusterset") == 0) 
1409        {
[295]1410            // checking number of clusters
[263]1411            if ( cluster_index != (header->x_size * header->y_size) ) 
[258]1412            {
1413                printf("[XML ERROR] Wrong number of clusters\n");
1414                exit(1);
1415            }
1416
1417#if XML_PARSER_DEBUG
1418            printf("  end cluster set\n\n");
1419#endif
[627]1420            header->psegs   = pseg_index;
1421            header->procs   = proc_index;
1422            header->irqs    = irq_index;
[258]1423            header->periphs = periph_index;
1424            return;
1425        }
1426        else 
1427        {
1428            printf("[XML ERROR] Unknown tag in clusterset node : %s",tag);
1429            exit(1);
1430        }
1431        status = xmlTextReaderRead(reader);
1432    }
1433} // end clusterSetNode()
1434
1435
1436///////////////////////////////////////////
1437void globalSetNode(xmlTextReaderPtr reader) 
1438{
1439    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
1440
1441#if XML_PARSER_DEBUG
1442    printf("  globals set\n");
1443#endif
1444
1445    int status = xmlTextReaderRead(reader);
1446    while (status == 1) 
1447    {
1448        const char * tag = (const char *) xmlTextReaderConstName(reader);
1449
[295]1450        if      (strcmp(tag, "vseg")      == 0) 
1451        { 
1452            vsegNode( reader ); 
1453            header->globals = header->globals + 1;
1454        }
[258]1455        else if (strcmp(tag, "#text")     == 0) { }
1456        else if (strcmp(tag, "#comment")  == 0) { }
1457        else if (strcmp(tag, "globalset") == 0) 
1458        {
1459#if XML_PARSER_DEBUG
1460            printf("  end global set\n\n");
1461#endif
1462            vseg_loc_index = 0;
1463            return;
1464        }
1465        else 
1466        {
1467            printf("[XML ERROR] Unknown tag in globalset node : %s",tag);
1468            exit(1);
1469        }
1470        status = xmlTextReaderRead(reader);
1471    }
1472} // end globalSetNode()
1473
1474
1475///////////////////////////////////////////
1476void vspaceSetNode(xmlTextReaderPtr reader)
1477{
1478    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) {
1479        return;
1480    }
1481
1482#if XML_PARSER_DEBUG
1483    printf("\n  vspaces set\n");
1484#endif
1485
1486    int status = xmlTextReaderRead ( reader );
1487    while (status == 1) {
1488        const char * tag = (const char *) xmlTextReaderConstName(reader);
1489
1490        if (strcmp(tag, "vspace") == 0) {
1491            vspaceNode(reader);
1492        }
1493        else if (strcmp(tag, "#text"    ) == 0 ) { }
1494        else if (strcmp(tag, "#comment" ) == 0 ) { }
1495        else if (strcmp(tag, "vspaceset") == 0 ) 
1496        {
[295]1497            header->vsegs = vseg_index;
[709]1498            header->threads = thread_index;
[295]1499            return;
[258]1500        }
1501        else 
1502        {
1503            printf("[XML ERROR] Unknown tag in vspaceset node : %s",tag);
1504            exit(1);
1505        }
1506        status = xmlTextReaderRead(reader);
1507    }
1508} // end globalSetNode()
1509
1510
1511////////////////////////////////////////
1512void headerNode(xmlTextReaderPtr reader) 
1513{
1514    char * name;
1515    unsigned int value;
1516    unsigned int ok;
1517
1518    if (xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT) return;
1519
1520#if XML_PARSER_DEBUG
1521    printf("mapping_info\n");
1522#endif
1523
1524    header = (mapping_header_t *) malloc(sizeof(mapping_header_t));
1525
1526    ////////// get name attribute
1527    name = getStringValue(reader, "name", &ok);
1528    if (ok) 
1529    {
1530#if XML_PARSER_DEBUG
1531        printf("  name = %s\n", name);
1532#endif
1533        strncpy( header->name, name, 31);
1534    }
1535    else 
1536    {
1537        printf("[XML ERROR] illegal or missing <name> attribute in header\n");
1538        exit(1);
1539    }
1540
[296]1541    /////////// get signature attribute
1542    value = getIntValue(reader, "signature", &ok);
1543    if ( ok && (value == IN_MAPPING_SIGNATURE) )
1544    {
1545#if XML_PARSER_DEBUG
1546        printf("  signature = %x\n", value);
1547#endif
1548        header->signature = IN_MAPPING_SIGNATURE;
1549    }
1550    else
1551    {
1552        printf("[XML ERROR] illegal or missing <signature> for mapping %s\n",
1553        header->name );
1554        exit(1);
1555    }
1556
[263]1557    /////////// get x_width attribute
1558    value = getIntValue(reader, "x_width", &ok);
[258]1559    if (ok) 
1560    {
1561#if XML_PARSER_DEBUG
[263]1562        printf("  x_width = %d\n", value);
[258]1563#endif
[263]1564        header->x_width = value;
[258]1565    }
[263]1566
1567    /////////// get y_width attribute
1568    value = getIntValue(reader, "y_width", &ok);
1569    if (ok) 
1570    {
1571#if XML_PARSER_DEBUG
1572        printf("  y_width = %d\n", value);
1573#endif
1574        header->y_width = value;
1575    }
1576
1577    /////////// get x_size attribute
1578    unsigned int x_size = getIntValue(reader, "x_size", &ok);
1579    if (ok) 
1580    {
1581#if XML_PARSER_DEBUG
1582        printf("  x_size  = %d\n", x_size);
1583#endif
1584        header->x_size = x_size;
1585    }
[258]1586    else 
1587    {
[263]1588        printf("[XML ERROR] illegal or missing <x_size> attribute in header\n");
[258]1589        exit(1);
1590    }
1591
[263]1592    /////////// get y_size attribute
1593    unsigned int y_size = getIntValue(reader, "y_size", &ok);
[258]1594    if (ok) 
1595    {
1596#if XML_PARSER_DEBUG
[263]1597        printf("  y_size  = %d\n", y_size);
[258]1598#endif
[263]1599        header->y_size = y_size;
[258]1600    }
1601    else 
1602    {
[263]1603        printf("[XML ERROR] illegal or missing <y_size> attribute in header\n");
[258]1604        exit(1);
1605    }
1606
[295]1607    /////////// get x_io attribute
1608    unsigned int x_io = getIntValue(reader, "x_io", &ok);
1609#if XML_PARSER_DEBUG
1610        printf("  x_io      = %d\n", x_io);
1611#endif
1612    if ( ok && (x_io < x_size) ) 
[258]1613    {
[295]1614        header->x_io = x_io;
1615    }
1616    else 
1617    {
1618        printf("[XML ERROR] illegal or missing <x_io> attribute in header\n");
[258]1619        exit(1);
1620    }
1621
[295]1622    /////////// get y_io attribute
1623    unsigned int y_io = getIntValue(reader, "y_io", &ok);
[258]1624#if XML_PARSER_DEBUG
[296]1625        printf("  y_io      = %d\n", y_io);
[258]1626#endif
[295]1627    if ( ok &&(y_io < y_size) ) 
1628    {
1629        header->y_io = y_io;
[258]1630    }
1631    else 
1632    {
[295]1633        printf("[XML ERROR] illegal or missing <y_io> attribute in header\n");
[258]1634        exit(1);
1635    }
1636
[295]1637    // check the number of cluster
1638    if ( (x_size * y_size) >= MAX_CLUSTERS )
1639    {
1640        printf("[XML ERROR] Number of clusters cannot be larger than %d\n", MAX_CLUSTERS);
1641        exit(1);
1642    }
1643
1644    ///////// get irq_per_proc attribute
1645    value = getIntValue(reader, "irq_per_proc", &ok);
[258]1646    if (ok) 
1647    {
1648#if XML_PARSER_DEBUG
[295]1649        printf("  irq_per_proc = %d\n", value);
[258]1650#endif
[295]1651        header->irq_per_proc = value;
[258]1652    }
1653    else 
1654    {
[295]1655        printf("[XML ERROR] illegal or missing <irq_per_proc> attribute in mapping\n");
[258]1656        exit(1);
1657    }
1658
[306]1659    ///////// get use_ram_disk attribute (default = 0)
1660    value = getIntValue(reader, "use_ram_disk", &ok);
[287]1661    if (ok) 
1662    {
1663#if XML_PARSER_DEBUG
[306]1664        printf("  use_ram_disk = %d\n", value);
[287]1665#endif
[306]1666        header->use_ram_disk = value;
[287]1667    }
1668    else 
1669    {
[306]1670        header->use_ram_disk = 0;
[287]1671    }
1672
[295]1673    ///////// set other header fields
1674    header->globals   = 0;
1675    header->vspaces   = 0;
1676    header->psegs     = 0;
1677    header->vsegs     = 0;
[709]1678    header->threads   = 0;
[295]1679    header->procs     = 0;
1680    header->irqs      = 0;
1681    header->periphs   = 0;
[258]1682
1683    int status = xmlTextReaderRead(reader);
1684    while (status == 1) 
1685    {
1686        const char * tag = (const char *) xmlTextReaderConstName(reader);
1687
[295]1688        if      (strcmp(tag, "clusterset")   == 0) { clusterSetNode(reader); }
[258]1689        else if (strcmp(tag, "globalset")    == 0) { globalSetNode(reader); }
1690        else if (strcmp(tag, "vspaceset")    == 0) { vspaceSetNode(reader); }
1691        else if (strcmp(tag, "#text")        == 0) { }
1692        else if (strcmp(tag, "#comment")     == 0) { }
1693        else if (strcmp(tag, "mapping_info") == 0) 
1694        {
1695#if XML_PARSER_DEBUG
1696            printf("end mapping_info\n");
1697#endif
1698            return;
1699        }
1700        else 
1701        {
1702            printf("[XML ERROR] Unknown tag in header node : %s\n",tag);
1703            exit(1);
1704        }
1705        status = xmlTextReaderRead(reader);
1706    }
1707} // end headerNode()
1708
1709
[511]1710////////////////////////////////////
1711void BuildTable( int          fdout, 
1712                 const char * type, 
1713                 unsigned int nb_elem,
1714                 unsigned int elem_size, 
1715                 char ** table ) 
[258]1716{
1717    unsigned int i;
[511]1718    for (i = 0; i < nb_elem; i++) 
1719    {
1720        if (elem_size != write(fdout, table[i], elem_size)) 
1721        {
[258]1722            printf("function %s: %s(%d) write  error \n", __FUNCTION__, type, i);
1723            exit(1);
1724        }
1725
1726#if XML_PARSER_DEBUG
1727        printf("Building binary: writing %s %d\n", type, i);
1728#endif
1729    }
1730}
1731
1732/////////////////////////////////////
1733int open_file(const char * file_path) 
1734{
1735    //open file
1736    int fdout = open( file_path, (O_CREAT | O_RDWR), (S_IWUSR | S_IRUSR) );
1737    if (fdout < 0) 
1738    {
1739        perror("open");
1740        exit(1);
1741    }
1742
1743    //reinitialise the file
1744    if (ftruncate(fdout, 0)) 
1745    {
1746        perror("truncate");
1747        exit(1);
1748    }
1749
1750    //#if XML_PARSER_DEBUG
1751    printf("%s\n", file_path);
1752    //#endif
1753
1754    return fdout;
1755}
1756
1757
1758/////////////////////////////////////
1759void buildBin(const char * file_path) 
1760{
1761    unsigned int length;
1762
1763    int fdout = open_file(file_path);
1764
1765#if XML_PARSER_DEBUG
1766printf("Building map.bin for %s\n", header->name);
1767printf("signature = %x\n", header->signature);
[263]1768printf("x_size    = %d\n", header->x_size);
1769printf("y_size    = %d\n", header->y_size);
1770printf("x_width   = %d\n", header->x_width);
1771printf("y_width   = %d\n", header->y_width);
[258]1772printf("vspaces   = %d\n", header->vspaces);
1773printf("psegs     = %d\n", header->psegs);
1774printf("vsegs     = %d\n", header->vsegs);
[709]1775printf("threads   = %d\n", header->threads);
[258]1776printf("procs     = %d\n", header->procs);
1777printf("irqs      = %d\n", header->irqs);
1778printf("periphs   = %d\n", header->periphs);
1779#endif
1780
1781    // write header to binary file
1782    length = write(fdout, (char *) header, sizeof(mapping_header_t));
1783    if (length != sizeof(mapping_header_t)) 
1784    {
1785        printf("write header error : length = %d \n", length);
1786        exit(1);
1787    }
1788
1789    // write clusters
1790    BuildTable(fdout, "cluster", cluster_index, sizeof(mapping_cluster_t), (char **) cluster);
1791    // write psegs
1792    BuildTable(fdout, "pseg", pseg_index, sizeof(mapping_pseg_t), (char **) pseg);
1793    // write vspaces
1794    BuildTable(fdout, "vspace", vspace_index, sizeof(mapping_vspace_t), (char **) vspace);
1795    // write vsegs
1796    BuildTable(fdout, "vseg", vseg_index, sizeof(mapping_vseg_t), (char **) vseg);
[709]1797    // write threads array
1798    BuildTable(fdout, "thread", thread_index, sizeof(mapping_thread_t), (char **) thread);
[258]1799    //building procs array
1800    BuildTable(fdout, "proc", proc_index, sizeof(mapping_proc_t), (char **) proc);
1801    //building irqs array
1802    BuildTable(fdout, "irq", irq_index, sizeof(mapping_irq_t), (char **) irq);
1803    //building periphs array
1804    BuildTable(fdout, "periph", periph_index, sizeof(mapping_periph_t), (char **) periph);
1805
1806    close(fdout);
1807
1808} // end buildBin()
1809
1810
1811//////////////////////////////////////////////////////
1812char * buildPath(const char * path, const char * name) 
1813{
1814    char * res = calloc(strlen(path) + strlen(name) + 1, 1);
1815    strcat(res, path);
1816    strcat(res, "/");
1817    strcat(res, name);
1818    return res; 
1819}
1820
1821
1822//////////////////////////////////
1823int main(int argc, char * argv[]) 
1824{
[511]1825    if (argc < 3) 
1826    {
[258]1827        printf("Usage: xml2bin <input_file_path> <output_path>\n");
1828        return 1;
1829    }
1830
1831    struct stat dir_st;
[511]1832    if (stat( argv[2], &dir_st)) 
1833    {
[258]1834        perror("bad path");
1835        exit(1);
1836    }
1837
[511]1838    if ((dir_st.st_mode & S_IFDIR) == 0) 
1839    {
[258]1840        printf("path is not a dir: %s", argv[2] );
1841        exit(1);
1842    }
1843
1844    char * map_path = buildPath(argv[2], "map.bin"); 
1845
1846    LIBXML_TEST_VERSION;
1847
1848    int status;
1849    xmlTextReaderPtr reader = xmlReaderForFile(argv[1], NULL, 0);
1850
1851    if (reader != NULL) 
1852    {
1853        status = xmlTextReaderRead (reader);
1854        while (status == 1) 
1855        {
1856            const char * tag = (const char *) xmlTextReaderConstName(reader);
1857
1858            if (strcmp(tag, "mapping_info") == 0) 
1859            { 
1860                headerNode(reader);
1861                buildBin(map_path);
1862            }
1863            else 
1864            {
1865                printf("[XML ERROR] Wrong file type: \"%s\"\n", argv[1]);
1866                return 1;
1867            }
1868            status = xmlTextReaderRead(reader);
1869        }
1870        xmlFreeTextReader(reader);
1871
1872        if (status != 0) 
1873        {
1874            printf("[XML ERROR] Wrong Syntax in \"%s\" file\n", argv[1]);
1875            return 1;
1876        }
1877    }
1878    return 0;
1879} // end main()
1880
1881
1882// Local Variables:
1883// tab-width: 4
1884// c-basic-offset: 4
1885// c-file-offsets:((innamespace . 0)(inline-open . 0))
1886// indent-tabs-mode: nil
1887// End:
1888// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
1889
Note: See TracBrowser for help on using the repository browser.