xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/vp/hal/utils/vp_visa.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2022, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file      vp_visa.h
24 //! \brief     Contains Class ISAfile definitions
25 //!
26 
27 #ifndef __VP_VISA_H__
28 #define __VP_VISA_H__
29 
30 #include <cstdint>
31 #include <cstring>
32 #include <vector>
33 #include <array>
34 #include "media_class_trace.h"
35 
36 namespace vp
37 {
38 namespace vISA
39 {
40     enum Datatype { ONE, TWO, FOUR, EIGHT, VARCHAR, VARCHAR_POOL, GDATA, STRUCT, REMOVED };
41 
42     //!
43     //! \brief      Field Struct.
44     //! \details    This struct represents any field from the ISA file.
45     //!             Fields are tagged according their data size in bytes (1 to 8 bytes).
46     //!             Regular strings are tagged as VARCHAR and strings from the String
47     //!             Pool as VARCHAR_POOL.
48     //!
49     struct Field {
50         Datatype type = ONE;
51         uint8_t countField = 0;
52         uint32_t size = 0;
53         union {
54             int8_t number8;
55             int16_t number16;
56             int32_t number32;
57             int64_t number64;
58             int8_t ui8[8];
59             char *varchar;
60             const uint8_t *gdata;
61         };
62 
63         //!
64         //! \brief      Constructor of Field struct.
65         //!
FieldField66         Field() : countField(0), number64(0) {}
67 
68         //!
69         //! \brief      Constructor of Field struct.
70         //!
FieldField71         Field(Datatype t) : type(t), countField(0), number64(0) {}
72 
73         //!
74         //! \brief      Constructor of Field struct.
75         //!
FieldField76         Field(Datatype t, uint8_t cf) : type(t), countField(cf), number64(0) {}
77 
78         //!
79         //! \brief      Destructor of Field struct.
80         //!
~FieldField81         ~Field() {
82             if (type == Datatype::VARCHAR || type == Datatype::VARCHAR_POOL)
83                 delete[] varchar;
84             else if (type == Datatype::GDATA)
85                 delete[] gdata;
86         }
87     };
88 
89     class Header;
90     class KernelBody;
91     class FunctionBody;
92 
93     //!
94     //! \brief      ISAfile Class.
95     //! \details     This class provides the functionality to manage ISA files: read
96     //!             parse and write ISA files. Access to Header, Kernels and
97     //!             Functions is also provided.
98     //!             It supports from vISA 3.4.
99     //!
100     class ISAfile
101     {
102     private:
103         unsigned version = 0;
104         const uint8_t *data = nullptr;
105         const uint8_t *end = nullptr;
106         unsigned size = 0;
107         const char *error = nullptr;
108         unsigned errorIndex = 0;
109         Header *header = nullptr;
110         bool kernel_data_loaded = false;
111         bool function_data_loaded = false;
112         std::vector<KernelBody*> kernel_data;
113         std::vector<FunctionBody*> function_data;
114 
115         //!
116         //! \brief      Reads and parses the Header from ISA file.
117         //! \retval     True if sucessfully parsers the header.
118         //!             False otherwise.
119         //!
120         bool loadHeader();
121 
122         //!
123         //! \brief      Reads and parses the kernels from ISA file.
124         //! \retval     True if sucessfully parsers all the kernels.
125         //!             False otherwise.
126         //!
127         bool loadKernelData();
128 
129         //!
130         //! \brief      Reads and parses the functions from ISA file.
131         //! \retval     True if sucessfully parsers all the functions.
132         //!             False otherwise.
133         //!
134         bool loadFunctionData();
135     public:
136         //!
137         //! \brief      Constructor of ISAfile class.
138         //! \param      [in] data.
139         //!             Pointer to buffer data from ISA file.
140         //! \param      [in] size.
141         //!             Size of ISA file buffer.
142         //!
143         ISAfile(const uint8_t *data, unsigned size);
144 
145         //!
146         //! \brief      Copy Constructor of ISAfile class.
147         //! \param      [in] other.
148         //!             Reference to object to copy.
149         //!
150         ISAfile(const ISAfile& other);
151 
152         //!
153         //! \brief      Assignment operator.
154         //! \param      [in] other.
155         //!             Reference to object to copy.
156         //!
157         ISAfile& operator= (const ISAfile& other);
158 
159         //!
160         //! \brief      Destructor of ISAfile class.
161         //!
162         ~ISAfile();
163 
164         //!
165         //! \brief      Reads the ISA file.
166         //! \retval     True if it reads successfully.
167         //!
168         bool readFile();
169 
170         //!
171         //! \brief      Returns the Header object.
172         //! \retval     The pointer to Header object.
173         //!
getHeader()174         Header *getHeader() { return header; }
175 
176         //!
177         //! \brief      Returns the vector of kernels.
178         //! \retval     The reference to the vector with the kernels.
179         //!
180         std::vector<KernelBody*> &getKernelsData();
181 
182         //!
183         //! \brief      Returns the vector of functions.
184         //! \retval     The reference to the vector with the functions.
185         //!
186         std::vector<FunctionBody*> &getFunctionsData();
187 
188         //!
189         //! \brief      Reads a value from buffer and assigns to field.
190         //! \param      [in] p.
191         //!             Pointer to buffer data from ISA file.
192         //! \param      [in] buffEnd.
193         //!             Pointer to the end of buffer data from ISA file.
194         //! \param      [out] field.
195         //!             Reference to field.
196         //! \param      [in] size.
197         //!             Size of the value to be read.
198         //! \retval     The pointer to buffer after reading the value.
199         //!
200         const uint8_t* readField(const uint8_t *p, const uint8_t *buffEnd, Field &field, unsigned size);
201 
202         //!
203         //! \brief      Returns the error message.
204         //! \retval     The pointer to string with the error message.
205         //!
getError()206         const char *getError() { return error; }
207 
208         //!
209         //! \brief      Returns the error index.
210         //! \retval     The index to the error.
211         //!
getErrorOffset()212         unsigned getErrorOffset() { return errorIndex; }
213 
214         //!
215         //! \brief      Sets the error message.
216         //! \param      [int] e.
217         //!             Error message.
218         //! \param      [in] index.
219         //!              Index to the error.
220         //!
221         const uint8_t *setError(const char * e, unsigned index);
222 
223         //!
224         //! \brief      Returns the vISA version of current file.
225         //! \retval     The vISA version as integer.
226         //!
getCurrentVISAVersion()227         unsigned getCurrentVISAVersion() { return version; }
228 
229         //!
230         //! \brief      Sets the ISA file version
231         //! \param      The ISA file version
232         //!
setCurrentVISAVersion(unsigned v)233         void setCurrentVISAVersion(unsigned v) { version = v; }
234 
235         //!
236         //! \brief      Writes a new ISA file with the current information in this class.
237         //! \param      [in] filename.
238         //!             String with the file name.
239         //! \param      [in] originalBuffer.
240         //!             Buffer data of the original ISA file.
241         //! \retval     True if successfully writes the ISA file.
242         //!
243         bool writeToFile(const char *filename, std::vector<uint8_t> &originalBuffer);
244 
245         //!
246         //! \brief      Adds the value from a field to buffer.
247         //!             This function is called when writing a ISA file.
248         //! \param      [in] field.
249         //!             The field to get its value.
250         //! \param      [out] buffer.
251         //!             Buffer data where the field's field is added.
252         //!
253         void addToBuffer(Field &field, std::vector<char> &buffer);
254 
255     MEDIA_CLASS_DEFINE_END(vp__vISA__ISAfile)
256     };
257 
258     //!
259     //! \brief      AttributeInfo Class.
260     //! \details    This class represents the AttributeInfo from vISA Object Format.
261     //!             Provides getters, setters for its fields and structs as well as
262     //!             functions to read/write it from/to file.
263     //!
264     class AttributeInfo {
265     public:
266         std::array<Field, 3> fields = std::array<Field, 3>
267         {
268             Field(Datatype::FOUR), // name
269                 Field(Datatype::ONE), // size
270                 Field(Datatype::GDATA, 1) // value
271         };
272 
273         //!
274         //! \brief      Constructor of AttributeInfo class.
275         //! \param      [in] version.
276         //!             Version of current ISA file.
277         //!
AttributeInfo(unsigned version)278         AttributeInfo(unsigned version) {
279             if (version <= 303) setVersion303();
280         }
281 
282         //!
283         //! \brief      Constructor of AttributeInfo class.
284         //!
AttributeInfo()285         AttributeInfo() { }
286 
287         //!
288         //! \brief      Destructor of AttributeInfo class.
289         //!
~AttributeInfo()290         ~AttributeInfo() {
291         }
292 
293         //!
294         //! \brief      Returns the integer value of the Name field.
295         //! \details    Name field is at index 0 in the internal
296         //!             array of Fields.
297         //! \retval     An integer.
298         //!
getName()299         uint32_t getName() {
300             return (uint32_t)fields[0].number32;
301         }
302 
303         //!
304         //! \brief      Sets the integer value of the Name field.
305         //! \details    Name field is at index 0 in the internal
306         //!             array of Fields.
307         //! \param      [in] value.
308         //!             Integer be assigned.
309         //!
setName(uint32_t value)310         void setName(uint32_t value) {
311             fields[0].number32 = value;
312         }
313 
314         //!
315         //! \brief      Returns the integer value of the Size field.
316         //! \details    Size field is at index 1 in the internal
317         //!             array of Fields.
318         //! \retval     An integer.
319         //!
getSize()320         uint8_t getSize() {
321             return (uint8_t)fields[1].number8;
322         }
323 
324         //!
325         //! \brief      Sets the integer value of the Size field.
326         //! \details    Size field is at index 1 in the internal
327         //!             array of Fields.
328         //! \param      [in] value.
329         //!             Integer be assigned.
330         //!
setSize(uint8_t value)331         void setSize(uint8_t value) {
332             fields[1].number8 = value;
333         }
334 
335         //!
336         //! \brief      Returns the pointer to buffer data from Value field.
337         //! \details    Value field is at index 2 in the internal
338         //!             array of Fields.
339         //! \retval     A pointer to buffer data (const uint8_t*).
340         //!
getValue()341         const uint8_t* getValue() {
342             return fields[2].gdata;
343         }
344 
345         //!
346         //! \brief      Sets the pointer to buffer data of the Value field.
347         //! \details    Value field is at index 2 in the internal
348         //!             array of Fields.
349         //! \param      [in] value.
350         //!             Pointer to buffer data (uint8_t*) to be assigned.
351         //!
setValue(uint8_t * value)352         void setValue(uint8_t * value) {
353             fields[2].gdata = value;
354         }
355 
356         //!
357         //! \brief      Parses one AttributeInfo object from ISA file.
358         //! \details    Reads and parses all the fields of the AttributeInfo object
359         //!             from the file buffer and returns the pointer immediately
360         //!             after all this data.
361         //!             If this class contains internal structs, their Parse
362         //!             functions are called when corresponding.
363         //! \param      [in] p.
364         //!             Pointer to file buffer to start reading.
365         //! \param      [in] end.
366         //!             Pointer to end of file buffer.
367         //! \param      [in] m.
368         //!             Pointer ISAfile object.
369         //! \retval     Pointer to file buffe after parsing one AttributeInfo object.
370         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)371         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
372             unsigned i = 0;
373             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
374                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
375                 if (!p) return m->setError("bad offset/size for AttributeInfo's field", i);
376                 i++;
377             }
378             return p;
379         }
380 
381         //!
382         //! \brief      Adds all the AttributeInfo's fields to a buffer.
383         //! \details    Every field from this class is added to a buffer
384         //!             in order to be written into an ISA file afterwards
385         //!             If this class contains other internal structus, their addToBuffer
386         //!             functions are called when corresponding.
387         //! \param      [out] buffer.
388         //!             The buffer where the fields data will be added.
389         //! \param      [in] m.
390         //!             Pointer to ISAfile object.
391         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)392         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
393             unsigned i = 0;
394             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
395                 m->addToBuffer(fields[i], buffer);
396                 i++;
397             }
398         }
399 
400         //!
401         //! \brief      Makes the changes needed to support 303 version's AttributeInfo.
402         //! \details    This function is called when the current ISA file has the 303 version.
403         //!             Initially all the objects are created with last version's format, so
404         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
405         //!             of fields can be needed.
406         //!
setVersion303()407         void setVersion303() {
408             fields[0] = Datatype::TWO;
409         }
410     MEDIA_CLASS_DEFINE_END(vp__vISA__AttributeInfo)
411     };
412 
413     //!
414     //! \brief      InputInfo Class.
415     //! \details    This class represents the InputInfo from vISA Object Format.
416     //!             Provides getters, setters for its fields and structs as well as
417     //!             functions to read/write it from/to file.
418     //!
419     class InputInfo {
420     public:
421         std::array<Field, 4> fields = std::array<Field, 4>
422         {
423             Field(Datatype::ONE), // kind
424                 Field(Datatype::FOUR), // id
425                 Field(Datatype::TWO), // offset
426                 Field(Datatype::TWO) // size
427         };
428 
429         //!
430         //! \brief      Constructor of InputInfo class.
431         //! \param      [in] version.
432         //!             Version of current ISA file.
433         //!
InputInfo(unsigned version)434         InputInfo(unsigned version) {
435             if (version <= 303) setVersion303();
436         }
437 
438         //!
439         //! \brief      Destructor of InputInfo class.
440         //!
~InputInfo()441         ~InputInfo() {
442         }
443 
444         //!
445         //! \brief      Returns the integer value of the Kind field.
446         //! \details    Kind field is at index 0 in the internal
447         //!             array of Fields.
448         //! \retval     An integer.
449         //!
getKind()450         int8_t getKind() {
451             return fields[0].number8;
452         }
453 
454         //!
455         //! \brief      Sets the integer value of the Kind field.
456         //! \details    Kind field is at index 0 in the internal
457         //!             array of Fields.
458         //! \param      [in] value.
459         //!             Integer be assigned.
460         //!
setKind(int8_t value)461         void setKind(int8_t value) {
462             fields[0].number8 = value;
463         }
464 
465         //!
466         //! \brief      Returns the integer value of the Id field.
467         //! \details    Id field is at index 1 in the internal
468         //!             array of Fields.
469         //! \retval     An integer.
470         //!
getId()471         uint32_t getId() {
472             return (uint32_t)fields[1].number32;
473         }
474 
475         //!
476         //! \brief      Sets the integer value of the Id field.
477         //! \details    Id field is at index 1 in the internal
478         //!             array of Fields.
479         //! \param      [in] value.
480         //!             Integer be assigned.
481         //!
setId(uint32_t value)482         void setId(uint32_t value) {
483             fields[1].number32 = value;
484         }
485 
486         //!
487         //! \brief      Returns the integer value of the Offset field.
488         //! \details    Offset field is at index 2 in the internal
489         //!             array of Fields.
490         //! \retval     An integer.
491         //!
getOffset()492         int16_t getOffset() {
493             return fields[2].number16;
494         }
495 
496         //!
497         //! \brief      Sets the integer value of the Offset field.
498         //! \details    Offset field is at index 2 in the internal
499         //!             array of Fields.
500         //! \param      [in] value.
501         //!             Integer be assigned.
502         //!
setOffset(int16_t value)503         void setOffset(int16_t value) {
504             fields[2].number16 = value;
505         }
506 
507         //!
508         //! \brief      Returns the integer value of the Size field.
509         //! \details    Size field is at index 3 in the internal
510         //!             array of Fields.
511         //! \retval     An integer.
512         //!
getSize()513         uint16_t getSize() {
514             return (uint16_t)fields[3].number16;
515         }
516 
517         //!
518         //! \brief      Sets the integer value of the Size field.
519         //! \details    Size field is at index 3 in the internal
520         //!             array of Fields.
521         //! \param      [in] value.
522         //!             Integer be assigned.
523         //!
setSize(uint16_t value)524         void setSize(uint16_t value) {
525             fields[3].number16 = value;
526         }
527 
528         //!
529         //! \brief      Parses one InputInfo object from ISA file.
530         //! \details    Reads and parses all the fields of the InputInfo object
531         //!             from the file buffer and returns the pointer immediately
532         //!             after all this data.
533         //!             If this class contains internal structs, their Parse
534         //!             functions are called when corresponding.
535         //! \param      [in] p.
536         //!             Pointer to file buffer to start reading.
537         //! \param      [in] end.
538         //!             Pointer to end of file buffer.
539         //! \param      [in] m.
540         //!             Pointer ISAfile object.
541         //! \retval     Pointer to file buffe after parsing one InputInfo object.
542         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)543         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
544             unsigned i = 0;
545             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
546                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
547                 if (!p) return m->setError("bad offset/size for InputInfo's field", i);
548                 i++;
549             }
550             return p;
551         }
552 
553         //!
554         //! \brief      Adds all the InputInfo's fields to a buffer.
555         //! \details    Every field from this class is added to a buffer
556         //!             in order to be written into an ISA file afterwards
557         //!             If this class contains other internal structus, their addToBuffer
558         //!             functions are called when corresponding.
559         //! \param      [out] buffer.
560         //!             The buffer where the fields data will be added.
561         //! \param      [in] m.
562         //!             Pointer to ISAfile object.
563         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)564         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
565             unsigned i = 0;
566             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
567                 m->addToBuffer(fields[i], buffer);
568                 i++;
569             }
570         }
571 
572         //!
573         //! \brief      Makes the changes needed to support 303 version's InputInfo.
574         //! \details    This function is called when the current ISA file has the 303 version.
575         //!             Initially all the objects are created with last version's format, so
576         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
577         //!             of fields can be needed.
578         //!
setVersion303()579         void setVersion303() {
580             fields[1] = Datatype::TWO;
581         }
582     MEDIA_CLASS_DEFINE_END(vp__vISA__InputInfo)
583     };
584 
585     //!
586     //! \brief      VmeInfo Class.
587     //! \details    This class represents the VmeInfo from vISA Object Format.
588     //!             Provides getters, setters for its fields and structs as well as
589     //!             functions to read/write it from/to file.
590     //!
591     class VmeInfo {
592     public:
593         std::array<Field, 4> fields = std::array<Field, 4>
594         {
595             Field(Datatype::FOUR), // name_index
596                 Field(Datatype::TWO), // num_elements
597                 Field(Datatype::ONE), // attribute_count
598                 Field(Datatype::STRUCT, 2), // attribute_info
599         };
600         std::vector<AttributeInfo*> attribute_info;
601 
602         //!
603         //! \brief      Constructor of VmeInfo class.
604         //! \param      [in] version.
605         //!             Version of current ISA file.
606         //!
VmeInfo(unsigned version)607         VmeInfo(unsigned version) {
608             if (version <= 303) setVersion303();
609         }
610 
611         //!
612         //! \brief      Destructor of VmeInfo class.
613         //!
~VmeInfo()614         ~VmeInfo() {
615             for (AttributeInfo *s : attribute_info) delete s;
616         }
617 
618         //!
619         //! \brief      Returns the integer value of the NameIndex field.
620         //! \details    NameIndex field is at index 0 in the internal
621         //!             array of Fields.
622         //! \retval     An integer.
623         //!
getNameIndex()624         uint32_t getNameIndex() {
625             return (uint32_t)fields[0].number32;
626         }
627 
628         //!
629         //! \brief      Sets the integer value of the NameIndex field.
630         //! \details    NameIndex field is at index 0 in the internal
631         //!             array of Fields.
632         //! \param      [in] value.
633         //!             Integer be assigned.
634         //!
setNameIndex(uint32_t value)635         void setNameIndex(uint32_t value) {
636             fields[0].number32 = value;
637         }
638 
639         //!
640         //! \brief      Returns the integer value of the NumElements field.
641         //! \details    NumElements field is at index 1 in the internal
642         //!             array of Fields.
643         //! \retval     An integer.
644         //!
getNumElements()645         uint16_t getNumElements() {
646             return (uint16_t)fields[1].number16;
647         }
648 
649         //!
650         //! \brief      Sets the integer value of the NumElements field.
651         //! \details    NumElements field is at index 1 in the internal
652         //!             array of Fields.
653         //! \param      [in] value.
654         //!             Integer be assigned.
655         //!
setNumElements(uint16_t value)656         void setNumElements(uint16_t value) {
657             fields[1].number16 = value;
658         }
659 
660         //!
661         //! \brief      Returns the integer value of the AttributeCount field.
662         //! \details    AttributeCount field is at index 2 in the internal
663         //!             array of Fields.
664         //! \retval     An integer.
665         //!
getAttributeCount()666         uint8_t getAttributeCount() {
667             return (uint8_t)fields[2].number8;
668         }
669 
670         //!
671         //! \brief      Sets the integer value of the AttributeCount field.
672         //! \details    AttributeCount field is at index 2 in the internal
673         //!             array of Fields.
674         //! \param      [in] value.
675         //!             Integer be assigned.
676         //!
setAttributeCount(uint8_t value)677         void setAttributeCount(uint8_t value) {
678             fields[2].number8 = value;
679         }
680 
681         //!
682         //! \brief      Returns the reference to the vector of AttributeInfo objects.
683         //! \details    VmeInfo has a vector of AttributeInfo objects
684         //!             that represents another entity within the vISA object format.
685         //! \retval     Reference to the vector of AttributeInfo*.
686         //!
getAttributeInfo()687         std::vector<AttributeInfo*> &getAttributeInfo() {
688             return attribute_info;
689         }
690 
691         //!
692         //! \brief      Parses one VmeInfo object from ISA file.
693         //! \details    Reads and parses all the fields of the VmeInfo object
694         //!             from the file buffer and returns the pointer immediately
695         //!             after all this data.
696         //!             If this class contains internal structs, their Parse
697         //!             functions are called when corresponding.
698         //! \param      [in] p.
699         //!             Pointer to file buffer to start reading.
700         //! \param      [in] end.
701         //!             Pointer to end of file buffer.
702         //! \param      [in] m.
703         //!             Pointer ISAfile object.
704         //! \retval     Pointer to file buffe after parsing one VmeInfo object.
705         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)706         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
707             unsigned i = 0, count = 0;
708             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
709                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
710                 if (!p) return m->setError("bad offset/size for VmeInfo's field", i);
711                 i++;
712             }
713             // AttributeInfo
714             count = fields[fields[i].countField].number32;
715             attribute_info.resize(count);
716             for (unsigned j = 0; j < count; j++) {
717                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
718                 p = r->parse(p, end, m);
719                 if (!p) {
720                     delete r;
721                     return 0;
722                 }
723                 attribute_info[j] = r;
724             }
725             i++;
726             return p;
727         }
728 
729         //!
730         //! \brief      Adds all the VmeInfo's fields to a buffer.
731         //! \details    Every field from this class is added to a buffer
732         //!             in order to be written into an ISA file afterwards
733         //!             If this class contains other internal structus, their addToBuffer
734         //!             functions are called when corresponding.
735         //! \param      [out] buffer.
736         //!             The buffer where the fields data will be added.
737         //! \param      [in] m.
738         //!             Pointer to ISAfile object.
739         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)740         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
741             unsigned i = 0;
742             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
743                 m->addToBuffer(fields[i], buffer);
744                 i++;
745             }
746             // AttributeInfo
747             for (AttributeInfo *r : attribute_info) {
748                 r->addToBuffer(buffer, m);
749             }
750             i++;
751         }
752 
753         //!
754         //! \brief      Makes the changes needed to support 303 version's VmeInfo.
755         //! \details    This function is called when the current ISA file has the 303 version.
756         //!             Initially all the objects are created with last version's format, so
757         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
758         //!             of fields can be needed.
759         //!
setVersion303()760         void setVersion303() {
761             fields[0] = Datatype::TWO;
762         }
763     MEDIA_CLASS_DEFINE_END(vp__vISA__VmeInfo)
764     };
765 
766     //!
767     //! \brief      SurfaceInfo Class.
768     //! \details    This class represents the SurfaceInfo from vISA Object Format.
769     //!             Provides getters, setters for its fields and structs as well as
770     //!             functions to read/write it from/to file.
771     //!
772     class SurfaceInfo {
773     public:
774         std::array<Field, 4> fields = std::array<Field, 4>
775         {
776             Field(Datatype::FOUR), // name_index
777                 Field(Datatype::TWO), // num_elements
778                 Field(Datatype::ONE), // attribute_count
779                 Field(Datatype::STRUCT, 2), // attribute_info
780         };
781         std::vector<AttributeInfo*> attribute_info;
782 
783         //!
784         //! \brief      Constructor of SurfaceInfo class.
785         //! \param      [in] version.
786         //!             Version of current ISA file.
787         //!
SurfaceInfo(unsigned version)788         SurfaceInfo(unsigned version) {
789             if (version <= 303) setVersion303();
790         }
791 
792         //!
793         //! \brief      Destructor of SurfaceInfo class.
794         //!
~SurfaceInfo()795         ~SurfaceInfo() {
796             for (AttributeInfo *s : attribute_info) delete s;
797         }
798 
799         //!
800         //! \brief      Returns the integer value of the NameIndex field.
801         //! \details    NameIndex field is at index 0 in the internal
802         //!             array of Fields.
803         //! \retval     An integer.
804         //!
getNameIndex()805         uint32_t getNameIndex() {
806             return (uint32_t)fields[0].number32;
807         }
808 
809         //!
810         //! \brief      Sets the integer value of the NameIndex field.
811         //! \details    NameIndex field is at index 0 in the internal
812         //!             array of Fields.
813         //! \param      [in] value.
814         //!             Integer be assigned.
815         //!
setNameIndex(uint32_t value)816         void setNameIndex(uint32_t value) {
817             fields[0].number32 = value;
818         }
819 
820         //!
821         //! \brief      Returns the integer value of the NumElements field.
822         //! \details    NumElements field is at index 1 in the internal
823         //!             array of Fields.
824         //! \retval     An integer.
825         //!
getNumElements()826         uint16_t getNumElements() {
827             return (uint16_t)fields[1].number16;
828         }
829 
830         //!
831         //! \brief      Sets the integer value of the NumElements field.
832         //! \details    NumElements field is at index 1 in the internal
833         //!             array of Fields.
834         //! \param      [in] value.
835         //!             Integer be assigned.
836         //!
setNumElements(uint16_t value)837         void setNumElements(uint16_t value) {
838             fields[1].number16 = value;
839         }
840 
841         //!
842         //! \brief      Returns the integer value of the AttributeCount field.
843         //! \details    AttributeCount field is at index 2 in the internal
844         //!             array of Fields.
845         //! \retval     An integer.
846         //!
getAttributeCount()847         uint8_t getAttributeCount() {
848             return (uint8_t)fields[2].number8;
849         }
850 
851         //!
852         //! \brief      Sets the integer value of the AttributeCount field.
853         //! \details    AttributeCount field is at index 2 in the internal
854         //!             array of Fields.
855         //! \param      [in] value.
856         //!             Integer be assigned.
857         //!
setAttributeCount(uint8_t value)858         void setAttributeCount(uint8_t value) {
859             fields[2].number8 = value;
860         }
861 
862         //!
863         //! \brief      Returns the reference to the vector of AttributeInfo objects.
864         //! \details    SurfaceInfo has a vector of AttributeInfo objects
865         //!             that represents another entity within the vISA object format.
866         //! \retval     Reference to the vector of AttributeInfo*.
867         //!
getAttributeInfo()868         std::vector<AttributeInfo*> &getAttributeInfo() {
869             return attribute_info;
870         }
871 
872         //!
873         //! \brief      Parses one SurfaceInfo object from ISA file.
874         //! \details    Reads and parses all the fields of the SurfaceInfo object
875         //!             from the file buffer and returns the pointer immediately
876         //!             after all this data.
877         //!             If this class contains internal structs, their Parse
878         //!             functions are called when corresponding.
879         //! \param      [in] p.
880         //!             Pointer to file buffer to start reading.
881         //! \param      [in] end.
882         //!             Pointer to end of file buffer.
883         //! \param      [in] m.
884         //!             Pointer ISAfile object.
885         //! \retval     Pointer to file buffe after parsing one SurfaceInfo object.
886         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)887         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
888             unsigned i = 0, count = 0;
889             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
890                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
891                 if (!p) return m->setError("bad offset/size for SurfaceInfo's field", i);
892                 i++;
893             }
894             // AttributeInfo
895             count = fields[fields[i].countField].number32;
896             attribute_info.resize(count);
897             for (unsigned j = 0; j < count; j++) {
898                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
899                 p = r->parse(p, end, m);
900                 if (!p) {
901                     delete r;
902                     return 0;
903                 }
904                 attribute_info[j] = r;
905             }
906             i++;
907             return p;
908         }
909 
910         //!
911         //! \brief      Adds all the SurfaceInfo's fields to a buffer.
912         //! \details    Every field from this class is added to a buffer
913         //!             in order to be written into an ISA file afterwards
914         //!             If this class contains other internal structus, their addToBuffer
915         //!             functions are called when corresponding.
916         //! \param      [out] buffer.
917         //!             The buffer where the fields data will be added.
918         //! \param      [in] m.
919         //!             Pointer to ISAfile object.
920         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)921         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
922             unsigned i = 0;
923             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
924                 m->addToBuffer(fields[i], buffer);
925                 i++;
926             }
927             // AttributeInfo
928             for (AttributeInfo *r : attribute_info) {
929                 r->addToBuffer(buffer, m);
930             }
931             i++;
932         }
933 
934         //!
935         //! \brief      Makes the changes needed to support 303 version's SurfaceInfo.
936         //! \details    This function is called when the current ISA file has the 303 version.
937         //!             Initially all the objects are created with last version's format, so
938         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
939         //!             of fields can be needed.
940         //!
setVersion303()941         void setVersion303() {
942             fields[0] = Datatype::TWO;
943         }
944     MEDIA_CLASS_DEFINE_END(vp__vISA__SurfaceInfo)
945     };
946 
947     //!
948     //! \brief      SamplerInfo Class.
949     //! \details    This class represents the SamplerInfo from vISA Object Format.
950     //!             Provides getters, setters for its fields and structs as well as
951     //!             functions to read/write it from/to file.
952     //!
953     class SamplerInfo {
954     public:
955         std::array<Field, 4> fields = std::array<Field, 4>
956         {
957             Field(Datatype::FOUR), // name_index
958                 Field(Datatype::TWO), // num_elements
959                 Field(Datatype::ONE), // attribute_count
960                 Field(Datatype::STRUCT, 2), // attribute_info
961         };
962         std::vector<AttributeInfo*> attribute_info;
963 
964         //!
965         //! \brief      Constructor of SamplerInfo class.
966         //! \param      [in] version.
967         //!             Version of current ISA file.
968         //!
SamplerInfo(unsigned version)969         SamplerInfo(unsigned version) {
970             if (version <= 303) setVersion303();
971         }
972 
973         //!
974         //! \brief      Destructor of SamplerInfo class.
975         //!
~SamplerInfo()976         ~SamplerInfo() {
977             for (AttributeInfo *s : attribute_info) delete s;
978         }
979 
980         //!
981         //! \brief      Returns the integer value of the NameIndex field.
982         //! \details    NameIndex field is at index 0 in the internal
983         //!             array of Fields.
984         //! \retval     An integer.
985         //!
getNameIndex()986         uint32_t getNameIndex() {
987             return (uint32_t)fields[0].number32;
988         }
989 
990         //!
991         //! \brief      Sets the integer value of the NameIndex field.
992         //! \details    NameIndex field is at index 0 in the internal
993         //!             array of Fields.
994         //! \param      [in] value.
995         //!             Integer be assigned.
996         //!
setNameIndex(uint32_t value)997         void setNameIndex(uint32_t value) {
998             fields[0].number32 = value;
999         }
1000 
1001         //!
1002         //! \brief      Returns the integer value of the NumElements field.
1003         //! \details    NumElements field is at index 1 in the internal
1004         //!             array of Fields.
1005         //! \retval     An integer.
1006         //!
getNumElements()1007         uint16_t getNumElements() {
1008             return (uint16_t)fields[1].number16;
1009         }
1010 
1011         //!
1012         //! \brief      Sets the integer value of the NumElements field.
1013         //! \details    NumElements field is at index 1 in the internal
1014         //!             array of Fields.
1015         //! \param      [in] value.
1016         //!             Integer be assigned.
1017         //!
setNumElements(uint16_t value)1018         void setNumElements(uint16_t value) {
1019             fields[1].number16 = value;
1020         }
1021 
1022         //!
1023         //! \brief      Returns the integer value of the AttributeCount field.
1024         //! \details    AttributeCount field is at index 2 in the internal
1025         //!             array of Fields.
1026         //! \retval     An integer.
1027         //!
getAttributeCount()1028         uint8_t getAttributeCount() {
1029             return (uint8_t)fields[2].number8;
1030         }
1031 
1032         //!
1033         //! \brief      Sets the integer value of the AttributeCount field.
1034         //! \details    AttributeCount field is at index 2 in the internal
1035         //!             array of Fields.
1036         //! \param      [in] value.
1037         //!             Integer be assigned.
1038         //!
setAttributeCount(uint8_t value)1039         void setAttributeCount(uint8_t value) {
1040             fields[2].number8 = value;
1041         }
1042 
1043         //!
1044         //! \brief      Returns the reference to the vector of AttributeInfo objects.
1045         //! \details    SamplerInfo has a vector of AttributeInfo objects
1046         //!             that represents another entity within the vISA object format.
1047         //! \retval     Reference to the vector of AttributeInfo*.
1048         //!
getAttributeInfo()1049         std::vector<AttributeInfo*> &getAttributeInfo() {
1050             return attribute_info;
1051         }
1052 
1053         //!
1054         //! \brief      Parses one SamplerInfo object from ISA file.
1055         //! \details    Reads and parses all the fields of the SamplerInfo object
1056         //!             from the file buffer and returns the pointer immediately
1057         //!             after all this data.
1058         //!             If this class contains internal structs, their Parse
1059         //!             functions are called when corresponding.
1060         //! \param      [in] p.
1061         //!             Pointer to file buffer to start reading.
1062         //! \param      [in] end.
1063         //!             Pointer to end of file buffer.
1064         //! \param      [in] m.
1065         //!             Pointer ISAfile object.
1066         //! \retval     Pointer to file buffe after parsing one SamplerInfo object.
1067         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)1068         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
1069             unsigned i = 0, count = 0;
1070             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1071                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
1072                 if (!p) return m->setError("bad offset/size for SamplerInfo's field", i);
1073                 i++;
1074             }
1075             // AttributeInfo
1076             count = fields[fields[i].countField].number32;
1077             attribute_info.resize(count);
1078             for (unsigned j = 0; j < count; j++) {
1079                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
1080                 p = r->parse(p, end, m);
1081                 if (!p) {
1082                     delete r;
1083                     return 0;
1084                 }
1085                 attribute_info[j] = r;
1086             }
1087             i++;
1088             return p;
1089         }
1090 
1091         //!
1092         //! \brief      Adds all the SamplerInfo's fields to a buffer.
1093         //! \details    Every field from this class is added to a buffer
1094         //!             in order to be written into an ISA file afterwards
1095         //!             If this class contains other internal structus, their addToBuffer
1096         //!             functions are called when corresponding.
1097         //! \param      [out] buffer.
1098         //!             The buffer where the fields data will be added.
1099         //! \param      [in] m.
1100         //!             Pointer to ISAfile object.
1101         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)1102         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
1103             unsigned i = 0;
1104             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1105                 m->addToBuffer(fields[i], buffer);
1106                 i++;
1107             }
1108             // AttributeInfo
1109             for (AttributeInfo *r : attribute_info) {
1110                 r->addToBuffer(buffer, m);
1111             }
1112             i++;
1113         }
1114 
1115         //!
1116         //! \brief      Makes the changes needed to support 303 version's SamplerInfo.
1117         //! \details    This function is called when the current ISA file has the 303 version.
1118         //!             Initially all the objects are created with last version's format, so
1119         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
1120         //!             of fields can be needed.
1121         //!
setVersion303()1122         void setVersion303() {
1123             fields[0] = Datatype::TWO;
1124         }
1125     MEDIA_CLASS_DEFINE_END(vp__vISA__SamplerInfo)
1126     };
1127 
1128     //!
1129     //! \brief      LabelInfo Class.
1130     //! \details    This class represents the LabelInfo from vISA Object Format.
1131     //!             Provides getters, setters for its fields and structs as well as
1132     //!             functions to read/write it from/to file.
1133     //!
1134     class LabelInfo {
1135     public:
1136         std::array<Field, 4> fields = std::array<Field, 4>
1137         {
1138             Field(Datatype::FOUR), // name_index
1139                 Field(Datatype::ONE), // kind
1140                 Field(Datatype::ONE), // attribute_count
1141                 Field(Datatype::STRUCT, 2), // attribute_info
1142         };
1143         std::vector<AttributeInfo*> attribute_info;
1144 
1145         //!
1146         //! \brief      Constructor of LabelInfo class.
1147         //! \param      [in] version.
1148         //!             Version of current ISA file.
1149         //!
LabelInfo(unsigned version)1150         LabelInfo(unsigned version) {
1151             if (version <= 303) setVersion303();
1152         }
1153 
1154         //!
1155         //! \brief      Destructor of LabelInfo class.
1156         //!
~LabelInfo()1157         ~LabelInfo() {
1158             for (AttributeInfo *s : attribute_info)
1159             {
1160                 if (s)
1161                 {
1162                     delete s;
1163                 }
1164             }
1165         }
1166 
1167         //!
1168         //! \brief      Returns the integer value of the NameIndex field.
1169         //! \details    NameIndex field is at index 0 in the internal
1170         //!             array of Fields.
1171         //! \retval     An integer.
1172         //!
getNameIndex()1173         uint32_t getNameIndex() {
1174             return (uint32_t)fields[0].number32;
1175         }
1176 
1177         //!
1178         //! \brief      Sets the integer value of the NameIndex field.
1179         //! \details    NameIndex field is at index 0 in the internal
1180         //!             array of Fields.
1181         //! \param      [in] value.
1182         //!             Integer be assigned.
1183         //!
setNameIndex(uint32_t value)1184         void setNameIndex(uint32_t value) {
1185             fields[0].number32 = value;
1186         }
1187 
1188         //!
1189         //! \brief      Returns the integer value of the Kind field.
1190         //! \details    Kind field is at index 1 in the internal
1191         //!             array of Fields.
1192         //! \retval     An integer.
1193         //!
getKind()1194         uint8_t getKind() {
1195             return (uint8_t)fields[1].number8;
1196         }
1197 
1198         //!
1199         //! \brief      Sets the integer value of the Kind field.
1200         //! \details    Kind field is at index 1 in the internal
1201         //!             array of Fields.
1202         //! \param      [in] value.
1203         //!             Integer be assigned.
1204         //!
setKind(uint8_t value)1205         void setKind(uint8_t value) {
1206             fields[1].number8 = value;
1207         }
1208 
1209         //!
1210         //! \brief      Returns the integer value of the AttributeCount field.
1211         //! \details    AttributeCount field is at index 2 in the internal
1212         //!             array of Fields.
1213         //! \retval     An integer.
1214         //!
getAttributeCount()1215         uint8_t getAttributeCount() {
1216             return (uint8_t)fields[2].number8;
1217         }
1218 
1219         //!
1220         //! \brief      Sets the integer value of the AttributeCount field.
1221         //! \details    AttributeCount field is at index 2 in the internal
1222         //!             array of Fields.
1223         //! \param      [in] value.
1224         //!             Integer be assigned.
1225         //!
setAttributeCount(uint8_t value)1226         void setAttributeCount(uint8_t value) {
1227             fields[2].number8 = value;
1228         }
1229 
1230         //!
1231         //! \brief      Returns the reference to the vector of AttributeInfo objects.
1232         //! \details    LabelInfo has a vector of AttributeInfo objects
1233         //!             that represents another entity within the vISA object format.
1234         //! \retval     Reference to the vector of AttributeInfo*.
1235         //!
getAttributeInfo()1236         std::vector<AttributeInfo*> &getAttributeInfo() {
1237             return attribute_info;
1238         }
1239 
1240         //!
1241         //! \brief      Parses one LabelInfo object from ISA file.
1242         //! \details    Reads and parses all the fields of the LabelInfo object
1243         //!             from the file buffer and returns the pointer immediately
1244         //!             after all this data.
1245         //!             If this class contains internal structs, their Parse
1246         //!             functions are called when corresponding.
1247         //! \param      [in] p.
1248         //!             Pointer to file buffer to start reading.
1249         //! \param      [in] end.
1250         //!             Pointer to end of file buffer.
1251         //! \param      [in] m.
1252         //!             Pointer ISAfile object.
1253         //! \retval     Pointer to file buffe after parsing one LabelInfo object.
1254         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)1255         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
1256             unsigned i = 0, count = 0;
1257             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1258                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
1259                 if (!p) return m->setError("bad offset/size for LabelInfo's field", i);
1260                 i++;
1261             }
1262             // AttributeInfo
1263             count = fields[fields[i].countField].number32;
1264             attribute_info.resize(count);
1265             for (unsigned j = 0; j < count; j++) {
1266                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
1267                 p = r->parse(p, end, m);
1268                 if (!p) {
1269                     delete r;
1270                     return 0;
1271                 }
1272                 attribute_info[j] = r;
1273             }
1274             i++;
1275             return p;
1276         }
1277 
1278         //!
1279         //! \brief      Adds all the LabelInfo's fields to a buffer.
1280         //! \details    Every field from this class is added to a buffer
1281         //!             in order to be written into an ISA file afterwards
1282         //!             If this class contains other internal structus, their addToBuffer
1283         //!             functions are called when corresponding.
1284         //! \param      [out] buffer.
1285         //!             The buffer where the fields data will be added.
1286         //! \param      [in] m.
1287         //!             Pointer to ISAfile object.
1288         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)1289         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
1290             unsigned i = 0;
1291             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1292                 m->addToBuffer(fields[i], buffer);
1293                 i++;
1294             }
1295             // AttributeInfo
1296             for (AttributeInfo *r : attribute_info) {
1297                 r->addToBuffer(buffer, m);
1298             }
1299             i++;
1300         }
1301 
1302         //!
1303         //! \brief      Makes the changes needed to support 303 version's LabelInfo.
1304         //! \details    This function is called when the current ISA file has the 303 version.
1305         //!             Initially all the objects are created with last version's format, so
1306         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
1307         //!             of fields can be needed.
1308         //!
setVersion303()1309         void setVersion303() {
1310             fields[0] = Datatype::TWO;
1311         }
1312     MEDIA_CLASS_DEFINE_END(vp__vISA__LabelInfo)
1313     };
1314 
1315     //!
1316     //! \brief      PredicateInfo Class.
1317     //! \details    This class represents the PredicateInfo from vISA Object Format.
1318     //!             Provides getters, setters for its fields and structs as well as
1319     //!             functions to read/write it from/to file.
1320     //!
1321     class PredicateInfo {
1322     public:
1323         std::array<Field, 4> fields = std::array<Field, 4>
1324         {
1325             Field(Datatype::FOUR), // name_index
1326                 Field(Datatype::TWO), // num_elements
1327                 Field(Datatype::ONE), // attribute_count
1328                 Field(Datatype::STRUCT, 2), // attribute_info
1329         };
1330         std::vector<AttributeInfo*> attribute_info;
1331 
1332         //!
1333         //! \brief      Constructor of PredicateInfo class.
1334         //! \param      [in] version.
1335         //!             Version of current ISA file.
1336         //!
PredicateInfo(unsigned version)1337         PredicateInfo(unsigned version) {
1338             if (version <= 303) setVersion303();
1339         }
1340 
1341         //!
1342         //! \brief      Destructor of PredicateInfo class.
1343         //!
~PredicateInfo()1344         ~PredicateInfo() {
1345             for (AttributeInfo *s : attribute_info)
1346             {
1347                 if (s)
1348                 {
1349                     delete s;
1350                 }
1351             }
1352         }
1353 
1354         //!
1355         //! \brief      Returns the integer value of the NameIndex field.
1356         //! \details    NameIndex field is at index 0 in the internal
1357         //!             array of Fields.
1358         //! \retval     An integer.
1359         //!
getNameIndex()1360         uint32_t getNameIndex() {
1361             return (uint32_t)fields[0].number32;
1362         }
1363 
1364         //!
1365         //! \brief      Sets the integer value of the NameIndex field.
1366         //! \details    NameIndex field is at index 0 in the internal
1367         //!             array of Fields.
1368         //! \param      [in] value.
1369         //!             Integer be assigned.
1370         //!
setNameIndex(uint32_t value)1371         void setNameIndex(uint32_t value) {
1372             fields[0].number32 = value;
1373         }
1374 
1375         //!
1376         //! \brief      Returns the integer value of the NumElements field.
1377         //! \details    NumElements field is at index 1 in the internal
1378         //!             array of Fields.
1379         //! \retval     An integer.
1380         //!
getNumElements()1381         uint16_t getNumElements() {
1382             return (uint16_t)fields[1].number16;
1383         }
1384 
1385         //!
1386         //! \brief      Sets the integer value of the NumElements field.
1387         //! \details    NumElements field is at index 1 in the internal
1388         //!             array of Fields.
1389         //! \param      [in] value.
1390         //!             Integer be assigned.
1391         //!
setNumElements(uint16_t value)1392         void setNumElements(uint16_t value) {
1393             fields[1].number16 = value;
1394         }
1395 
1396         //!
1397         //! \brief      Returns the integer value of the AttributeCount field.
1398         //! \details    AttributeCount field is at index 2 in the internal
1399         //!             array of Fields.
1400         //! \retval     An integer.
1401         //!
getAttributeCount()1402         uint8_t getAttributeCount() {
1403             return (uint8_t)fields[2].number8;
1404         }
1405 
1406         //!
1407         //! \brief      Sets the integer value of the AttributeCount field.
1408         //! \details    AttributeCount field is at index 2 in the internal
1409         //!             array of Fields.
1410         //! \param      [in] value.
1411         //!             Integer be assigned.
1412         //!
setAttributeCount(uint8_t value)1413         void setAttributeCount(uint8_t value) {
1414             fields[2].number8 = value;
1415         }
1416 
1417         //!
1418         //! \brief      Returns the reference to the vector of AttributeInfo objects.
1419         //! \details    PredicateInfo has a vector of AttributeInfo objects
1420         //!             that represents another entity within the vISA object format.
1421         //! \retval     Reference to the vector of AttributeInfo*.
1422         //!
getAttributeInfo()1423         std::vector<AttributeInfo*> &getAttributeInfo() {
1424             return attribute_info;
1425         }
1426 
1427         //!
1428         //! \brief      Parses one PredicateInfo object from ISA file.
1429         //! \details    Reads and parses all the fields of the PredicateInfo object
1430         //!             from the file buffer and returns the pointer immediately
1431         //!             after all this data.
1432         //!             If this class contains internal structs, their Parse
1433         //!             functions are called when corresponding.
1434         //! \param      [in] p.
1435         //!             Pointer to file buffer to start reading.
1436         //! \param      [in] end.
1437         //!             Pointer to end of file buffer.
1438         //! \param      [in] m.
1439         //!             Pointer ISAfile object.
1440         //! \retval     Pointer to file buffe after parsing one PredicateInfo object.
1441         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)1442         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
1443             unsigned i = 0, count = 0;
1444             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1445                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
1446                 if (!p) return m->setError("bad offset/size for PredicateInfo's field", i);
1447                 i++;
1448             }
1449             // AttributeInfo
1450             count = fields[fields[i].countField].number32;
1451             attribute_info.resize(count);
1452             for (unsigned j = 0; j < count; j++) {
1453                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
1454                 p = r->parse(p, end, m);
1455                 if (!p) {
1456                     delete r;
1457                     return 0;
1458                 }
1459                 attribute_info[j] = r;
1460             }
1461             i++;
1462             return p;
1463         }
1464 
1465         //!
1466         //! \brief      Adds all the PredicateInfo's fields to a buffer.
1467         //! \details    Every field from this class is added to a buffer
1468         //!             in order to be written into an ISA file afterwards
1469         //!             If this class contains other internal structus, their addToBuffer
1470         //!             functions are called when corresponding.
1471         //! \param      [out] buffer.
1472         //!             The buffer where the fields data will be added.
1473         //! \param      [in] m.
1474         //!             Pointer to ISAfile object.
1475         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)1476         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
1477             unsigned i = 0;
1478             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1479                 m->addToBuffer(fields[i], buffer);
1480                 i++;
1481             }
1482             // AttributeInfo
1483             for (AttributeInfo *r : attribute_info) {
1484                 r->addToBuffer(buffer, m);
1485             }
1486             i++;
1487         }
1488 
1489         //!
1490         //! \brief      Makes the changes needed to support 303 version's PredicateInfo.
1491         //! \details    This function is called when the current ISA file has the 303 version.
1492         //!             Initially all the objects are created with last version's format, so
1493         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
1494         //!             of fields can be needed.
1495         //!
setVersion303()1496         void setVersion303() {
1497             fields[0] = Datatype::TWO;
1498         }
1499     MEDIA_CLASS_DEFINE_END(vp__vISA__PredicateInfo)
1500     };
1501 
1502     //!
1503     //! \brief      RelocationInfo Class.
1504     //! \details    This class represents the RelocationInfo from vISA Object Format.
1505     //!             Provides getters, setters for its fields and structs as well as
1506     //!             functions to read/write it from/to file.
1507     //!
1508     class RelocationInfo {
1509     public:
1510         std::array<Field, 2> fields = std::array<Field, 2>
1511         {
1512             Field(Datatype::TWO), // symbolic_index
1513                 Field(Datatype::TWO) // resolved_index
1514         };
1515 
1516         //!
1517         //! \brief      Constructor of RelocationInfo class.
1518         //! \param      [in] version.
1519         //!             Version of current ISA file.
1520         //!
RelocationInfo(unsigned version)1521         RelocationInfo(unsigned version) {}
1522 
1523         //!
1524         //! \brief      Constructor of RelocationInfo class.
1525         //!
RelocationInfo()1526         RelocationInfo() {}
1527 
1528         //!
1529         //! \brief      Copy Constructor of RelocationInfo class.
1530         //! \param      [in] other.
1531         //!             Reference to object to copy..
1532         //!
RelocationInfo(const RelocationInfo & other)1533         RelocationInfo(const RelocationInfo& other) {
1534             fields = other.fields;
1535         }
1536 
1537         //!
1538         //! \brief      Assignment operator.
1539         //! \param      [in] other.
1540         //!             Reference to object to copy..
1541         //!
1542         RelocationInfo& operator= (const RelocationInfo& other) {
1543             if (this != &other) {
1544                 fields = other.fields;
1545             }
1546             return *this;
1547         }
1548 
1549         //!
1550         //! \brief      Destructor of RelocationInfo class.
1551         //!
~RelocationInfo()1552         ~RelocationInfo() {
1553         }
1554 
1555         //!
1556         //! \brief      Returns the integer value of the SymbolicIndex field.
1557         //! \details    SymbolicIndex field is at index 0 in the internal
1558         //!             array of Fields.
1559         //! \retval     An integer.
1560         //!
getSymbolicIndex()1561         uint16_t getSymbolicIndex() {
1562             return (uint16_t)fields[0].number16;
1563         }
1564 
1565         //!
1566         //! \brief      Sets the integer value of the SymbolicIndex field.
1567         //! \details    SymbolicIndex field is at index 0 in the internal
1568         //!             array of Fields.
1569         //! \param      [in] value.
1570         //!             Integer be assigned.
1571         //!
setSymbolicIndex(uint16_t value)1572         void setSymbolicIndex(uint16_t value) {
1573             fields[0].number16 = value;
1574         }
1575 
1576         //!
1577         //! \brief      Returns the integer value of the ResolvedIndex field.
1578         //! \details    ResolvedIndex field is at index 1 in the internal
1579         //!             array of Fields.
1580         //! \retval     An integer.
1581         //!
getResolvedIndex()1582         uint16_t getResolvedIndex() {
1583             return (uint16_t)fields[1].number16;
1584         }
1585 
1586         //!
1587         //! \brief      Sets the integer value of the ResolvedIndex field.
1588         //! \details    ResolvedIndex field is at index 1 in the internal
1589         //!             array of Fields.
1590         //! \param      [in] value.
1591         //!             Integer be assigned.
1592         //!
setResolvedIndex(uint16_t value)1593         void setResolvedIndex(uint16_t value) {
1594             fields[1].number16 = value;
1595         }
1596 
1597         //!
1598         //! \brief      Parses one RelocationInfo object from ISA file.
1599         //! \details    Reads and parses all the fields of the RelocationInfo object
1600         //!             from the file buffer and returns the pointer immediately
1601         //!             after all this data.
1602         //!             If this class contains internal structs, their Parse
1603         //!             functions are called when corresponding.
1604         //! \param      [in] p.
1605         //!             Pointer to file buffer to start reading.
1606         //! \param      [in] end.
1607         //!             Pointer to end of file buffer.
1608         //! \param      [in] m.
1609         //!             Pointer ISAfile object.
1610         //! \retval     Pointer to file buffe after parsing one RelocationInfo object.
1611         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)1612         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
1613             unsigned i = 0;
1614             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1615                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
1616                 if (!p) return m->setError("bad offset/size for RelocationInfo's field", i);
1617                 i++;
1618             }
1619             return p;
1620         }
1621 
1622         //!
1623         //! \brief      Adds all the RelocationInfo's fields to a buffer.
1624         //! \details    Every field from this class is added to a buffer
1625         //!             in order to be written into an ISA file afterwards
1626         //!             If this class contains other internal structus, their addToBuffer
1627         //!             functions are called when corresponding.
1628         //! \param      [out] buffer.
1629         //!             The buffer where the fields data will be added.
1630         //! \param      [in] m.
1631         //!             Pointer to ISAfile object.
1632         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)1633         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
1634             unsigned i = 0;
1635             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1636                 m->addToBuffer(fields[i], buffer);
1637                 i++;
1638             }
1639         }
1640     MEDIA_CLASS_DEFINE_END(vp__vISA__RelocationInfo)
1641     };
1642 
1643     //!
1644     //! \brief      AddressInfo Class.
1645     //! \details    This class represents the AddressInfo from vISA Object Format.
1646     //!             Provides getters, setters for its fields and structs as well as
1647     //!             functions to read/write it from/to file.
1648     //!
1649     class AddressInfo {
1650     public:
1651         std::array<Field, 4> fields = std::array<Field, 4>
1652         {
1653             Field(Datatype::FOUR), // name_index
1654                 Field(Datatype::TWO), // num_elements
1655                 Field(Datatype::ONE), // attribute_count
1656                 Field(Datatype::STRUCT, 2), // attribute_info
1657         };
1658         std::vector<AttributeInfo*> attribute_info;
1659 
1660         //!
1661         //! \brief      Constructor of AddressInfo class.
1662         //! \param      [in] version.
1663         //!             Version of current ISA file.
1664         //!
AddressInfo(unsigned version)1665         AddressInfo(unsigned version) {
1666             if (version <= 303) setVersion303();
1667         }
1668 
1669         //!
1670         //! \brief      Destructor of AddressInfo class.
1671         //!
~AddressInfo()1672         ~AddressInfo() {
1673             for (AttributeInfo *s : attribute_info)
1674             {
1675                 if (s)
1676                 {
1677                     delete s;
1678                 }
1679             }
1680         }
1681 
1682         //!
1683         //! \brief      Returns the integer value of the NameIndex field.
1684         //! \details    NameIndex field is at index 0 in the internal
1685         //!             array of Fields.
1686         //! \retval     An integer.
1687         //!
getNameIndex()1688         uint32_t getNameIndex() {
1689             return (uint32_t)fields[0].number32;
1690         }
1691 
1692         //!
1693         //! \brief      Sets the integer value of the NameIndex field.
1694         //! \details    NameIndex field is at index 0 in the internal
1695         //!             array of Fields.
1696         //! \param      [in] value.
1697         //!             Integer be assigned.
1698         //!
setNameIndex(uint32_t value)1699         void setNameIndex(uint32_t value) {
1700             fields[0].number32 = value;
1701         }
1702 
1703         //!
1704         //! \brief      Returns the integer value of the NumElements field.
1705         //! \details    NumElements field is at index 1 in the internal
1706         //!             array of Fields.
1707         //! \retval     An integer.
1708         //!
getNumElements()1709         uint16_t getNumElements() {
1710             return (uint16_t)fields[1].number16;
1711         }
1712 
1713         //!
1714         //! \brief      Sets the integer value of the NumElements field.
1715         //! \details    NumElements field is at index 1 in the internal
1716         //!             array of Fields.
1717         //! \param      [in] value.
1718         //!             Integer be assigned.
1719         //!
setNumElements(uint16_t value)1720         void setNumElements(uint16_t value) {
1721             fields[1].number16 = value;
1722         }
1723 
1724         //!
1725         //! \brief      Returns the integer value of the AttributeCount field.
1726         //! \details    AttributeCount field is at index 2 in the internal
1727         //!             array of Fields.
1728         //! \retval     An integer.
1729         //!
getAttributeCount()1730         uint8_t getAttributeCount() {
1731             return (uint8_t)fields[2].number8;
1732         }
1733 
1734         //!
1735         //! \brief      Sets the integer value of the AttributeCount field.
1736         //! \details    AttributeCount field is at index 2 in the internal
1737         //!             array of Fields.
1738         //! \param      [in] value.
1739         //!             Integer be assigned.
1740         //!
setAttributeCount(uint8_t value)1741         void setAttributeCount(uint8_t value) {
1742             fields[2].number8 = value;
1743         }
1744 
1745         //!
1746         //! \brief      Returns the reference to the vector of AttributeInfo objects.
1747         //! \details    AddressInfo has a vector of AttributeInfo objects
1748         //!             that represents another entity within the vISA object format.
1749         //! \retval     Reference to the vector of AttributeInfo*.
1750         //!
getAttributeInfo()1751         std::vector<AttributeInfo*> &getAttributeInfo() {
1752             return attribute_info;
1753         }
1754 
1755         //!
1756         //! \brief      Parses one AddressInfo object from ISA file.
1757         //! \details    Reads and parses all the fields of the AddressInfo object
1758         //!             from the file buffer and returns the pointer immediately
1759         //!             after all this data.
1760         //!             If this class contains internal structs, their Parse
1761         //!             functions are called when corresponding.
1762         //! \param      [in] p.
1763         //!             Pointer to file buffer to start reading.
1764         //! \param      [in] end.
1765         //!             Pointer to end of file buffer.
1766         //! \param      [in] m.
1767         //!             Pointer ISAfile object.
1768         //! \retval     Pointer to file buffe after parsing one AddressInfo object.
1769         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)1770         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
1771             unsigned i = 0, count = 0;
1772             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1773                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
1774                 if (!p) return m->setError("bad offset/size for AddressInfo's field", i);
1775                 i++;
1776             }
1777             // AttributeInfo
1778             count = fields[fields[i].countField].number32;
1779             attribute_info.resize(count);
1780             for (unsigned j = 0; j < count; j++) {
1781                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
1782                 p = r->parse(p, end, m);
1783                 if (!p) {
1784                     delete r;
1785                     return 0;
1786                 }
1787                 attribute_info[j] = r;
1788             }
1789             i++;
1790             return p;
1791         }
1792 
1793         //!
1794         //! \brief      Adds all the AddressInfo's fields to a buffer.
1795         //! \details    Every field from this class is added to a buffer
1796         //!             in order to be written into an ISA file afterwards
1797         //!             If this class contains other internal structus, their addToBuffer
1798         //!             functions are called when corresponding.
1799         //! \param      [out] buffer.
1800         //!             The buffer where the fields data will be added.
1801         //! \param      [in] m.
1802         //!             Pointer to ISAfile object.
1803         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)1804         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
1805             unsigned i = 0;
1806             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
1807                 m->addToBuffer(fields[i], buffer);
1808                 i++;
1809             }
1810             // AttributeInfo
1811             for (AttributeInfo *r : attribute_info) {
1812                 r->addToBuffer(buffer, m);
1813             }
1814             i++;
1815         }
1816 
1817         //!
1818         //! \brief      Makes the changes needed to support 303 version's AddressInfo.
1819         //! \details    This function is called when the current ISA file has the 303 version.
1820         //!             Initially all the objects are created with last version's format, so
1821         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
1822         //!             of fields can be needed.
1823         //!
setVersion303()1824         void setVersion303() {
1825             fields[0] = Datatype::TWO;
1826         }
1827     MEDIA_CLASS_DEFINE_END(vp__vISA__AddressInfo)
1828     };
1829 
1830     //!
1831     //! \brief      Variable Class.
1832     //! \details    This class represents the Variable from vISA Object Format.
1833     //!             Provides getters, setters for its fields and structs as well as
1834     //!             functions to read/write it from/to file.
1835     //!
1836     class Variable {
1837     public:
1838         std::array<Field, 8> fields = std::array<Field, 8>
1839         {
1840             Field(Datatype::FOUR), // name_index
1841                 Field(Datatype::ONE), // bit_properties
1842                 Field(Datatype::TWO), // num_elements
1843                 Field(Datatype::FOUR), // alias_index
1844                 Field(Datatype::TWO), // alias_offset
1845                 Field(Datatype::ONE), // alias_scope_specifier
1846                 Field(Datatype::ONE), // attribute_count
1847                 Field(Datatype::STRUCT, 6), // attribute_info
1848         };
1849         std::vector<AttributeInfo*> attribute_info;
1850 
1851         //!
1852         //! \brief      Constructor of Variable class.
1853         //! \param      [in] version.
1854         //!             Version of current ISA file.
1855         //!
Variable(unsigned version)1856         Variable(unsigned version) {
1857             if (version <= 303) setVersion303();
1858         }
1859 
1860         //!
1861         //! \brief      Destructor of Variable class.
1862         //!
~Variable()1863         ~Variable() {
1864             for (AttributeInfo *s : attribute_info)
1865             {
1866                 if (s)
1867                 {
1868                     delete s;
1869                 }
1870             }
1871         }
1872 
1873         //!
1874         //! \brief      Returns the integer value of the NameIndex field.
1875         //! \details    NameIndex field is at index 0 in the internal
1876         //!             array of Fields.
1877         //! \retval     An integer.
1878         //!
getNameIndex()1879         uint32_t getNameIndex() {
1880             return (uint32_t)fields[0].number32;
1881         }
1882 
1883         //!
1884         //! \brief      Sets the integer value of the NameIndex field.
1885         //! \details    NameIndex field is at index 0 in the internal
1886         //!             array of Fields.
1887         //! \param      [in] value.
1888         //!             Integer be assigned.
1889         //!
setNameIndex(uint32_t value)1890         void setNameIndex(uint32_t value) {
1891             fields[0].number32 = value;
1892         }
1893 
1894         //!
1895         //! \brief      Returns the integer value of the BitProperties field.
1896         //! \details    BitProperties field is at index 1 in the internal
1897         //!             array of Fields.
1898         //! \retval     An integer.
1899         //!
getBitProperties()1900         uint8_t getBitProperties() {
1901             return (uint8_t)fields[1].number8;
1902         }
1903 
1904         //!
1905         //! \brief      Sets the integer value of the BitProperties field.
1906         //! \details    BitProperties field is at index 1 in the internal
1907         //!             array of Fields.
1908         //! \param      [in] value.
1909         //!             Integer be assigned.
1910         //!
setBitProperties(uint8_t value)1911         void setBitProperties(uint8_t value) {
1912             fields[1].number8 = value;
1913         }
1914 
1915         //!
1916         //! \brief      Returns the integer value of the NumElements field.
1917         //! \details    NumElements field is at index 2 in the internal
1918         //!             array of Fields.
1919         //! \retval     An integer.
1920         //!
getNumElements()1921         uint16_t getNumElements() {
1922             return (uint16_t)fields[2].number16;
1923         }
1924 
1925         //!
1926         //! \brief      Sets the integer value of the NumElements field.
1927         //! \details    NumElements field is at index 2 in the internal
1928         //!             array of Fields.
1929         //! \param      [in] value.
1930         //!             Integer be assigned.
1931         //!
setNumElements(uint16_t value)1932         void setNumElements(uint16_t value) {
1933             fields[2].number16 = value;
1934         }
1935 
1936         //!
1937         //! \brief      Returns the integer value of the AliasIndex field.
1938         //! \details    AliasIndex field is at index 3 in the internal
1939         //!             array of Fields.
1940         //! \retval     An integer.
1941         //!
getAliasIndex()1942         uint32_t getAliasIndex() {
1943             return (uint32_t)fields[3].number32;
1944         }
1945 
1946         //!
1947         //! \brief      Sets the integer value of the AliasIndex field.
1948         //! \details    AliasIndex field is at index 3 in the internal
1949         //!             array of Fields.
1950         //! \param      [in] value.
1951         //!             Integer be assigned.
1952         //!
setAliasIndex(uint32_t value)1953         void setAliasIndex(uint32_t value) {
1954             fields[3].number32 = value;
1955         }
1956 
1957         //!
1958         //! \brief      Returns the integer value of the AliasOffset field.
1959         //! \details    AliasOffset field is at index 4 in the internal
1960         //!             array of Fields.
1961         //! \retval     An integer.
1962         //!
getAliasOffset()1963         uint16_t getAliasOffset() {
1964             return (uint16_t)fields[4].number16;
1965         }
1966 
1967         //!
1968         //! \brief      Sets the integer value of the AliasOffset field.
1969         //! \details    AliasOffset field is at index 4 in the internal
1970         //!             array of Fields.
1971         //! \param      [in] value.
1972         //!             Integer be assigned.
1973         //!
setAliasOffset(uint16_t value)1974         void setAliasOffset(uint16_t value) {
1975             fields[4].number16 = value;
1976         }
1977 
1978         //!
1979         //! \brief      Returns the integer value of the AliasScopeSpecifier field.
1980         //! \details    AliasScopeSpecifier field is at index 5 in the internal
1981         //!             array of Fields.
1982         //! \retval     An integer.
1983         //!
getAliasScopeSpecifier()1984         uint8_t getAliasScopeSpecifier() {
1985             return (uint8_t)fields[5].number8;
1986         }
1987 
1988         //!
1989         //! \brief      Sets the integer value of the AliasScopeSpecifier field.
1990         //! \details    AliasScopeSpecifier field is at index 5 in the internal
1991         //!             array of Fields.
1992         //! \param      [in] value.
1993         //!             Integer be assigned.
1994         //!
setAliasScopeSpecifier(uint8_t value)1995         void setAliasScopeSpecifier(uint8_t value) {
1996             fields[5].number8 = value;
1997         }
1998 
1999         //!
2000         //! \brief      Returns the integer value of the AttributeCount field.
2001         //! \details    AttributeCount field is at index 6 in the internal
2002         //!             array of Fields.
2003         //! \retval     An integer.
2004         //!
getAttributeCount()2005         uint8_t getAttributeCount() {
2006             return (uint8_t)fields[6].number8;
2007         }
2008 
2009         //!
2010         //! \brief      Sets the integer value of the AttributeCount field.
2011         //! \details    AttributeCount field is at index 6 in the internal
2012         //!             array of Fields.
2013         //! \param      [in] value.
2014         //!             Integer be assigned.
2015         //!
setAttributeCount(uint8_t value)2016         void setAttributeCount(uint8_t value) {
2017             fields[6].number8 = value;
2018         }
2019 
2020         //!
2021         //! \brief      Returns the reference to the vector of AttributeInfo objects.
2022         //! \details    Variable has a vector of AttributeInfo objects
2023         //!             that represents another entity within the vISA object format.
2024         //! \retval     Reference to the vector of AttributeInfo*.
2025         //!
getAttributeInfo()2026         std::vector<AttributeInfo*> &getAttributeInfo() {
2027             return attribute_info;
2028         }
2029 
2030         //!
2031         //! \brief      Parses one Variable object from ISA file.
2032         //! \details    Reads and parses all the fields of the Variable object
2033         //!             from the file buffer and returns the pointer immediately
2034         //!             after all this data.
2035         //!             If this class contains internal structs, their Parse
2036         //!             functions are called when corresponding.
2037         //! \param      [in] p.
2038         //!             Pointer to file buffer to start reading.
2039         //! \param      [in] end.
2040         //!             Pointer to end of file buffer.
2041         //! \param      [in] m.
2042         //!             Pointer ISAfile object.
2043         //! \retval     Pointer to file buffe after parsing one Variable object.
2044         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)2045         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
2046             unsigned i = 0, count = 0;
2047             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2048                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
2049                 if (!p) return m->setError("bad offset/size for Variable's field", i);
2050                 i++;
2051             }
2052             // AttributeInfo
2053             count = fields[fields[i].countField].number32;
2054             attribute_info.resize(count);
2055             for (unsigned j = 0; j < count; j++) {
2056                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
2057                 p = r->parse(p, end, m);
2058                 if (!p) {
2059                     delete r;
2060                     return 0;
2061                 }
2062                 attribute_info[j] = r;
2063             }
2064             i++;
2065             return p;
2066         }
2067 
2068         //!
2069         //! \brief      Adds all the Variable's fields to a buffer.
2070         //! \details    Every field from this class is added to a buffer
2071         //!             in order to be written into an ISA file afterwards
2072         //!             If this class contains other internal structus, their addToBuffer
2073         //!             functions are called when corresponding.
2074         //! \param      [out] buffer.
2075         //!             The buffer where the fields data will be added.
2076         //! \param      [in] m.
2077         //!             Pointer to ISAfile object.
2078         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)2079         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
2080             unsigned i = 0;
2081             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2082                 m->addToBuffer(fields[i], buffer);
2083                 i++;
2084             }
2085             // AttributeInfo
2086             for (AttributeInfo *r : attribute_info) {
2087                 r->addToBuffer(buffer, m);
2088             }
2089             i++;
2090         }
2091 
2092         //!
2093         //! \brief      Makes the changes needed to support 303 version's Variable.
2094         //! \details    This function is called when the current ISA file has the 303 version.
2095         //!             Initially all the objects are created with last version's format, so
2096         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
2097         //!             of fields can be needed.
2098         //!
setVersion303()2099         void setVersion303() {
2100             fields[0] = Datatype::TWO;
2101             fields[3] = Datatype::TWO;
2102         }
2103     MEDIA_CLASS_DEFINE_END(vp__vISA__Variable)
2104     };
2105 
2106     //!
2107     //! \brief      StringPool Class.
2108     //! \details    This class represents the StringPool from vISA Object Format.
2109     //!             Provides getters, setters for its fields and structs as well as
2110     //!             functions to read/write it from/to file.
2111     //!
2112     class StringPool {
2113     public:
2114         std::array<Field, 1> fields = std::array<Field, 1>
2115         {
2116             Field(Datatype::VARCHAR_POOL) // string
2117         };
2118 
2119         //!
2120         //! \brief      Constructor of StringPool class.
2121         //! \param      [in] version.
2122         //!             Version of current ISA file.
2123         //!
StringPool(unsigned version)2124         StringPool(unsigned version) {}
2125 
2126         //!
2127         //! \brief      Copy Constructor of StringPool class.
2128         //! \param      [in] other.
2129         //!             Reference to object to copy..
2130         //!
StringPool(const StringPool & other)2131         StringPool(const StringPool& other) {
2132             fields = other.fields;
2133         }
2134 
2135         //!
2136         //! \brief      Assignment operator.
2137         //! \param      [in] other.
2138         //!             Reference to object to copy..
2139         //!
2140         StringPool& operator= (const StringPool& other) {
2141             if (this != &other) {
2142                 fields = other.fields;
2143             }
2144             return *this;
2145         }
2146 
2147         //!
2148         //! \brief      Destructor of StringPool class.
2149         //!
~StringPool()2150         ~StringPool() {
2151         }
2152 
2153         //!
2154         //! \brief      Returns the string value of the String field.
2155         //! \details    String field is at index 0 in the internal
2156         //!             array of Fields.
2157         //! \retval     A pointer to the string (const char*).
2158         //!
getString()2159         const char * getString() {
2160             return fields[0].varchar;
2161         }
2162 
2163         //!
2164         //! \brief      Sets the string value of the String field.
2165         //! \details    String field is at index 0 in the internal
2166         //!             array of Fields.
2167         //! \param      [in] value.
2168         //!             Pointer to string (char*) to be assigned.
2169         //!
setString(char * value)2170         void setString(char * value) {
2171             fields[0].varchar = value;
2172         }
2173 
2174         //!
2175         //! \brief      Parses one StringPool object from ISA file.
2176         //! \details    Reads and parses all the fields of the StringPool object
2177         //!             from the file buffer and returns the pointer immediately
2178         //!             after all this data.
2179         //!             If this class contains internal structs, their Parse
2180         //!             functions are called when corresponding.
2181         //! \param      [in] p.
2182         //!             Pointer to file buffer to start reading.
2183         //! \param      [in] end.
2184         //!             Pointer to end of file buffer.
2185         //! \param      [in] m.
2186         //!             Pointer ISAfile object.
2187         //! \retval     Pointer to file buffe after parsing one StringPool object.
2188         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)2189         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
2190             unsigned i = 0;
2191             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2192                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
2193                 if (!p) return m->setError("bad offset/size for StringPool's field", i);
2194                 i++;
2195             }
2196             return p;
2197         }
2198 
2199         //!
2200         //! \brief      Adds all the StringPool's fields to a buffer.
2201         //! \details    Every field from this class is added to a buffer
2202         //!             in order to be written into an ISA file afterwards
2203         //!             If this class contains other internal structus, their addToBuffer
2204         //!             functions are called when corresponding.
2205         //! \param      [out] buffer.
2206         //!             The buffer where the fields data will be added.
2207         //! \param      [in] m.
2208         //!             Pointer to ISAfile object.
2209         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)2210         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
2211             unsigned i = 0;
2212             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2213                 m->addToBuffer(fields[i], buffer);
2214                 i++;
2215             }
2216         }
2217     MEDIA_CLASS_DEFINE_END(vp__vISA__StringPool)
2218     };
2219 
2220     //!
2221     //! \brief      GenBinary Class.
2222     //! \details    This class represents the GenBinary from vISA Object Format.
2223     //!             Provides getters, setters for its fields and structs as well as
2224     //!             functions to read/write it from/to file.
2225     //!
2226     class GenBinary {
2227     public:
2228         std::array<Field, 3> fields = std::array<Field, 3>
2229         {
2230             Field(Datatype::ONE), // gen_platform
2231                 Field(Datatype::FOUR), // binary_offset
2232                 Field(Datatype::FOUR) // binary_size
2233         };
2234 
2235         //!
2236         //! \brief      Constructor of GenBinary class.
2237         //! \param      [in] version.
2238         //!             Version of current ISA file.
2239         //!
GenBinary(unsigned version)2240         GenBinary(unsigned version) {}
2241 
2242         //!
2243         //! \brief      Constructor of GenBinary class.
2244         //!
GenBinary()2245         GenBinary() {}
2246 
2247         //!
2248         //! \brief      Copy Constructor of GenBinary class.
2249         //! \param      [in] other.
2250         //!             Reference to object to copy..
2251         //!
GenBinary(const GenBinary & other)2252         GenBinary(const GenBinary& other) {
2253             fields = other.fields;
2254         }
2255 
2256         //!
2257         //! \brief      Assignment operator.
2258         //! \param      [in] other.
2259         //!             Reference to object to copy..
2260         //!
2261         GenBinary& operator= (const GenBinary& other) {
2262             if (this != &other) {
2263                 fields = other.fields;
2264             }
2265             return *this;
2266         }
2267 
2268         //!
2269         //! \brief      Destructor of GenBinary class.
2270         //!
~GenBinary()2271         ~GenBinary() {
2272         }
2273 
2274         //!
2275         //! \brief      Returns the integer value of the GenPlatform field.
2276         //! \details    GenPlatform field is at index 0 in the internal
2277         //!             array of Fields.
2278         //! \retval     An integer.
2279         //!
getGenPlatform()2280         uint8_t getGenPlatform() {
2281             return (uint8_t)fields[0].number8;
2282         }
2283 
2284         //!
2285         //! \brief      Sets the integer value of the GenPlatform field.
2286         //! \details    GenPlatform field is at index 0 in the internal
2287         //!             array of Fields.
2288         //! \param      [in] value.
2289         //!             Integer be assigned.
2290         //!
setGenPlatform(uint8_t value)2291         void setGenPlatform(uint8_t value) {
2292             fields[0].number8 = value;
2293         }
2294 
2295         //!
2296         //! \brief      Returns the integer value of the BinaryOffset field.
2297         //! \details    BinaryOffset field is at index 1 in the internal
2298         //!             array of Fields.
2299         //! \retval     An integer.
2300         //!
getBinaryOffset()2301         uint32_t getBinaryOffset() {
2302             return (uint32_t)fields[1].number32;
2303         }
2304 
2305         //!
2306         //! \brief      Sets the integer value of the BinaryOffset field.
2307         //! \details    BinaryOffset field is at index 1 in the internal
2308         //!             array of Fields.
2309         //! \param      [in] value.
2310         //!             Integer be assigned.
2311         //!
setBinaryOffset(uint32_t value)2312         void setBinaryOffset(uint32_t value) {
2313             fields[1].number32 = value;
2314         }
2315 
2316         //!
2317         //! \brief      Returns the integer value of the BinarySize field.
2318         //! \details    BinarySize field is at index 2 in the internal
2319         //!             array of Fields.
2320         //! \retval     An integer.
2321         //!
getBinarySize()2322         uint32_t getBinarySize() {
2323             return (uint32_t)fields[2].number32;
2324         }
2325 
2326         //!
2327         //! \brief      Sets the integer value of the BinarySize field.
2328         //! \details    BinarySize field is at index 2 in the internal
2329         //!             array of Fields.
2330         //! \param      [in] value.
2331         //!             Integer be assigned.
2332         //!
setBinarySize(uint32_t value)2333         void setBinarySize(uint32_t value) {
2334             fields[2].number32 = value;
2335         }
2336 
2337         //!
2338         //! \brief      Parses one GenBinary object from ISA file.
2339         //! \details    Reads and parses all the fields of the GenBinary object
2340         //!             from the file buffer and returns the pointer immediately
2341         //!             after all this data.
2342         //!             If this class contains internal structs, their Parse
2343         //!             functions are called when corresponding.
2344         //! \param      [in] p.
2345         //!             Pointer to file buffer to start reading.
2346         //! \param      [in] end.
2347         //!             Pointer to end of file buffer.
2348         //! \param      [in] m.
2349         //!             Pointer ISAfile object.
2350         //! \retval     Pointer to file buffe after parsing one GenBinary object.
2351         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)2352         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
2353             unsigned i = 0;
2354             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2355                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
2356                 if (!p) return m->setError("bad offset/size for GenBinary's field", i);
2357                 i++;
2358             }
2359             return p;
2360         }
2361 
2362         //!
2363         //! \brief      Adds all the GenBinary's fields to a buffer.
2364         //! \details    Every field from this class is added to a buffer
2365         //!             in order to be written into an ISA file afterwards
2366         //!             If this class contains other internal structus, their addToBuffer
2367         //!             functions are called when corresponding.
2368         //! \param      [out] buffer.
2369         //!             The buffer where the fields data will be added.
2370         //! \param      [in] m.
2371         //!             Pointer to ISAfile object.
2372         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)2373         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
2374             unsigned i = 0;
2375             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2376                 m->addToBuffer(fields[i], buffer);
2377                 i++;
2378             }
2379         }
2380     MEDIA_CLASS_DEFINE_END(vp__vISA__GenBinary)
2381     };
2382 
2383     //!
2384     //! \brief      Function Class.
2385     //! \details    This class represents the Function from vISA Object Format.
2386     //!             Provides getters, setters for its fields and structs as well as
2387     //!             functions to read/write it from/to file.
2388     //!
2389     class Function {
2390     public:
2391         std::array<Field, 9> fields = std::array<Field, 9>
2392         {
2393             Field(Datatype::ONE), // linkage
2394                 Field(Datatype::TWO), // name_len
2395                 Field(Datatype::VARCHAR, 1), // name
2396                 Field(Datatype::FOUR), // offset
2397                 Field(Datatype::FOUR), // size
2398                 Field(Datatype::TWO), // num_syms_variable
2399                 Field(Datatype::STRUCT, 5), // variable_reloc_symtab
2400                 Field(Datatype::TWO), // num_syms_function
2401                 Field(Datatype::STRUCT, 7), // function_reloc_symtab
2402         };
2403         std::vector<RelocationInfo*> variable_reloc_symtab;
2404         std::vector<RelocationInfo*> function_reloc_symtab;
2405 
2406         //!
2407         //! \brief      Constructor of Function class.
2408         //! \param      [in] version.
2409         //!             Version of current ISA file.
2410         //!
Function(unsigned version)2411         Function(unsigned version) {
2412             if (version <= 306) setVersion306();
2413         }
2414 
2415         //!
2416         //! \brief      Constructor of Function class.
2417         //!
Function()2418         Function() {}
2419 
2420         //!
2421         //! \brief      Copy Constructor of Function class.
2422         //! \param      [in] other.
2423         //!             Reference to object to copy..
2424         //!
Function(const Function & other)2425         Function(const Function& other) {
2426             fields = other.fields;
2427             for (RelocationInfo *r : other.variable_reloc_symtab) {
2428                 RelocationInfo *s = new RelocationInfo();
2429                 *s = *r;
2430                 variable_reloc_symtab.push_back(s);
2431             }
2432             for (RelocationInfo *r : other.function_reloc_symtab) {
2433                 RelocationInfo *s = new RelocationInfo();
2434                 *s = *r;
2435                 function_reloc_symtab.push_back(s);
2436             }
2437         }
2438 
2439         //!
2440         //! \brief      Assignment operator.
2441         //! \param      [in] other.
2442         //!             Reference to object to copy..
2443         //!
2444         Function& operator= (const Function& other) {
2445             if (this != &other) {
2446                 fields = other.fields;
2447                 for (RelocationInfo *r : variable_reloc_symtab)
2448                     delete r;
2449                 for (RelocationInfo *r : other.variable_reloc_symtab) {
2450                     RelocationInfo *s = new RelocationInfo();
2451                     *s = *r;
2452                     variable_reloc_symtab.push_back(s);
2453                 }
2454                 for (RelocationInfo *r : function_reloc_symtab)
2455                     delete r;
2456                 for (RelocationInfo *r : other.function_reloc_symtab) {
2457                     RelocationInfo *s = new RelocationInfo();
2458                     *s = *r;
2459                     function_reloc_symtab.push_back(s);
2460                 }
2461             }
2462             return *this;
2463         }
2464 
2465         //!
2466         //! \brief      Destructor of Function class.
2467         //!
~Function()2468         ~Function() {
2469             for (RelocationInfo *s : variable_reloc_symtab) delete s;
2470             for (RelocationInfo *s : function_reloc_symtab) delete s;
2471         }
2472 
2473         //!
2474         //! \brief      Returns the integer value of the Linkage field.
2475         //! \details    Linkage field is at index 0 in the internal
2476         //!             array of Fields.
2477         //! \retval     An integer.
2478         //!
getLinkage()2479         uint8_t getLinkage() {
2480             return (uint8_t)fields[0].number8;
2481         }
2482 
2483         //!
2484         //! \brief      Sets the integer value of the Linkage field.
2485         //! \details    Linkage field is at index 0 in the internal
2486         //!             array of Fields.
2487         //! \param      [in] value.
2488         //!             Integer be assigned.
2489         //!
setLinkage(uint8_t value)2490         void setLinkage(uint8_t value) {
2491             fields[0].number8 = value;
2492         }
2493 
2494         //!
2495         //! \brief      Returns the integer value of the NameLen field.
2496         //! \details    NameLen field is at index 1 in the internal
2497         //!             array of Fields for version <= 306
2498         //! \retval     An integer.
2499         //!
getNameLen_Ver306()2500         uint8_t getNameLen_Ver306() {
2501             return (uint8_t)fields[1].number8;
2502         }
2503 
2504         //!
2505         //! \brief      Returns the integer value of the NameLen field.
2506         //! \details    NameLen field is at index 1 in the internal
2507         //!             array of Fields
2508         //! \retval     An integer.
2509         //!
getNameLen()2510         uint16_t getNameLen() {
2511             return (uint16_t)fields[1].number16;
2512         }
2513 
2514         //!
2515         //! \brief      Sets the integer value of the NameLen field.
2516         //! \details    NameLen field is at index 1 in the internal
2517         //!             array of Fields for version <= 306
2518         //! \param      [in] value.
2519         //!             Integer be assigned.
2520         //!
setNameLen_Ver306(uint8_t value)2521         void setNameLen_Ver306(uint8_t value) {
2522             fields[1].number8 = value;
2523         }
2524 
2525         //!
2526         //! \brief      Sets the integer value of the NameLen field.
2527         //! \details    NameLen field is at index 1 in the internal
2528         //!             array of Fields.
2529         //! \param      [in] value.
2530         //!             Integer be assigned.
2531         //!
setNameLen(uint16_t value)2532         void setNameLen(uint16_t value)
2533         {
2534             fields[1].number16 = value;
2535         }
2536 
2537         //!
2538         //! \brief      Returns the string value of the Name field.
2539         //! \details    Name field is at index 2 in the internal
2540         //!             array of Fields.
2541         //! \retval     A pointer to the string (const char*).
2542         //!
getName()2543         const char * getName() {
2544             return fields[2].varchar;
2545         }
2546 
2547         //!
2548         //! \brief      Sets the string value of the Name field.
2549         //! \details    Name field is at index 2 in the internal
2550         //!             array of Fields.
2551         //! \param      [in] value.
2552         //!             Pointer to string (char*) to be assigned.
2553         //!
setName(char * value)2554         void setName(char * value) {
2555             fields[2].varchar = value;
2556         }
2557 
2558         //!
2559         //! \brief      Returns the integer value of the Offset field.
2560         //! \details    Offset field is at index 3 in the internal
2561         //!             array of Fields.
2562         //! \retval     An integer.
2563         //!
getOffset()2564         uint32_t getOffset() {
2565             return (uint32_t)fields[3].number32;
2566         }
2567 
2568         //!
2569         //! \brief      Sets the integer value of the Offset field.
2570         //! \details    Offset field is at index 3 in the internal
2571         //!             array of Fields.
2572         //! \param      [in] value.
2573         //!             Integer be assigned.
2574         //!
setOffset(uint32_t value)2575         void setOffset(uint32_t value) {
2576             fields[3].number32 = value;
2577         }
2578 
2579         //!
2580         //! \brief      Returns the integer value of the Size field.
2581         //! \details    Size field is at index 4 in the internal
2582         //!             array of Fields.
2583         //! \retval     An integer.
2584         //!
getSize()2585         uint32_t getSize() {
2586             return (uint32_t)fields[4].number32;
2587         }
2588 
2589         //!
2590         //! \brief      Sets the integer value of the Size field.
2591         //! \details    Size field is at index 4 in the internal
2592         //!             array of Fields.
2593         //! \param      [in] value.
2594         //!             Integer be assigned.
2595         //!
setSize(uint32_t value)2596         void setSize(uint32_t value) {
2597             fields[4].number32 = value;
2598         }
2599 
2600         //!
2601         //! \brief      Returns the integer value of the NumSymsVariable field.
2602         //! \details    NumSymsVariable field is at index 5 in the internal
2603         //!             array of Fields.
2604         //! \retval     An integer.
2605         //!
getNumSymsVariable()2606         uint16_t getNumSymsVariable() {
2607             return (uint16_t)fields[5].number16;
2608         }
2609 
2610         //!
2611         //! \brief      Sets the integer value of the NumSymsVariable field.
2612         //! \details    NumSymsVariable field is at index 5 in the internal
2613         //!             array of Fields.
2614         //! \param      [in] value.
2615         //!             Integer be assigned.
2616         //!
setNumSymsVariable(uint16_t value)2617         void setNumSymsVariable(uint16_t value) {
2618             fields[5].number16 = value;
2619         }
2620 
2621         //!
2622         //! \brief      Returns the reference to the vector of RelocationInfo objects.
2623         //! \details    Function has a vector of RelocationInfo objects
2624         //!             that represents another entity within the vISA object format.
2625         //! \retval     Reference to the vector of RelocationInfo*.
2626         //!
getVariableRelocSymtab()2627         std::vector<RelocationInfo*> &getVariableRelocSymtab() {
2628             return variable_reloc_symtab;
2629         }
2630 
2631         //!
2632         //! \brief      Returns the integer value of the NumSymsFunction field.
2633         //! \details    NumSymsFunction field is at index 7 in the internal
2634         //!             array of Fields.
2635         //! \retval     An integer.
2636         //!
getNumSymsFunction()2637         uint16_t getNumSymsFunction() {
2638             return (uint16_t)fields[7].number16;
2639         }
2640 
2641         //!
2642         //! \brief      Sets the integer value of the NumSymsFunction field.
2643         //! \details    NumSymsFunction field is at index 7 in the internal
2644         //!             array of Fields.
2645         //! \param      [in] value.
2646         //!             Integer be assigned.
2647         //!
setNumSymsFunction(uint16_t value)2648         void setNumSymsFunction(uint16_t value) {
2649             fields[7].number16 = value;
2650         }
2651 
2652         //!
2653         //! \brief      Returns the reference to the vector of RelocationInfo objects.
2654         //! \details    Function has a vector of RelocationInfo objects
2655         //!             that represents another entity within the vISA object format.
2656         //! \retval     Reference to the vector of RelocationInfo*.
2657         //!
getFunctionRelocSymtab()2658         std::vector<RelocationInfo*> &getFunctionRelocSymtab() {
2659             return function_reloc_symtab;
2660         }
2661 
2662         //!
2663         //! \brief      Parses one Function object from ISA file.
2664         //! \details    Reads and parses all the fields of the Function object
2665         //!             from the file buffer and returns the pointer immediately
2666         //!             after all this data.
2667         //!             If this class contains internal structs, their Parse
2668         //!             functions are called when corresponding.
2669         //! \param      [in] p.
2670         //!             Pointer to file buffer to start reading.
2671         //! \param      [in] end.
2672         //!             Pointer to end of file buffer.
2673         //! \param      [in] m.
2674         //!             Pointer ISAfile object.
2675         //! \retval     Pointer to file buffe after parsing one Function object.
2676         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)2677         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
2678             unsigned i = 0, count = 0;
2679             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2680                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
2681                 if (!p) return m->setError("bad offset/size for Function's field", i);
2682                 i++;
2683             }
2684             // RelocationInfo
2685             count = fields[fields[i].countField].number32;
2686             variable_reloc_symtab.resize(count);
2687             for (unsigned j = 0; j < count; j++) {
2688                 RelocationInfo *r = new RelocationInfo(m->getCurrentVISAVersion());
2689                 p = r->parse(p, end, m);
2690                 if (!p) {
2691                     delete r;
2692                     return 0;
2693                 }
2694                 variable_reloc_symtab[j] = r;
2695             }
2696             i++;
2697             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2698                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
2699                 if (!p) return m->setError("bad offset/size for Function's field", i);
2700                 i++;
2701             }
2702             // RelocationInfo
2703             count = fields[fields[i].countField].number32;
2704             function_reloc_symtab.resize(count);
2705             for (unsigned j = 0; j < count; j++) {
2706                 RelocationInfo *r = new RelocationInfo(m->getCurrentVISAVersion());
2707                 p = r->parse(p, end, m);
2708                 if (!p) {
2709                     delete r;
2710                     return 0;
2711                 }
2712                 function_reloc_symtab[j] = r;
2713             }
2714             i++;
2715             return p;
2716         }
2717 
2718         //!
2719         //! \brief      Adds all the Function's fields to a buffer.
2720         //! \details    Every field from this class is added to a buffer
2721         //!             in order to be written into an ISA file afterwards
2722         //!             If this class contains other internal structus, their addToBuffer
2723         //!             functions are called when corresponding.
2724         //! \param      [out] buffer.
2725         //!             The buffer where the fields data will be added.
2726         //! \param      [in] m.
2727         //!             Pointer to ISAfile object.
2728         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)2729         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
2730             unsigned i = 0;
2731             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2732                 m->addToBuffer(fields[i], buffer);
2733                 i++;
2734             }
2735             // RelocationInfo
2736             for (RelocationInfo *r : variable_reloc_symtab) {
2737                 r->addToBuffer(buffer, m);
2738             }
2739             i++;
2740             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2741                 m->addToBuffer(fields[i], buffer);
2742                 i++;
2743             }
2744             // RelocationInfo
2745             for (RelocationInfo *r : function_reloc_symtab) {
2746                 r->addToBuffer(buffer, m);
2747             }
2748             i++;
2749         }
2750 
2751                 //!
2752         //! \brief      Makes the changes needed to support 306 version's Function.
2753         //! \details    This function is called when the current ISA file has the 306 version.
2754         //!             Initially all the objects are created with last version's format, so
2755         //!             in order to suppport newer versions, changes of datatypes and insertion/removal
2756         //!             of fields can be needed.
2757         //!
setVersion306()2758         void setVersion306()
2759         {
2760             fields[1] = Datatype::ONE;
2761         }
2762     MEDIA_CLASS_DEFINE_END(vp__vISA__Function)
2763     };
2764 
2765     //!
2766     //! \brief      GlobalVariable Class.
2767     //! \details    This class represents the GlobalVariable from vISA Object Format.
2768     //!             Provides getters, setters for its fields and structs as well as
2769     //!             functions to read/write it from/to file.
2770     //!
2771     class GlobalVariable {
2772     public:
2773         std::array<Field, 7> fields = std::array<Field, 7>
2774         {
2775             Field(Datatype::ONE), // linkage
2776                 Field(Datatype::TWO), // name_len
2777                 Field(Datatype::VARCHAR, 1), // name
2778                 Field(Datatype::ONE), // bit_properties
2779                 Field(Datatype::TWO), // num_elements
2780                 Field(Datatype::ONE), // attribute_count
2781                 Field(Datatype::STRUCT, 5), // attribute_info
2782         };
2783         std::vector<AttributeInfo*> attribute_info;
2784 
2785         //!
2786         //! \brief      Constructor of GlobalVariable class.
2787         //! \param      [in] version.
2788         //!             Version of current ISA file.
2789         //!
GlobalVariable(unsigned version)2790         GlobalVariable(unsigned version) {}
2791 
2792         //!
2793         //! \brief      Constructor of GlobalVariable class.
2794         //!
GlobalVariable()2795         GlobalVariable() {}
2796 
2797         //!
2798         //! \brief      Copy Constructor of GlobalVariable class.
2799         //! \param      [in] other.
2800         //!             Reference to object to copy..
2801         //!
GlobalVariable(const GlobalVariable & other)2802         GlobalVariable(const GlobalVariable& other) {
2803             fields = other.fields;
2804             for (AttributeInfo *r : other.attribute_info) {
2805                 AttributeInfo *s = new AttributeInfo();
2806                 *s = *r;
2807                 attribute_info.push_back(s);
2808             }
2809         }
2810 
2811         //!
2812         //! \brief      Assignment operator.
2813         //! \param      [in] other.
2814         //!             Reference to object to copy..
2815         //!
2816         GlobalVariable& operator= (const GlobalVariable& other) {
2817             if (this != &other) {
2818                 fields = other.fields;
2819                 for (AttributeInfo *r : attribute_info)
2820                     delete r;
2821                 for (AttributeInfo *r : other.attribute_info) {
2822                     AttributeInfo *s = new AttributeInfo();
2823                     *s = *r;
2824                     attribute_info.push_back(s);
2825                 }
2826             }
2827             return *this;
2828         }
2829 
2830         //!
2831         //! \brief      Destructor of GlobalVariable class.
2832         //!
~GlobalVariable()2833         ~GlobalVariable() {
2834             for (AttributeInfo *s : attribute_info)
2835             {
2836                 if (s)
2837                 {
2838                     delete s;
2839                 }
2840             }
2841         }
2842 
2843         //!
2844         //! \brief      Returns the integer value of the Linkage field.
2845         //! \details    Linkage field is at index 0 in the internal
2846         //!             array of Fields.
2847         //! \retval     An integer.
2848         //!
getLinkage()2849         uint8_t getLinkage() {
2850             return (uint8_t)fields[0].number8;
2851         }
2852 
2853         //!
2854         //! \brief      Sets the integer value of the Linkage field.
2855         //! \details    Linkage field is at index 0 in the internal
2856         //!             array of Fields.
2857         //! \param      [in] value.
2858         //!             Integer be assigned.
2859         //!
setLinkage(uint8_t value)2860         void setLinkage(uint8_t value) {
2861             fields[0].number8 = value;
2862         }
2863 
2864         //!
2865         //! \brief      Returns the integer value of the NameLen field.
2866         //! \details    NameLen field is at index 1 in the internal
2867         //!             array of Fields.
2868         //! \retval     An integer.
2869         //!
getNameLen()2870         uint16_t getNameLen() {
2871             return (uint16_t)fields[1].number16;
2872         }
2873 
2874         //!
2875         //! \brief      Sets the integer value of the NameLen field.
2876         //! \details    NameLen field is at index 1 in the internal
2877         //!             array of Fields.
2878         //! \param      [in] value.
2879         //!             Integer be assigned.
2880         //!
setNameLen(uint16_t value)2881         void setNameLen(uint16_t value) {
2882             fields[1].number16 = value;
2883         }
2884 
2885         //!
2886         //! \brief      Returns the string value of the Name field.
2887         //! \details    Name field is at index 2 in the internal
2888         //!             array of Fields.
2889         //! \retval     A pointer to the string (const char*).
2890         //!
getName()2891         const char * getName() {
2892             return fields[2].varchar;
2893         }
2894 
2895         //!
2896         //! \brief      Sets the string value of the Name field.
2897         //! \details    Name field is at index 2 in the internal
2898         //!             array of Fields.
2899         //! \param      [in] value.
2900         //!             Pointer to string (char*) to be assigned.
2901         //!
setName(char * value)2902         void setName(char * value) {
2903             fields[2].varchar = value;
2904         }
2905 
2906         //!
2907         //! \brief      Returns the integer value of the BitProperties field.
2908         //! \details    BitProperties field is at index 3 in the internal
2909         //!             array of Fields.
2910         //! \retval     An integer.
2911         //!
getBitProperties()2912         uint8_t getBitProperties() {
2913             return (uint8_t)fields[3].number8;
2914         }
2915 
2916         //!
2917         //! \brief      Sets the integer value of the BitProperties field.
2918         //! \details    BitProperties field is at index 3 in the internal
2919         //!             array of Fields.
2920         //! \param      [in] value.
2921         //!             Integer be assigned.
2922         //!
setBitProperties(uint8_t value)2923         void setBitProperties(uint8_t value) {
2924             fields[3].number8 = value;
2925         }
2926 
2927         //!
2928         //! \brief      Returns the integer value of the NumElements field.
2929         //! \details    NumElements field is at index 4 in the internal
2930         //!             array of Fields.
2931         //! \retval     An integer.
2932         //!
getNumElements()2933         uint16_t getNumElements() {
2934             return (uint16_t)fields[4].number16;
2935         }
2936 
2937         //!
2938         //! \brief      Sets the integer value of the NumElements field.
2939         //! \details    NumElements field is at index 4 in the internal
2940         //!             array of Fields.
2941         //! \param      [in] value.
2942         //!             Integer be assigned.
2943         //!
setNumElements(uint16_t value)2944         void setNumElements(uint16_t value) {
2945             fields[4].number16 = value;
2946         }
2947 
2948         //!
2949         //! \brief      Returns the integer value of the AttributeCount field.
2950         //! \details    AttributeCount field is at index 5 in the internal
2951         //!             array of Fields.
2952         //! \retval     An integer.
2953         //!
getAttributeCount()2954         uint8_t getAttributeCount() {
2955             return (uint8_t)fields[5].number8;
2956         }
2957 
2958         //!
2959         //! \brief      Sets the integer value of the AttributeCount field.
2960         //! \details    AttributeCount field is at index 5 in the internal
2961         //!             array of Fields.
2962         //! \param      [in] value.
2963         //!             Integer be assigned.
2964         //!
setAttributeCount(uint8_t value)2965         void setAttributeCount(uint8_t value) {
2966             fields[5].number8 = value;
2967         }
2968 
2969         //!
2970         //! \brief      Returns the reference to the vector of AttributeInfo objects.
2971         //! \details    GlobalVariable has a vector of AttributeInfo objects
2972         //!             that represents another entity within the vISA object format.
2973         //! \retval     Reference to the vector of AttributeInfo*.
2974         //!
getAttributeInfo()2975         std::vector<AttributeInfo*> &getAttributeInfo() {
2976             return attribute_info;
2977         }
2978 
2979         //!
2980         //! \brief      Parses one GlobalVariable object from ISA file.
2981         //! \details    Reads and parses all the fields of the GlobalVariable object
2982         //!             from the file buffer and returns the pointer immediately
2983         //!             after all this data.
2984         //!             If this class contains internal structs, their Parse
2985         //!             functions are called when corresponding.
2986         //! \param      [in] p.
2987         //!             Pointer to file buffer to start reading.
2988         //! \param      [in] end.
2989         //!             Pointer to end of file buffer.
2990         //! \param      [in] m.
2991         //!             Pointer ISAfile object.
2992         //! \retval     Pointer to file buffe after parsing one GlobalVariable object.
2993         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)2994         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
2995             unsigned i = 0, count = 0;
2996             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
2997                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
2998                 if (!p) return m->setError("bad offset/size for GlobalVariable's field", i);
2999                 i++;
3000             }
3001             // AttributeInfo
3002             count = fields[fields[i].countField].number32;
3003             attribute_info.resize(count);
3004             for (unsigned j = 0; j < count; j++) {
3005                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
3006                 p = r->parse(p, end, m);
3007                 if (!p) {
3008                     delete r;
3009                     return 0;
3010                 }
3011                 attribute_info[j] = r;
3012             }
3013             i++;
3014             return p;
3015         }
3016 
3017         //!
3018         //! \brief      Adds all the GlobalVariable's fields to a buffer.
3019         //! \details    Every field from this class is added to a buffer
3020         //!             in order to be written into an ISA file afterwards
3021         //!             If this class contains other internal structus, their addToBuffer
3022         //!             functions are called when corresponding.
3023         //! \param      [out] buffer.
3024         //!             The buffer where the fields data will be added.
3025         //! \param      [in] m.
3026         //!             Pointer to ISAfile object.
3027         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)3028         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
3029             unsigned i = 0;
3030             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3031                 m->addToBuffer(fields[i], buffer);
3032                 i++;
3033             }
3034             // AttributeInfo
3035             for (AttributeInfo *r : attribute_info) {
3036                 r->addToBuffer(buffer, m);
3037             }
3038             i++;
3039         }
3040     MEDIA_CLASS_DEFINE_END(vp__vISA__GlobalVariable)
3041     };
3042 
3043     //!
3044     //! \brief      FunctionBody Class.
3045     //! \details    This class represents the FunctionBody from vISA Object Format.
3046     //!             Provides getters, setters for its fields and structs as well as
3047     //!             functions to read/write it from/to file.
3048     //!
3049     class FunctionBody {
3050     public:
3051         std::array<Field, 24> fields = std::array<Field, 24>
3052         {
3053             Field(Datatype::FOUR), // string_count
3054                 Field(Datatype::STRUCT, 0), // string_pool
3055                 Field(Datatype::FOUR), // name_index
3056                 Field(Datatype::FOUR), // variable_count
3057                 Field(Datatype::STRUCT, 3), // var_info
3058                 Field(Datatype::TWO), // address_count
3059                 Field(Datatype::STRUCT, 5), // address_info
3060                 Field(Datatype::TWO), // predicate_count
3061                 Field(Datatype::STRUCT, 7), // predicate_info
3062                 Field(Datatype::TWO), // label_count
3063                 Field(Datatype::STRUCT, 9), // label_info
3064                 Field(Datatype::ONE), // sampler_count
3065                 Field(Datatype::STRUCT, 11), // sampler_info
3066                 Field(Datatype::ONE), // surface_count
3067                 Field(Datatype::STRUCT, 13), // surface_info
3068                 Field(Datatype::ONE), // vme_count
3069                 Field(Datatype::STRUCT, 15), // vme_info
3070                 Field(Datatype::FOUR), // size
3071                 Field(Datatype::FOUR), // entry
3072                 Field(Datatype::ONE), // input_size
3073                 Field(Datatype::ONE), // return_value_size
3074                 Field(Datatype::TWO), // attribute_count
3075                 Field(Datatype::STRUCT, 21), // attribute_info
3076                 Field(Datatype::GDATA, 17) // instructions
3077         };
3078         std::vector<StringPool*> string_pool;
3079         std::vector<Variable*> var_info;
3080         std::vector<AddressInfo*> address_info;
3081         std::vector<PredicateInfo*> predicate_info;
3082         std::vector<LabelInfo*> label_info;
3083         std::vector<SamplerInfo*> sampler_info;
3084         std::vector<SurfaceInfo*> surface_info;
3085         std::vector<VmeInfo*> vme_info;
3086         std::vector<AttributeInfo*> attribute_info;
3087 
3088         //!
3089         //! \brief      Constructor of FunctionBody class.
3090         //! \param      [in] version.
3091         //!             Version of current ISA file.
3092         //!
FunctionBody(unsigned version)3093         FunctionBody(unsigned version) {
3094             if (version <= 303) setVersion303();
3095         }
3096 
3097         //!
3098         //! \brief      Destructor of FunctionBody class.
3099         //!
~FunctionBody()3100         ~FunctionBody() {
3101             for (StringPool *s : string_pool) delete s;
3102             for (Variable *s : var_info) delete s;
3103             for (AddressInfo *s : address_info) delete s;
3104             for (PredicateInfo *s : predicate_info) delete s;
3105             for (LabelInfo *s : label_info) delete s;
3106             for (SamplerInfo *s : sampler_info) delete s;
3107             for (SurfaceInfo *s : surface_info) delete s;
3108             for (VmeInfo *s : vme_info) delete s;
3109             for (AttributeInfo *s : attribute_info) delete s;
3110         }
3111 
3112         //!
3113         //! \brief      Returns the integer value of the StringCount field.
3114         //! \details    StringCount field is at index 0 in the internal
3115         //!             array of Fields.
3116         //! \retval     An integer.
3117         //!
getStringCount()3118         uint32_t getStringCount() {
3119             return (uint32_t)fields[0].number32;
3120         }
3121 
3122         //!
3123         //! \brief      Sets the integer value of the StringCount field.
3124         //! \details    StringCount field is at index 0 in the internal
3125         //!             array of Fields.
3126         //! \param      [in] value.
3127         //!             Integer be assigned.
3128         //!
setStringCount(uint32_t value)3129         void setStringCount(uint32_t value) {
3130             fields[0].number32 = value;
3131         }
3132 
3133         //!
3134         //! \brief      Returns the reference to the vector of StringPool objects.
3135         //! \details    FunctionBody has a vector of StringPool objects
3136         //!             that represents another entity within the vISA object format.
3137         //! \retval     Reference to the vector of StringPool*.
3138         //!
getStringPool()3139         std::vector<StringPool*> &getStringPool() {
3140             return string_pool;
3141         }
3142 
3143         //!
3144         //! \brief      Returns the integer value of the NameIndex field.
3145         //! \details    NameIndex field is at index 2 in the internal
3146         //!             array of Fields.
3147         //! \retval     An integer.
3148         //!
getNameIndex()3149         uint32_t getNameIndex() {
3150             return (uint32_t)fields[2].number32;
3151         }
3152 
3153         //!
3154         //! \brief      Sets the integer value of the NameIndex field.
3155         //! \details    NameIndex field is at index 2 in the internal
3156         //!             array of Fields.
3157         //! \param      [in] value.
3158         //!             Integer be assigned.
3159         //!
setNameIndex(uint32_t value)3160         void setNameIndex(uint32_t value) {
3161             fields[2].number32 = value;
3162         }
3163 
3164         //!
3165         //! \brief      Returns the integer value of the VariableCount field.
3166         //! \details    VariableCount field is at index 3 in the internal
3167         //!             array of Fields.
3168         //! \retval     An integer.
3169         //!
getVariableCount()3170         uint32_t getVariableCount() {
3171             return (uint32_t)fields[3].number32;
3172         }
3173 
3174         //!
3175         //! \brief      Sets the integer value of the VariableCount field.
3176         //! \details    VariableCount field is at index 3 in the internal
3177         //!             array of Fields.
3178         //! \param      [in] value.
3179         //!             Integer be assigned.
3180         //!
setVariableCount(uint32_t value)3181         void setVariableCount(uint32_t value) {
3182             fields[3].number32 = value;
3183         }
3184 
3185         //!
3186         //! \brief      Returns the reference to the vector of Variable objects.
3187         //! \details    FunctionBody has a vector of Variable objects
3188         //!             that represents another entity within the vISA object format.
3189         //! \retval     Reference to the vector of Variable*.
3190         //!
getVarInfo()3191         std::vector<Variable*> &getVarInfo() {
3192             return var_info;
3193         }
3194 
3195         //!
3196         //! \brief      Returns the integer value of the AddressCount field.
3197         //! \details    AddressCount field is at index 5 in the internal
3198         //!             array of Fields.
3199         //! \retval     An integer.
3200         //!
getAddressCount()3201         uint16_t getAddressCount() {
3202             return (uint16_t)fields[5].number16;
3203         }
3204 
3205         //!
3206         //! \brief      Sets the integer value of the AddressCount field.
3207         //! \details    AddressCount field is at index 5 in the internal
3208         //!             array of Fields.
3209         //! \param      [in] value.
3210         //!             Integer be assigned.
3211         //!
setAddressCount(uint16_t value)3212         void setAddressCount(uint16_t value) {
3213             fields[5].number16 = value;
3214         }
3215 
3216         //!
3217         //! \brief      Returns the reference to the vector of AddressInfo objects.
3218         //! \details    FunctionBody has a vector of AddressInfo objects
3219         //!             that represents another entity within the vISA object format.
3220         //! \retval     Reference to the vector of AddressInfo*.
3221         //!
getAddressInfo()3222         std::vector<AddressInfo*> &getAddressInfo() {
3223             return address_info;
3224         }
3225 
3226         //!
3227         //! \brief      Returns the integer value of the PredicateCount field.
3228         //! \details    PredicateCount field is at index 7 in the internal
3229         //!             array of Fields.
3230         //! \retval     An integer.
3231         //!
getPredicateCount()3232         uint16_t getPredicateCount() {
3233             return (uint16_t)fields[7].number16;
3234         }
3235 
3236         //!
3237         //! \brief      Sets the integer value of the PredicateCount field.
3238         //! \details    PredicateCount field is at index 7 in the internal
3239         //!             array of Fields.
3240         //! \param      [in] value.
3241         //!             Integer be assigned.
3242         //!
setPredicateCount(uint16_t value)3243         void setPredicateCount(uint16_t value) {
3244             fields[7].number16 = value;
3245         }
3246 
3247         //!
3248         //! \brief      Returns the reference to the vector of PredicateInfo objects.
3249         //! \details    FunctionBody has a vector of PredicateInfo objects
3250         //!             that represents another entity within the vISA object format.
3251         //! \retval     Reference to the vector of PredicateInfo*.
3252         //!
getPredicateInfo()3253         std::vector<PredicateInfo*> &getPredicateInfo() {
3254             return predicate_info;
3255         }
3256 
3257         //!
3258         //! \brief      Returns the integer value of the LabelCount field.
3259         //! \details    LabelCount field is at index 9 in the internal
3260         //!             array of Fields.
3261         //! \retval     An integer.
3262         //!
getLabelCount()3263         uint16_t getLabelCount() {
3264             return (uint16_t)fields[9].number16;
3265         }
3266 
3267         //!
3268         //! \brief      Sets the integer value of the LabelCount field.
3269         //! \details    LabelCount field is at index 9 in the internal
3270         //!             array of Fields.
3271         //! \param      [in] value.
3272         //!             Integer be assigned.
3273         //!
setLabelCount(uint16_t value)3274         void setLabelCount(uint16_t value) {
3275             fields[9].number16 = value;
3276         }
3277 
3278         //!
3279         //! \brief      Returns the reference to the vector of LabelInfo objects.
3280         //! \details    FunctionBody has a vector of LabelInfo objects
3281         //!             that represents another entity within the vISA object format.
3282         //! \retval     Reference to the vector of LabelInfo*.
3283         //!
getLabelInfo()3284         std::vector<LabelInfo*> &getLabelInfo() {
3285             return label_info;
3286         }
3287 
3288         //!
3289         //! \brief      Returns the integer value of the SamplerCount field.
3290         //! \details    SamplerCount field is at index 11 in the internal
3291         //!             array of Fields.
3292         //! \retval     An integer.
3293         //!
getSamplerCount()3294         uint8_t getSamplerCount() {
3295             return (uint8_t)fields[11].number8;
3296         }
3297 
3298         //!
3299         //! \brief      Sets the integer value of the SamplerCount field.
3300         //! \details    SamplerCount field is at index 11 in the internal
3301         //!             array of Fields.
3302         //! \param      [in] value.
3303         //!             Integer be assigned.
3304         //!
setSamplerCount(uint8_t value)3305         void setSamplerCount(uint8_t value) {
3306             fields[11].number8 = value;
3307         }
3308 
3309         //!
3310         //! \brief      Returns the reference to the vector of SamplerInfo objects.
3311         //! \details    FunctionBody has a vector of SamplerInfo objects
3312         //!             that represents another entity within the vISA object format.
3313         //! \retval     Reference to the vector of SamplerInfo*.
3314         //!
getSamplerInfo()3315         std::vector<SamplerInfo*> &getSamplerInfo() {
3316             return sampler_info;
3317         }
3318 
3319         //!
3320         //! \brief      Returns the integer value of the SurfaceCount field.
3321         //! \details    SurfaceCount field is at index 13 in the internal
3322         //!             array of Fields.
3323         //! \retval     An integer.
3324         //!
getSurfaceCount()3325         uint8_t getSurfaceCount() {
3326             return (uint8_t)fields[13].number8;
3327         }
3328 
3329         //!
3330         //! \brief      Sets the integer value of the SurfaceCount field.
3331         //! \details    SurfaceCount field is at index 13 in the internal
3332         //!             array of Fields.
3333         //! \param      [in] value.
3334         //!             Integer be assigned.
3335         //!
setSurfaceCount(uint8_t value)3336         void setSurfaceCount(uint8_t value) {
3337             fields[13].number8 = value;
3338         }
3339 
3340         //!
3341         //! \brief      Returns the reference to the vector of SurfaceInfo objects.
3342         //! \details    FunctionBody has a vector of SurfaceInfo objects
3343         //!             that represents another entity within the vISA object format.
3344         //! \retval     Reference to the vector of SurfaceInfo*.
3345         //!
getSurfaceInfo()3346         std::vector<SurfaceInfo*> &getSurfaceInfo() {
3347             return surface_info;
3348         }
3349 
3350         //!
3351         //! \brief      Returns the integer value of the VmeCount field.
3352         //! \details    VmeCount field is at index 15 in the internal
3353         //!             array of Fields.
3354         //! \retval     An integer.
3355         //!
getVmeCount()3356         uint8_t getVmeCount() {
3357             return (uint8_t)fields[15].number8;
3358         }
3359 
3360         //!
3361         //! \brief      Sets the integer value of the VmeCount field.
3362         //! \details    VmeCount field is at index 15 in the internal
3363         //!             array of Fields.
3364         //! \param      [in] value.
3365         //!             Integer be assigned.
3366         //!
setVmeCount(uint8_t value)3367         void setVmeCount(uint8_t value) {
3368             fields[15].number8 = value;
3369         }
3370 
3371         //!
3372         //! \brief      Returns the reference to the vector of VmeInfo objects.
3373         //! \details    FunctionBody has a vector of VmeInfo objects
3374         //!             that represents another entity within the vISA object format.
3375         //! \retval     Reference to the vector of VmeInfo*.
3376         //!
getVmeInfo()3377         std::vector<VmeInfo*> &getVmeInfo() {
3378             return vme_info;
3379         }
3380 
3381         //!
3382         //! \brief      Returns the integer value of the Size field.
3383         //! \details    Size field is at index 17 in the internal
3384         //!             array of Fields.
3385         //! \retval     An integer.
3386         //!
getSize()3387         uint32_t getSize() {
3388             return (uint32_t)fields[17].number32;
3389         }
3390 
3391         //!
3392         //! \brief      Sets the integer value of the Size field.
3393         //! \details    Size field is at index 17 in the internal
3394         //!             array of Fields.
3395         //! \param      [in] value.
3396         //!             Integer be assigned.
3397         //!
setSize(uint32_t value)3398         void setSize(uint32_t value) {
3399             fields[17].number32 = value;
3400         }
3401 
3402         //!
3403         //! \brief      Returns the integer value of the Entry field.
3404         //! \details    Entry field is at index 18 in the internal
3405         //!             array of Fields.
3406         //! \retval     An integer.
3407         //!
getEntry()3408         uint32_t getEntry() {
3409             return (uint32_t)fields[18].number32;
3410         }
3411 
3412         //!
3413         //! \brief      Sets the integer value of the Entry field.
3414         //! \details    Entry field is at index 18 in the internal
3415         //!             array of Fields.
3416         //! \param      [in] value.
3417         //!             Integer be assigned.
3418         //!
setEntry(uint32_t value)3419         void setEntry(uint32_t value) {
3420             fields[18].number32 = value;
3421         }
3422 
3423         //!
3424         //! \brief      Returns the integer value of the InputSize field.
3425         //! \details    InputSize field is at index 19 in the internal
3426         //!             array of Fields.
3427         //! \retval     An integer.
3428         //!
getInputSize()3429         uint8_t getInputSize() {
3430             return (uint8_t)fields[19].number8;
3431         }
3432 
3433         //!
3434         //! \brief      Sets the integer value of the InputSize field.
3435         //! \details    InputSize field is at index 19 in the internal
3436         //!             array of Fields.
3437         //! \param      [in] value.
3438         //!             Integer be assigned.
3439         //!
setInputSize(uint8_t value)3440         void setInputSize(uint8_t value) {
3441             fields[19].number8 = value;
3442         }
3443 
3444         //!
3445         //! \brief      Returns the integer value of the ReturnValueSize field.
3446         //! \details    ReturnValueSize field is at index 20 in the internal
3447         //!             array of Fields.
3448         //! \retval     An integer.
3449         //!
getReturnValueSize()3450         uint8_t getReturnValueSize() {
3451             return (uint8_t)fields[20].number8;
3452         }
3453 
3454         //!
3455         //! \brief      Sets the integer value of the ReturnValueSize field.
3456         //! \details    ReturnValueSize field is at index 20 in the internal
3457         //!             array of Fields.
3458         //! \param      [in] value.
3459         //!             Integer be assigned.
3460         //!
setReturnValueSize(uint8_t value)3461         void setReturnValueSize(uint8_t value) {
3462             fields[20].number8 = value;
3463         }
3464 
3465         //!
3466         //! \brief      Returns the integer value of the AttributeCount field.
3467         //! \details    AttributeCount field is at index 21 in the internal
3468         //!             array of Fields.
3469         //! \retval     An integer.
3470         //!
getAttributeCount()3471         uint16_t getAttributeCount() {
3472             return (uint16_t)fields[21].number16;
3473         }
3474 
3475         //!
3476         //! \brief      Sets the integer value of the AttributeCount field.
3477         //! \details    AttributeCount field is at index 21 in the internal
3478         //!             array of Fields.
3479         //! \param      [in] value.
3480         //!             Integer be assigned.
3481         //!
setAttributeCount(uint16_t value)3482         void setAttributeCount(uint16_t value) {
3483             fields[21].number16 = value;
3484         }
3485 
3486         //!
3487         //! \brief      Returns the reference to the vector of AttributeInfo objects.
3488         //! \details    FunctionBody has a vector of AttributeInfo objects
3489         //!             that represents another entity within the vISA object format.
3490         //! \retval     Reference to the vector of AttributeInfo*.
3491         //!
getAttributeInfo()3492         std::vector<AttributeInfo*> &getAttributeInfo() {
3493             return attribute_info;
3494         }
3495 
3496         //!
3497         //! \brief      Returns the pointer to buffer data from Instructions field.
3498         //! \details    Instructions field is at index 23 in the internal
3499         //!             array of Fields.
3500         //! \retval     A pointer to buffer data (const uint8_t*).
3501         //!
getInstructions()3502         const uint8_t* getInstructions() {
3503             return fields[23].gdata;
3504         }
3505 
3506         //!
3507         //! \brief      Sets the pointer to buffer data of the Instructions field.
3508         //! \details    Instructions field is at index 23 in the internal
3509         //!             array of Fields.
3510         //! \param      [in] value.
3511         //!             Pointer to buffer data (uint8_t*) to be assigned.
3512         //!
setInstructions(uint8_t * value)3513         void setInstructions(uint8_t * value) {
3514             fields[23].gdata = value;
3515         }
3516 
3517         //!
3518         //! \brief      Parses one FunctionBody object from ISA file.
3519         //! \details    Reads and parses all the fields of the FunctionBody object
3520         //!             from the file buffer and returns the pointer immediately
3521         //!             after all this data.
3522         //!             If this class contains internal structs, their Parse
3523         //!             functions are called when corresponding.
3524         //! \param      [in] p.
3525         //!             Pointer to file buffer to start reading.
3526         //! \param      [in] end.
3527         //!             Pointer to end of file buffer.
3528         //! \param      [in] m.
3529         //!             Pointer ISAfile object.
3530         //! \retval     Pointer to file buffe after parsing one FunctionBody object.
3531         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)3532         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
3533             unsigned i = 0, count = 0;
3534             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3535                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3536                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3537                 i++;
3538             }
3539             // StringPool
3540             count = fields[fields[i].countField].number32;
3541             string_pool.resize(count);
3542             for (unsigned j = 0; j < count; j++) {
3543                 StringPool *r = new StringPool(m->getCurrentVISAVersion());
3544                 p = r->parse(p, end, m);
3545                 if (!p) {
3546                     delete r;
3547                     return 0;
3548                 }
3549                 string_pool[j] = r;
3550             }
3551             i++;
3552             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3553                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3554                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3555                 i++;
3556             }
3557             // Variable
3558             count = fields[fields[i].countField].number32;
3559             var_info.resize(count);
3560             for (unsigned j = 0; j < count; j++) {
3561                 Variable *r = new Variable(m->getCurrentVISAVersion());
3562                 p = r->parse(p, end, m);
3563                 if (!p) {
3564                     delete r;
3565                     return 0;
3566                 }
3567                 var_info[j] = r;
3568             }
3569             i++;
3570             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3571                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3572                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3573                 i++;
3574             }
3575             // AddressInfo
3576             count = fields[fields[i].countField].number32;
3577             address_info.resize(count);
3578             for (unsigned j = 0; j < count; j++) {
3579                 AddressInfo *r = new AddressInfo(m->getCurrentVISAVersion());
3580                 p = r->parse(p, end, m);
3581                 if (!p) {
3582                     delete r;
3583                     return 0;
3584                 }
3585                 address_info[j] = r;
3586             }
3587             i++;
3588             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3589                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3590                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3591                 i++;
3592             }
3593             // PredicateInfo
3594             count = fields[fields[i].countField].number32;
3595             predicate_info.resize(count);
3596             for (unsigned j = 0; j < count; j++) {
3597                 PredicateInfo *r = new PredicateInfo(m->getCurrentVISAVersion());
3598                 p = r->parse(p, end, m);
3599                 if (!p) {
3600                     delete r;
3601                     return 0;
3602                 }
3603                 predicate_info[j] = r;
3604             }
3605             i++;
3606             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3607                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3608                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3609                 i++;
3610             }
3611             // LabelInfo
3612             count = fields[fields[i].countField].number32;
3613             label_info.resize(count);
3614             for (unsigned j = 0; j < count; j++) {
3615                 LabelInfo *r = new LabelInfo(m->getCurrentVISAVersion());
3616                 p = r->parse(p, end, m);
3617                 if (!p) {
3618                     delete r;
3619                     return 0;
3620                 }
3621                 label_info[j] = r;
3622             }
3623             i++;
3624             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3625                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3626                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3627                 i++;
3628             }
3629             // SamplerInfo
3630             count = fields[fields[i].countField].number32;
3631             sampler_info.resize(count);
3632             for (unsigned j = 0; j < count; j++) {
3633                 SamplerInfo *r = new SamplerInfo(m->getCurrentVISAVersion());
3634                 p = r->parse(p, end, m);
3635                 if (!p) {
3636                     delete r;
3637                     return 0;
3638                 }
3639                 sampler_info[j] = r;
3640             }
3641             i++;
3642             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3643                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3644                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3645                 i++;
3646             }
3647             // SurfaceInfo
3648             count = fields[fields[i].countField].number32;
3649             surface_info.resize(count);
3650             for (unsigned j = 0; j < count; j++) {
3651                 SurfaceInfo *r = new SurfaceInfo(m->getCurrentVISAVersion());
3652                 p = r->parse(p, end, m);
3653                 if (!p) {
3654                     delete r;
3655                     return 0;
3656                 }
3657                 surface_info[j] = r;
3658             }
3659             i++;
3660             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3661                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3662                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3663                 i++;
3664             }
3665             // VmeInfo
3666             count = fields[fields[i].countField].number32;
3667             vme_info.resize(count);
3668             for (unsigned j = 0; j < count; j++) {
3669                 VmeInfo *r = new VmeInfo(m->getCurrentVISAVersion());
3670                 p = r->parse(p, end, m);
3671                 if (!p) {
3672                     delete r;
3673                     return 0;
3674                 }
3675                 vme_info[j] = r;
3676             }
3677             i++;
3678             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3679                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3680                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3681                 i++;
3682             }
3683             // AttributeInfo
3684             count = fields[fields[i].countField].number32;
3685             attribute_info.resize(count);
3686             for (unsigned j = 0; j < count; j++) {
3687                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
3688                 p = r->parse(p, end, m);
3689                 if (!p) {
3690                     delete r;
3691                     return 0;
3692                 }
3693                 attribute_info[j] = r;
3694             }
3695             i++;
3696             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3697                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
3698                 if (!p) return m->setError("bad offset/size for FunctionBody's field", i);
3699                 i++;
3700             }
3701             return p;
3702         }
3703 
3704         //!
3705         //! \brief      Adds all the FunctionBody's fields to a buffer.
3706         //! \details    Every field from this class is added to a buffer
3707         //!             in order to be written into an ISA file afterwards
3708         //!             If this class contains other internal structus, their addToBuffer
3709         //!             functions are called when corresponding.
3710         //! \param      [out] buffer.
3711         //!             The buffer where the fields data will be added.
3712         //! \param      [in] m.
3713         //!             Pointer to ISAfile object.
3714         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)3715         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
3716             unsigned i = 0;
3717             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3718                 m->addToBuffer(fields[i], buffer);
3719                 i++;
3720             }
3721             // StringPool
3722             for (StringPool *r : string_pool) {
3723                 r->addToBuffer(buffer, m);
3724             }
3725             i++;
3726             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3727                 m->addToBuffer(fields[i], buffer);
3728                 i++;
3729             }
3730             // Variable
3731             for (Variable *r : var_info) {
3732                 r->addToBuffer(buffer, m);
3733             }
3734             i++;
3735             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3736                 m->addToBuffer(fields[i], buffer);
3737                 i++;
3738             }
3739             // AddressInfo
3740             for (AddressInfo *r : address_info) {
3741                 r->addToBuffer(buffer, m);
3742             }
3743             i++;
3744             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3745                 m->addToBuffer(fields[i], buffer);
3746                 i++;
3747             }
3748             // PredicateInfo
3749             for (PredicateInfo *r : predicate_info) {
3750                 r->addToBuffer(buffer, m);
3751             }
3752             i++;
3753             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3754                 m->addToBuffer(fields[i], buffer);
3755                 i++;
3756             }
3757             // LabelInfo
3758             for (LabelInfo *r : label_info) {
3759                 r->addToBuffer(buffer, m);
3760             }
3761             i++;
3762             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3763                 m->addToBuffer(fields[i], buffer);
3764                 i++;
3765             }
3766             // SamplerInfo
3767             for (SamplerInfo *r : sampler_info) {
3768                 r->addToBuffer(buffer, m);
3769             }
3770             i++;
3771             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3772                 m->addToBuffer(fields[i], buffer);
3773                 i++;
3774             }
3775             // SurfaceInfo
3776             for (SurfaceInfo *r : surface_info) {
3777                 r->addToBuffer(buffer, m);
3778             }
3779             i++;
3780             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3781                 m->addToBuffer(fields[i], buffer);
3782                 i++;
3783             }
3784             // VmeInfo
3785             for (VmeInfo *r : vme_info) {
3786                 r->addToBuffer(buffer, m);
3787             }
3788             i++;
3789             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3790                 m->addToBuffer(fields[i], buffer);
3791                 i++;
3792             }
3793             // AttributeInfo
3794             for (AttributeInfo *r : attribute_info) {
3795                 r->addToBuffer(buffer, m);
3796             }
3797             i++;
3798             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
3799                 m->addToBuffer(fields[i], buffer);
3800                 i++;
3801             }
3802         }
3803 
3804         //!
3805         //! \brief      Makes the changes needed to support 303 version's FunctionBody.
3806         //! \details    This function is called when the current ISA file has the 303 version.
3807         //!             Initially all the objects are created with last version's format, so
3808         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
3809         //!             of fields can be needed.
3810         //!
setVersion303()3811         void setVersion303() {
3812             fields[0] = Datatype::TWO;
3813             fields[2] = Datatype::TWO;
3814             fields[3] = Datatype::TWO;
3815         }
3816     MEDIA_CLASS_DEFINE_END(vp__vISA__FunctionBody)
3817     };
3818 
3819     //!
3820     //! \brief      KernelBody Class.
3821     //! \details    This class represents the KernelBody from vISA Object Format.
3822     //!             Provides getters, setters for its fields and structs as well as
3823     //!             functions to read/write it from/to file.
3824     //!
3825     class KernelBody {
3826     public:
3827         std::array<Field, 24> fields = std::array<Field, 24>
3828         {
3829             Field(Datatype::FOUR), // string_count
3830                 Field(Datatype::STRUCT, 0), // string_pool
3831                 Field(Datatype::FOUR), // name_index
3832                 Field(Datatype::FOUR), // variable_count
3833                 Field(Datatype::STRUCT, 3), // var_info
3834                 Field(Datatype::TWO), // address_count
3835                 Field(Datatype::STRUCT, 5), // address_info
3836                 Field(Datatype::TWO), // predicate_count
3837                 Field(Datatype::STRUCT, 7), // predicate_info
3838                 Field(Datatype::TWO), // label_count
3839                 Field(Datatype::STRUCT, 9), // label_info
3840                 Field(Datatype::ONE), // sampler_count
3841                 Field(Datatype::STRUCT, 11), // sampler_info
3842                 Field(Datatype::ONE), // surface_count
3843                 Field(Datatype::STRUCT, 13), // surface_info
3844                 Field(Datatype::ONE), // vme_count
3845                 Field(Datatype::STRUCT, 15), // vme_info
3846                 Field(Datatype::FOUR), // num_inputs
3847                 Field(Datatype::STRUCT, 17), // input_info
3848                 Field(Datatype::FOUR), // size
3849                 Field(Datatype::FOUR), // entry
3850                 Field(Datatype::TWO), // attribute_count
3851                 Field(Datatype::STRUCT, 21), // attribute_info
3852                 Field(Datatype::GDATA, 19) // instructions
3853         };
3854         std::vector<StringPool*> string_pool;
3855         std::vector<Variable*> var_info;
3856         std::vector<AddressInfo*> address_info;
3857         std::vector<PredicateInfo*> predicate_info;
3858         std::vector<LabelInfo*> label_info;
3859         std::vector<SamplerInfo*> sampler_info;
3860         std::vector<SurfaceInfo*> surface_info;
3861         std::vector<VmeInfo*> vme_info;
3862         std::vector<InputInfo*> input_info;
3863         std::vector<AttributeInfo*> attribute_info;
3864 
3865         //!
3866         //! \brief      Constructor of KernelBody class.
3867         //! \param      [in] version.
3868         //!             Version of current ISA file.
3869         //!
KernelBody(unsigned version)3870         KernelBody(unsigned version) {
3871             if (version <= 304) setVersion304();
3872             if (version <= 303) setVersion303();
3873         }
3874 
3875         //!
3876         //! \brief      Destructor of KernelBody class.
3877         //!
~KernelBody()3878         ~KernelBody() {
3879             for (StringPool *s : string_pool) delete s;
3880             for (Variable *s : var_info) delete s;
3881             for (AddressInfo *s : address_info) delete s;
3882             for (PredicateInfo *s : predicate_info) delete s;
3883             for (LabelInfo *s : label_info) delete s;
3884             for (SamplerInfo *s : sampler_info) delete s;
3885             for (SurfaceInfo *s : surface_info) delete s;
3886             for (VmeInfo *s : vme_info) delete s;
3887             for (InputInfo *s : input_info) delete s;
3888             for (AttributeInfo *s : attribute_info) delete s;
3889         }
3890 
3891         //!
3892         //! \brief      Returns the integer value of the StringCount field.
3893         //! \details    StringCount field is at index 0 in the internal
3894         //!             array of Fields.
3895         //! \retval     An integer.
3896         //!
getStringCount()3897         uint32_t getStringCount() {
3898             return (uint32_t)fields[0].number32;
3899         }
3900 
3901         //!
3902         //! \brief      Sets the integer value of the StringCount field.
3903         //! \details    StringCount field is at index 0 in the internal
3904         //!             array of Fields.
3905         //! \param      [in] value.
3906         //!             Integer be assigned.
3907         //!
setStringCount(uint32_t value)3908         void setStringCount(uint32_t value) {
3909             fields[0].number32 = value;
3910         }
3911 
3912         //!
3913         //! \brief      Returns the reference to the vector of StringPool objects.
3914         //! \details    KernelBody has a vector of StringPool objects
3915         //!             that represents another entity within the vISA object format.
3916         //! \retval     Reference to the vector of StringPool*.
3917         //!
getStringPool()3918         std::vector<StringPool*> &getStringPool() {
3919             return string_pool;
3920         }
3921 
3922         //!
3923         //! \brief      Returns the integer value of the NameIndex field.
3924         //! \details    NameIndex field is at index 2 in the internal
3925         //!             array of Fields.
3926         //! \retval     An integer.
3927         //!
getNameIndex()3928         uint32_t getNameIndex() {
3929             return (uint32_t)fields[2].number32;
3930         }
3931 
3932         //!
3933         //! \brief      Sets the integer value of the NameIndex field.
3934         //! \details    NameIndex field is at index 2 in the internal
3935         //!             array of Fields.
3936         //! \param      [in] value.
3937         //!             Integer be assigned.
3938         //!
setNameIndex(uint32_t value)3939         void setNameIndex(uint32_t value) {
3940             fields[2].number32 = value;
3941         }
3942 
3943         //!
3944         //! \brief      Returns the integer value of the VariableCount field.
3945         //! \details    VariableCount field is at index 3 in the internal
3946         //!             array of Fields.
3947         //! \retval     An integer.
3948         //!
getVariableCount()3949         uint32_t getVariableCount() {
3950             return (uint32_t)fields[3].number32;
3951         }
3952 
3953         //!
3954         //! \brief      Sets the integer value of the VariableCount field.
3955         //! \details    VariableCount field is at index 3 in the internal
3956         //!             array of Fields.
3957         //! \param      [in] value.
3958         //!             Integer be assigned.
3959         //!
setVariableCount(uint32_t value)3960         void setVariableCount(uint32_t value) {
3961             fields[3].number32 = value;
3962         }
3963 
3964         //!
3965         //! \brief      Returns the reference to the vector of Variable objects.
3966         //! \details    KernelBody has a vector of Variable objects
3967         //!             that represents another entity within the vISA object format.
3968         //! \retval     Reference to the vector of Variable*.
3969         //!
getVarInfo()3970         std::vector<Variable*> &getVarInfo() {
3971             return var_info;
3972         }
3973 
3974         //!
3975         //! \brief      Returns the integer value of the AddressCount field.
3976         //! \details    AddressCount field is at index 5 in the internal
3977         //!             array of Fields.
3978         //! \retval     An integer.
3979         //!
getAddressCount()3980         uint16_t getAddressCount() {
3981             return (uint16_t)fields[5].number16;
3982         }
3983 
3984         //!
3985         //! \brief      Sets the integer value of the AddressCount field.
3986         //! \details    AddressCount field is at index 5 in the internal
3987         //!             array of Fields.
3988         //! \param      [in] value.
3989         //!             Integer be assigned.
3990         //!
setAddressCount(uint16_t value)3991         void setAddressCount(uint16_t value) {
3992             fields[5].number16 = value;
3993         }
3994 
3995         //!
3996         //! \brief      Returns the reference to the vector of AddressInfo objects.
3997         //! \details    KernelBody has a vector of AddressInfo objects
3998         //!             that represents another entity within the vISA object format.
3999         //! \retval     Reference to the vector of AddressInfo*.
4000         //!
getAddressInfo()4001         std::vector<AddressInfo*> &getAddressInfo() {
4002             return address_info;
4003         }
4004 
4005         //!
4006         //! \brief      Returns the integer value of the PredicateCount field.
4007         //! \details    PredicateCount field is at index 7 in the internal
4008         //!             array of Fields.
4009         //! \retval     An integer.
4010         //!
getPredicateCount()4011         uint16_t getPredicateCount() {
4012             return (uint16_t)fields[7].number16;
4013         }
4014 
4015         //!
4016         //! \brief      Sets the integer value of the PredicateCount field.
4017         //! \details    PredicateCount field is at index 7 in the internal
4018         //!             array of Fields.
4019         //! \param      [in] value.
4020         //!             Integer be assigned.
4021         //!
setPredicateCount(uint16_t value)4022         void setPredicateCount(uint16_t value) {
4023             fields[7].number16 = value;
4024         }
4025 
4026         //!
4027         //! \brief      Returns the reference to the vector of PredicateInfo objects.
4028         //! \details    KernelBody has a vector of PredicateInfo objects
4029         //!             that represents another entity within the vISA object format.
4030         //! \retval     Reference to the vector of PredicateInfo*.
4031         //!
getPredicateInfo()4032         std::vector<PredicateInfo*> &getPredicateInfo() {
4033             return predicate_info;
4034         }
4035 
4036         //!
4037         //! \brief      Returns the integer value of the LabelCount field.
4038         //! \details    LabelCount field is at index 9 in the internal
4039         //!             array of Fields.
4040         //! \retval     An integer.
4041         //!
getLabelCount()4042         uint16_t getLabelCount() {
4043             return (uint16_t)fields[9].number16;
4044         }
4045 
4046         //!
4047         //! \brief      Sets the integer value of the LabelCount field.
4048         //! \details    LabelCount field is at index 9 in the internal
4049         //!             array of Fields.
4050         //! \param      [in] value.
4051         //!             Integer be assigned.
4052         //!
setLabelCount(uint16_t value)4053         void setLabelCount(uint16_t value) {
4054             fields[9].number16 = value;
4055         }
4056 
4057         //!
4058         //! \brief      Returns the reference to the vector of LabelInfo objects.
4059         //! \details    KernelBody has a vector of LabelInfo objects
4060         //!             that represents another entity within the vISA object format.
4061         //! \retval     Reference to the vector of LabelInfo*.
4062         //!
getLabelInfo()4063         std::vector<LabelInfo*> &getLabelInfo() {
4064             return label_info;
4065         }
4066 
4067         //!
4068         //! \brief      Returns the integer value of the SamplerCount field.
4069         //! \details    SamplerCount field is at index 11 in the internal
4070         //!             array of Fields.
4071         //! \retval     An integer.
4072         //!
getSamplerCount()4073         uint8_t getSamplerCount() {
4074             return (uint8_t)fields[11].number8;
4075         }
4076 
4077         //!
4078         //! \brief      Sets the integer value of the SamplerCount field.
4079         //! \details    SamplerCount field is at index 11 in the internal
4080         //!             array of Fields.
4081         //! \param      [in] value.
4082         //!             Integer be assigned.
4083         //!
setSamplerCount(uint8_t value)4084         void setSamplerCount(uint8_t value) {
4085             fields[11].number8 = value;
4086         }
4087 
4088         //!
4089         //! \brief      Returns the reference to the vector of SamplerInfo objects.
4090         //! \details    KernelBody has a vector of SamplerInfo objects
4091         //!             that represents another entity within the vISA object format.
4092         //! \retval     Reference to the vector of SamplerInfo*.
4093         //!
getSamplerInfo()4094         std::vector<SamplerInfo*> &getSamplerInfo() {
4095             return sampler_info;
4096         }
4097 
4098         //!
4099         //! \brief      Returns the integer value of the SurfaceCount field.
4100         //! \details    SurfaceCount field is at index 13 in the internal
4101         //!             array of Fields.
4102         //! \retval     An integer.
4103         //!
getSurfaceCount()4104         uint8_t getSurfaceCount() {
4105             return (uint8_t)fields[13].number8;
4106         }
4107 
4108         //!
4109         //! \brief      Sets the integer value of the SurfaceCount field.
4110         //! \details    SurfaceCount field is at index 13 in the internal
4111         //!             array of Fields.
4112         //! \param      [in] value.
4113         //!             Integer be assigned.
4114         //!
setSurfaceCount(uint8_t value)4115         void setSurfaceCount(uint8_t value) {
4116             fields[13].number8 = value;
4117         }
4118 
4119         //!
4120         //! \brief      Returns the reference to the vector of SurfaceInfo objects.
4121         //! \details    KernelBody has a vector of SurfaceInfo objects
4122         //!             that represents another entity within the vISA object format.
4123         //! \retval     Reference to the vector of SurfaceInfo*.
4124         //!
getSurfaceInfo()4125         std::vector<SurfaceInfo*> &getSurfaceInfo() {
4126             return surface_info;
4127         }
4128 
4129         //!
4130         //! \brief      Returns the integer value of the VmeCount field.
4131         //! \details    VmeCount field is at index 15 in the internal
4132         //!             array of Fields.
4133         //! \retval     An integer.
4134         //!
getVmeCount()4135         uint8_t getVmeCount() {
4136             return (uint8_t)fields[15].number8;
4137         }
4138 
4139         //!
4140         //! \brief      Sets the integer value of the VmeCount field.
4141         //! \details    VmeCount field is at index 15 in the internal
4142         //!             array of Fields.
4143         //! \param      [in] value.
4144         //!             Integer be assigned.
4145         //!
setVmeCount(uint8_t value)4146         void setVmeCount(uint8_t value) {
4147             fields[15].number8 = value;
4148         }
4149 
4150         //!
4151         //! \brief      Returns the reference to the vector of VmeInfo objects.
4152         //! \details    KernelBody has a vector of VmeInfo objects
4153         //!             that represents another entity within the vISA object format.
4154         //! \retval     Reference to the vector of VmeInfo*.
4155         //!
getVmeInfo()4156         std::vector<VmeInfo*> &getVmeInfo() {
4157             return vme_info;
4158         }
4159 
4160         //!
4161         //! \brief      Returns the integer value of the NumInputs field.
4162         //! \details    NumInputs field is at index 17 in the internal
4163         //!             array of Fields.
4164         //! \retval     An integer.
4165         //!
getNumInputs()4166         uint32_t getNumInputs() {
4167             return (uint32_t)fields[17].number32;
4168         }
4169 
4170         //!
4171         //! \brief      Sets the integer value of the NumInputs field.
4172         //! \details    NumInputs field is at index 17 in the internal
4173         //!             array of Fields.
4174         //! \param      [in] value.
4175         //!             Integer be assigned.
4176         //!
setNumInputs(uint32_t value)4177         void setNumInputs(uint32_t value) {
4178             fields[17].number32 = value;
4179         }
4180 
4181         //!
4182         //! \brief      Returns the reference to the vector of InputInfo objects.
4183         //! \details    KernelBody has a vector of InputInfo objects
4184         //!             that represents another entity within the vISA object format.
4185         //! \retval     Reference to the vector of InputInfo*.
4186         //!
getInputInfo()4187         std::vector<InputInfo*> &getInputInfo() {
4188             return input_info;
4189         }
4190 
4191         //!
4192         //! \brief      Returns the integer value of the Size field.
4193         //! \details    Size field is at index 19 in the internal
4194         //!             array of Fields.
4195         //! \retval     An integer.
4196         //!
getSize()4197         uint32_t getSize() {
4198             return (uint32_t)fields[19].number32;
4199         }
4200 
4201         //!
4202         //! \brief      Sets the integer value of the Size field.
4203         //! \details    Size field is at index 19 in the internal
4204         //!             array of Fields.
4205         //! \param      [in] value.
4206         //!             Integer be assigned.
4207         //!
setSize(uint32_t value)4208         void setSize(uint32_t value) {
4209             fields[19].number32 = value;
4210         }
4211 
4212         //!
4213         //! \brief      Returns the integer value of the Entry field.
4214         //! \details    Entry field is at index 20 in the internal
4215         //!             array of Fields.
4216         //! \retval     An integer.
4217         //!
getEntry()4218         uint32_t getEntry() {
4219             return (uint32_t)fields[20].number32;
4220         }
4221 
4222         //!
4223         //! \brief      Sets the integer value of the Entry field.
4224         //! \details    Entry field is at index 20 in the internal
4225         //!             array of Fields.
4226         //! \param      [in] value.
4227         //!             Integer be assigned.
4228         //!
setEntry(uint32_t value)4229         void setEntry(uint32_t value) {
4230             fields[20].number32 = value;
4231         }
4232 
4233         //!
4234         //! \brief      Returns the integer value of the AttributeCount field.
4235         //! \details    AttributeCount field is at index 21 in the internal
4236         //!             array of Fields.
4237         //! \retval     An integer.
4238         //!
getAttributeCount()4239         uint16_t getAttributeCount() {
4240             return (uint16_t)fields[21].number16;
4241         }
4242 
4243         //!
4244         //! \brief      Sets the integer value of the AttributeCount field.
4245         //! \details    AttributeCount field is at index 21 in the internal
4246         //!             array of Fields.
4247         //! \param      [in] value.
4248         //!             Integer be assigned.
4249         //!
setAttributeCount(uint16_t value)4250         void setAttributeCount(uint16_t value) {
4251             fields[21].number16 = value;
4252         }
4253 
4254         //!
4255         //! \brief      Returns the reference to the vector of AttributeInfo objects.
4256         //! \details    KernelBody has a vector of AttributeInfo objects
4257         //!             that represents another entity within the vISA object format.
4258         //! \retval     Reference to the vector of AttributeInfo*.
4259         //!
getAttributeInfo()4260         std::vector<AttributeInfo*> &getAttributeInfo() {
4261             return attribute_info;
4262         }
4263 
4264         //!
4265         //! \brief      Returns the pointer to buffer data from Instructions field.
4266         //! \details    Instructions field is at index 23 in the internal
4267         //!             array of Fields.
4268         //! \retval     A pointer to buffer data (const uint8_t*).
4269         //!
getInstructions()4270         const uint8_t* getInstructions() {
4271             return fields[23].gdata;
4272         }
4273 
4274         //!
4275         //! \brief      Sets the pointer to buffer data of the Instructions field.
4276         //! \details    Instructions field is at index 23 in the internal
4277         //!             array of Fields.
4278         //! \param      [in] value.
4279         //!             Pointer to buffer data (uint8_t*) to be assigned.
4280         //!
setInstructions(uint8_t * value)4281         void setInstructions(uint8_t * value) {
4282             fields[23].gdata = value;
4283         }
4284 
4285         //!
4286         //! \brief      Parses one KernelBody object from ISA file.
4287         //! \details    Reads and parses all the fields of the KernelBody object
4288         //!             from the file buffer and returns the pointer immediately
4289         //!             after all this data.
4290         //!             If this class contains internal structs, their Parse
4291         //!             functions are called when corresponding.
4292         //! \param      [in] p.
4293         //!             Pointer to file buffer to start reading.
4294         //! \param      [in] end.
4295         //!             Pointer to end of file buffer.
4296         //! \param      [in] m.
4297         //!             Pointer ISAfile object.
4298         //! \retval     Pointer to file buffe after parsing one KernelBody object.
4299         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)4300         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
4301             unsigned i = 0, count = 0;
4302             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4303                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4304                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4305                 i++;
4306             }
4307             // StringPool
4308             count = fields[fields[i].countField].number32;
4309             string_pool.resize(count);
4310             for (unsigned j = 0; j < count; j++) {
4311                 StringPool *r = new StringPool(m->getCurrentVISAVersion());
4312                 p = r->parse(p, end, m);
4313                 if (!p) {
4314                     delete r;
4315                     return 0;
4316                 }
4317                 string_pool[j] = r;
4318             }
4319             i++;
4320             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4321                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4322                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4323                 i++;
4324             }
4325             // Variable
4326             count = fields[fields[i].countField].number32;
4327             var_info.resize(count);
4328             for (unsigned j = 0; j < count; j++) {
4329                 Variable *r = new Variable(m->getCurrentVISAVersion());
4330                 p = r->parse(p, end, m);
4331                 if (!p) {
4332                     delete r;
4333                     return 0;
4334                 }
4335                 var_info[j] = r;
4336             }
4337             i++;
4338             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4339                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4340                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4341                 i++;
4342             }
4343             // AddressInfo
4344             count = fields[fields[i].countField].number32;
4345             address_info.resize(count);
4346             for (unsigned j = 0; j < count; j++) {
4347                 AddressInfo *r = new AddressInfo(m->getCurrentVISAVersion());
4348                 p = r->parse(p, end, m);
4349                 if (!p) {
4350                     delete r;
4351                     return 0;
4352                 }
4353                 address_info[j] = r;
4354             }
4355             i++;
4356             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4357                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4358                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4359                 i++;
4360             }
4361             // PredicateInfo
4362             count = fields[fields[i].countField].number32;
4363             predicate_info.resize(count);
4364             for (unsigned j = 0; j < count; j++) {
4365                 PredicateInfo *r = new PredicateInfo(m->getCurrentVISAVersion());
4366                 p = r->parse(p, end, m);
4367                 if (!p) {
4368                     delete r;
4369                     return 0;
4370                 }
4371                 predicate_info[j] = r;
4372             }
4373             i++;
4374             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4375                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4376                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4377                 i++;
4378             }
4379             // LabelInfo
4380             count = fields[fields[i].countField].number32;
4381             label_info.resize(count);
4382             for (unsigned j = 0; j < count; j++) {
4383                 LabelInfo *r = new LabelInfo(m->getCurrentVISAVersion());
4384                 p = r->parse(p, end, m);
4385                 if (!p) {
4386                     delete r;
4387                     return 0;
4388                 }
4389                 label_info[j] = r;
4390             }
4391             i++;
4392             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4393                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4394                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4395                 i++;
4396             }
4397             // SamplerInfo
4398             count = fields[fields[i].countField].number32;
4399             sampler_info.resize(count);
4400             for (unsigned j = 0; j < count; j++) {
4401                 SamplerInfo *r = new SamplerInfo(m->getCurrentVISAVersion());
4402                 p = r->parse(p, end, m);
4403                 if (!p) {
4404                     delete r;
4405                     return 0;
4406                 }
4407                 sampler_info[j] = r;
4408             }
4409             i++;
4410             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4411                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4412                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4413                 i++;
4414             }
4415             // SurfaceInfo
4416             count = fields[fields[i].countField].number32;
4417             surface_info.resize(count);
4418             for (unsigned j = 0; j < count; j++) {
4419                 SurfaceInfo *r = new SurfaceInfo(m->getCurrentVISAVersion());
4420                 p = r->parse(p, end, m);
4421                 if (!p) {
4422                     delete r;
4423                     return 0;
4424                 }
4425                 surface_info[j] = r;
4426             }
4427             i++;
4428             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4429                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4430                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4431                 i++;
4432             }
4433             // VmeInfo
4434             count = fields[fields[i].countField].number32;
4435             vme_info.resize(count);
4436             for (unsigned j = 0; j < count; j++) {
4437                 VmeInfo *r = new VmeInfo(m->getCurrentVISAVersion());
4438                 p = r->parse(p, end, m);
4439                 if (!p) {
4440                     delete r;
4441                     return 0;
4442                 }
4443                 vme_info[j] = r;
4444             }
4445             i++;
4446             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4447                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4448                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4449                 i++;
4450             }
4451             // InputInfo
4452             count = fields[fields[i].countField].number32;
4453             input_info.resize(count);
4454             for (unsigned j = 0; j < count; j++) {
4455                 InputInfo *r = new InputInfo(m->getCurrentVISAVersion());
4456                 p = r->parse(p, end, m);
4457                 if (!p) {
4458                     delete r;
4459                     return 0;
4460                 }
4461                 input_info[j] = r;
4462             }
4463             i++;
4464             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4465                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4466                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4467                 i++;
4468             }
4469             // AttributeInfo
4470             count = fields[fields[i].countField].number32;
4471             attribute_info.resize(count);
4472             for (unsigned j = 0; j < count; j++) {
4473                 AttributeInfo *r = new AttributeInfo(m->getCurrentVISAVersion());
4474                 p = r->parse(p, end, m);
4475                 if (!p) {
4476                     delete r;
4477                     return 0;
4478                 }
4479                 attribute_info[j] = r;
4480             }
4481             i++;
4482             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4483                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4484                 if (!p) return m->setError("bad offset/size for KernelBody's field", i);
4485                 i++;
4486             }
4487             return p;
4488         }
4489 
4490         //!
4491         //! \brief      Adds all the KernelBody's fields to a buffer.
4492         //! \details    Every field from this class is added to a buffer
4493         //!             in order to be written into an ISA file afterwards
4494         //!             If this class contains other internal structus, their addToBuffer
4495         //!             functions are called when corresponding.
4496         //! \param      [out] buffer.
4497         //!             The buffer where the fields data will be added.
4498         //! \param      [in] m.
4499         //!             Pointer to ISAfile object.
4500         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)4501         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
4502             unsigned i = 0;
4503             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4504                 m->addToBuffer(fields[i], buffer);
4505                 i++;
4506             }
4507             // StringPool
4508             for (StringPool *r : string_pool) {
4509                 r->addToBuffer(buffer, m);
4510             }
4511             i++;
4512             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4513                 m->addToBuffer(fields[i], buffer);
4514                 i++;
4515             }
4516             // Variable
4517             for (Variable *r : var_info) {
4518                 r->addToBuffer(buffer, m);
4519             }
4520             i++;
4521             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4522                 m->addToBuffer(fields[i], buffer);
4523                 i++;
4524             }
4525             // AddressInfo
4526             for (AddressInfo *r : address_info) {
4527                 r->addToBuffer(buffer, m);
4528             }
4529             i++;
4530             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4531                 m->addToBuffer(fields[i], buffer);
4532                 i++;
4533             }
4534             // PredicateInfo
4535             for (PredicateInfo *r : predicate_info) {
4536                 r->addToBuffer(buffer, m);
4537             }
4538             i++;
4539             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4540                 m->addToBuffer(fields[i], buffer);
4541                 i++;
4542             }
4543             // LabelInfo
4544             for (LabelInfo *r : label_info) {
4545                 r->addToBuffer(buffer, m);
4546             }
4547             i++;
4548             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4549                 m->addToBuffer(fields[i], buffer);
4550                 i++;
4551             }
4552             // SamplerInfo
4553             for (SamplerInfo *r : sampler_info) {
4554                 r->addToBuffer(buffer, m);
4555             }
4556             i++;
4557             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4558                 m->addToBuffer(fields[i], buffer);
4559                 i++;
4560             }
4561             // SurfaceInfo
4562             for (SurfaceInfo *r : surface_info) {
4563                 r->addToBuffer(buffer, m);
4564             }
4565             i++;
4566             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4567                 m->addToBuffer(fields[i], buffer);
4568                 i++;
4569             }
4570             // VmeInfo
4571             for (VmeInfo *r : vme_info) {
4572                 r->addToBuffer(buffer, m);
4573             }
4574             i++;
4575             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4576                 m->addToBuffer(fields[i], buffer);
4577                 i++;
4578             }
4579             // InputInfo
4580             for (InputInfo *r : input_info) {
4581                 r->addToBuffer(buffer, m);
4582             }
4583             i++;
4584             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4585                 m->addToBuffer(fields[i], buffer);
4586                 i++;
4587             }
4588             // AttributeInfo
4589             for (AttributeInfo *r : attribute_info) {
4590                 r->addToBuffer(buffer, m);
4591             }
4592             i++;
4593             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4594                 m->addToBuffer(fields[i], buffer);
4595                 i++;
4596             }
4597         }
4598 
4599         //!
4600         //! \brief      Makes the changes needed to support 303 version's KernelBody.
4601         //! \details    This function is called when the current ISA file has the 303 version.
4602         //!             Initially all the objects are created with last version's format, so
4603         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
4604         //!             of fields can be needed.
4605         //!
setVersion303()4606         void setVersion303() {
4607             fields[0] = Datatype::TWO;
4608             fields[2] = Datatype::TWO;
4609             fields[3] = Datatype::TWO;
4610         }
4611 
4612         //!
4613         //! \brief      Makes the changes needed to support 304 version's KernelBody.
4614         //! \details    This function is called when the current ISA file has the 304 version.
4615         //!             Initially all the objects are created with last version's format, so
4616         //!             in order to suppport previous versions, changes of datatypes and insertion/removal
4617         //!             of fields can be needed.
4618         //!
setVersion304()4619         void setVersion304() {
4620             fields[17] = Datatype::ONE;
4621         }
4622     MEDIA_CLASS_DEFINE_END(vp__vISA__KernelBody)
4623     };
4624 
4625     //!
4626     //! \brief      Kernel Class.
4627     //! \details    This class represents the Kernel from vISA Object Format.
4628     //!             Provides getters, setters for its fields and structs as well as
4629     //!             functions to read/write it from/to file.
4630     //!
4631     class Kernel {
4632     public:
4633         std::array<Field, 11> fields = std::array<Field, 11>
4634         {
4635             Field(Datatype::TWO), // name_len
4636                 Field(Datatype::VARCHAR, 0), // name
4637                 Field(Datatype::FOUR), // offset
4638                 Field(Datatype::FOUR), // size
4639                 Field(Datatype::FOUR), // input_offset
4640                 Field(Datatype::TWO), // num_syms_variable
4641                 Field(Datatype::STRUCT, 5), // variable_reloc_symtab
4642                 Field(Datatype::TWO), // num_syms_function
4643                 Field(Datatype::STRUCT, 7), // function_reloc_symtab
4644                 Field(Datatype::ONE), // num_gen_binaries
4645                 Field(Datatype::STRUCT, 9), // gen_binary_info
4646         };
4647         std::vector<RelocationInfo*> variable_reloc_symtab;
4648         std::vector<RelocationInfo*> function_reloc_symtab;
4649         std::vector<GenBinary*> gen_binary_info;
4650 
4651         //!
4652         //! \brief      Constructor of Kernel class.
4653         //! \param      [in] version.
4654         //!             Version of current ISA file.
4655         //!
Kernel(unsigned version)4656         Kernel(unsigned version) {
4657             if (version <= 306) setVersion306();
4658         }
4659 
4660         //!
4661         //! \brief      Constructor of Kernel class.
4662         //!
Kernel()4663         Kernel() {}
4664 
4665         //!
4666         //! \brief      Copy Constructor of Kernel class.
4667         //! \param      [in] other.
4668         //!             Reference to object to copy..
4669         //!
Kernel(const Kernel & other)4670         Kernel(const Kernel& other) {
4671             fields = other.fields;
4672             for (RelocationInfo *r : other.variable_reloc_symtab) {
4673                 RelocationInfo *s = new RelocationInfo();
4674                 *s = *r;
4675                 variable_reloc_symtab.push_back(s);
4676             }
4677             for (RelocationInfo *r : other.function_reloc_symtab) {
4678                 RelocationInfo *s = new RelocationInfo();
4679                 *s = *r;
4680                 function_reloc_symtab.push_back(s);
4681             }
4682             for (GenBinary *r : other.gen_binary_info) {
4683                 GenBinary *s = new GenBinary();
4684                 *s = *r;
4685                 gen_binary_info.push_back(s);
4686             }
4687         }
4688 
4689         //!
4690         //! \brief      Assignment operator.
4691         //! \param      [in] other.
4692         //!             Reference to object to copy..
4693         //!
4694         Kernel& operator= (const Kernel& other) {
4695             if (this != &other) {
4696                 fields = other.fields;
4697                 for (RelocationInfo *r : variable_reloc_symtab)
4698                     delete r;
4699                 for (RelocationInfo *r : other.variable_reloc_symtab) {
4700                     RelocationInfo *s = new RelocationInfo();
4701                     *s = *r;
4702                     variable_reloc_symtab.push_back(s);
4703                 }
4704                 for (RelocationInfo *r : function_reloc_symtab)
4705                     delete r;
4706                 for (RelocationInfo *r : other.function_reloc_symtab) {
4707                     RelocationInfo *s = new RelocationInfo();
4708                     *s = *r;
4709                     function_reloc_symtab.push_back(s);
4710                 }
4711                 for (GenBinary *r : gen_binary_info)
4712                     delete r;
4713                 for (GenBinary *r : other.gen_binary_info) {
4714                     GenBinary *s = new GenBinary();
4715                     *s = *r;
4716                     gen_binary_info.push_back(s);
4717                 }
4718             }
4719             return *this;
4720         }
4721 
4722         //!
4723         //! \brief      Destructor of Kernel class.
4724         //!
~Kernel()4725         ~Kernel() {
4726             for (RelocationInfo *s : variable_reloc_symtab) delete s;
4727             for (RelocationInfo *s : function_reloc_symtab) delete s;
4728             for (GenBinary *s : gen_binary_info) delete s;
4729         }
4730 
4731         //!
4732         //! \brief      Returns the integer value of the NameLen field.
4733         //! \details    NameLen field is at index 0 in the internal
4734         //!             array of Fields for vesrion <= 306
4735         //! \retval     An integer.
4736         //!
getNameLen_Ver306()4737         uint8_t getNameLen_Ver306() {
4738             return (uint8_t)fields[0].number8;
4739         }
4740 
4741         //!
4742         //! \brief      Returns the integer value of the NameLen field.
4743         //! \details    NameLen field is at index 0 in the internal
4744         //!             array of Fields.
4745         //! \retval     An integer.
4746         //!
getNameLen()4747         uint16_t getNameLen()
4748         {
4749             return (uint16_t)fields[0].number16;
4750         }
4751 
4752         //!
4753         //! \brief      Sets the integer value of the NameLen field.
4754         //! \details    NameLen field is at index 0 in the internal
4755         //!             array of Fields for version <= 306
4756         //! \param      [in] value.
4757         //!             Integer be assigned.
4758         //!
setNameLen_Ver306(uint8_t value)4759         void setNameLen_Ver306(uint8_t value) {
4760             fields[0].number8 = value;
4761         }
4762 
4763         //!
4764         //! \brief      Sets the integer value of the NameLen field.
4765         //! \details    NameLen field is at index 0 in the internal
4766         //!             array of Fields.
4767         //! \param      [in] value.
4768         //!             Integer be assigned.
4769         //!
setNameLen(uint16_t value)4770         void setNameLen(uint16_t value)
4771         {
4772             fields[0].number16 = value;
4773         }
4774 
4775         //!
4776         //! \brief      Returns the string value of the Name field.
4777         //! \details    Name field is at index 1 in the internal
4778         //!             array of Fields.
4779         //! \retval     A pointer to the string (const char*).
4780         //!
getName()4781         const char * getName() {
4782             return fields[1].varchar;
4783         }
4784 
4785         //!
4786         //! \brief      Sets the string value of the Name field.
4787         //! \details    Name field is at index 1 in the internal
4788         //!             array of Fields.
4789         //! \param      [in] value.
4790         //!             Pointer to string (char*) to be assigned.
4791         //!
setName(char * value)4792         void setName(char * value) {
4793             fields[1].varchar = value;
4794         }
4795 
4796         //!
4797         //! \brief      Returns the integer value of the Offset field.
4798         //! \details    Offset field is at index 2 in the internal
4799         //!             array of Fields.
4800         //! \retval     An integer.
4801         //!
getOffset()4802         uint32_t getOffset() {
4803             return (uint32_t)fields[2].number32;
4804         }
4805 
4806         //!
4807         //! \brief      Sets the integer value of the Offset field.
4808         //! \details    Offset field is at index 2 in the internal
4809         //!             array of Fields.
4810         //! \param      [in] value.
4811         //!             Integer be assigned.
4812         //!
setOffset(uint32_t value)4813         void setOffset(uint32_t value) {
4814             fields[2].number32 = value;
4815         }
4816 
4817         //!
4818         //! \brief      Returns the integer value of the Size field.
4819         //! \details    Size field is at index 3 in the internal
4820         //!             array of Fields.
4821         //! \retval     An integer.
4822         //!
getSize()4823         uint32_t getSize() {
4824             return (uint32_t)fields[3].number32;
4825         }
4826 
4827         //!
4828         //! \brief      Sets the integer value of the Size field.
4829         //! \details    Size field is at index 3 in the internal
4830         //!             array of Fields.
4831         //! \param      [in] value.
4832         //!             Integer be assigned.
4833         //!
setSize(uint32_t value)4834         void setSize(uint32_t value) {
4835             fields[3].number32 = value;
4836         }
4837 
4838         //!
4839         //! \brief      Returns the integer value of the InputOffset field.
4840         //! \details    InputOffset field is at index 4 in the internal
4841         //!             array of Fields.
4842         //! \retval     An integer.
4843         //!
getInputOffset()4844         uint32_t getInputOffset() {
4845             return (uint32_t)fields[4].number32;
4846         }
4847 
4848         //!
4849         //! \brief      Sets the integer value of the InputOffset field.
4850         //! \details    InputOffset field is at index 4 in the internal
4851         //!             array of Fields.
4852         //! \param      [in] value.
4853         //!             Integer be assigned.
4854         //!
setInputOffset(uint32_t value)4855         void setInputOffset(uint32_t value) {
4856             fields[4].number32 = value;
4857         }
4858 
4859         //!
4860         //! \brief      Returns the integer value of the NumSymsVariable field.
4861         //! \details    NumSymsVariable field is at index 5 in the internal
4862         //!             array of Fields.
4863         //! \retval     An integer.
4864         //!
getNumSymsVariable()4865         uint16_t getNumSymsVariable() {
4866             return (uint16_t)fields[5].number16;
4867         }
4868 
4869         //!
4870         //! \brief      Sets the integer value of the NumSymsVariable field.
4871         //! \details    NumSymsVariable field is at index 5 in the internal
4872         //!             array of Fields.
4873         //! \param      [in] value.
4874         //!             Integer be assigned.
4875         //!
setNumSymsVariable(uint16_t value)4876         void setNumSymsVariable(uint16_t value) {
4877             fields[5].number16 = value;
4878         }
4879 
4880         //!
4881         //! \brief      Returns the reference to the vector of RelocationInfo objects.
4882         //! \details    Kernel has a vector of RelocationInfo objects
4883         //!             that represents another entity within the vISA object format.
4884         //! \retval     Reference to the vector of RelocationInfo*.
4885         //!
getVariableRelocSymtab()4886         std::vector<RelocationInfo*> &getVariableRelocSymtab() {
4887             return variable_reloc_symtab;
4888         }
4889 
4890         //!
4891         //! \brief      Returns the integer value of the NumSymsFunction field.
4892         //! \details    NumSymsFunction field is at index 7 in the internal
4893         //!             array of Fields.
4894         //! \retval     An integer.
4895         //!
getNumSymsFunction()4896         uint16_t getNumSymsFunction() {
4897             return (uint16_t)fields[7].number16;
4898         }
4899 
4900         //!
4901         //! \brief      Sets the integer value of the NumSymsFunction field.
4902         //! \details    NumSymsFunction field is at index 7 in the internal
4903         //!             array of Fields.
4904         //! \param      [in] value.
4905         //!             Integer be assigned.
4906         //!
setNumSymsFunction(uint16_t value)4907         void setNumSymsFunction(uint16_t value) {
4908             fields[7].number16 = value;
4909         }
4910 
4911         //!
4912         //! \brief      Returns the reference to the vector of RelocationInfo objects.
4913         //! \details    Kernel has a vector of RelocationInfo objects
4914         //!             that represents another entity within the vISA object format.
4915         //! \retval     Reference to the vector of RelocationInfo*.
4916         //!
getFunctionRelocSymtab()4917         std::vector<RelocationInfo*> &getFunctionRelocSymtab() {
4918             return function_reloc_symtab;
4919         }
4920 
4921         //!
4922         //! \brief      Returns the integer value of the NumGenBinaries field.
4923         //! \details    NumGenBinaries field is at index 9 in the internal
4924         //!             array of Fields.
4925         //! \retval     An integer.
4926         //!
getNumGenBinaries()4927         uint8_t getNumGenBinaries() {
4928             return (uint8_t)fields[9].number8;
4929         }
4930 
4931         //!
4932         //! \brief      Sets the integer value of the NumGenBinaries field.
4933         //! \details    NumGenBinaries field is at index 9 in the internal
4934         //!             array of Fields.
4935         //! \param      [in] value.
4936         //!             Integer be assigned.
4937         //!
setNumGenBinaries(uint8_t value)4938         void setNumGenBinaries(uint8_t value) {
4939             fields[9].number8 = value;
4940         }
4941 
4942         //!
4943         //! \brief      Returns the reference to the vector of GenBinary objects.
4944         //! \details    Kernel has a vector of GenBinary objects
4945         //!             that represents another entity within the vISA object format.
4946         //! \retval     Reference to the vector of GenBinary*.
4947         //!
getGenBinaryInfo()4948         std::vector<GenBinary*> &getGenBinaryInfo() {
4949             return gen_binary_info;
4950         }
4951 
4952         //!
4953         //! \brief      Parses one Kernel object from ISA file.
4954         //! \details    Reads and parses all the fields of the Kernel object
4955         //!             from the file buffer and returns the pointer immediately
4956         //!             after all this data.
4957         //!             If this class contains internal structs, their Parse
4958         //!             functions are called when corresponding.
4959         //! \param      [in] p.
4960         //!             Pointer to file buffer to start reading.
4961         //! \param      [in] end.
4962         //!             Pointer to end of file buffer.
4963         //! \param      [in] m.
4964         //!             Pointer ISAfile object.
4965         //! \retval     Pointer to file buffe after parsing one Kernel object.
4966         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)4967         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
4968             unsigned i = 0, count = 0;
4969             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4970                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4971                 if (!p) return m->setError("bad offset/size for Kernel's field", i);
4972                 i++;
4973             }
4974             // RelocationInfo
4975             count = fields[fields[i].countField].number32;
4976             variable_reloc_symtab.resize(count);
4977             for (unsigned j = 0; j < count; j++) {
4978                 RelocationInfo *r = new RelocationInfo(m->getCurrentVISAVersion());
4979                 p = r->parse(p, end, m);
4980                 if (!p) {
4981                     delete r;
4982                     return 0;
4983                 }
4984                 variable_reloc_symtab[j] = r;
4985             }
4986             i++;
4987             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
4988                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
4989                 if (!p) return m->setError("bad offset/size for Kernel's field", i);
4990                 i++;
4991             }
4992             // RelocationInfo
4993             count = fields[fields[i].countField].number32;
4994             function_reloc_symtab.resize(count);
4995             for (unsigned j = 0; j < count; j++) {
4996                 RelocationInfo *r = new RelocationInfo(m->getCurrentVISAVersion());
4997                 p = r->parse(p, end, m);
4998                 if (!p) {
4999                     delete r;
5000                     return 0;
5001                 }
5002                 function_reloc_symtab[j] = r;
5003             }
5004             i++;
5005             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5006                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
5007                 if (!p) return m->setError("bad offset/size for Kernel's field", i);
5008                 i++;
5009             }
5010             // GenBinary
5011             count = fields[fields[i].countField].number32;
5012             gen_binary_info.resize(count);
5013             for (unsigned j = 0; j < count; j++) {
5014                 GenBinary *r = new GenBinary(m->getCurrentVISAVersion());
5015                 p = r->parse(p, end, m);
5016                 if (!p) {
5017                     delete r;
5018                     return 0;
5019                 }
5020                 gen_binary_info[j] = r;
5021             }
5022             i++;
5023             return p;
5024         }
5025 
5026         //!
5027         //! \brief      Adds all the Kernel's fields to a buffer.
5028         //! \details    Every field from this class is added to a buffer
5029         //!             in order to be written into an ISA file afterwards
5030         //!             If this class contains other internal structus, their addToBuffer
5031         //!             functions are called when corresponding.
5032         //! \param      [out] buffer.
5033         //!             The buffer where the fields data will be added.
5034         //! \param      [in] m.
5035         //!             Pointer to ISAfile object.
5036         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)5037         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
5038             unsigned i = 0;
5039             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5040                 m->addToBuffer(fields[i], buffer);
5041                 i++;
5042             }
5043             // RelocationInfo
5044             for (RelocationInfo *r : variable_reloc_symtab) {
5045                 r->addToBuffer(buffer, m);
5046             }
5047             i++;
5048             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5049                 m->addToBuffer(fields[i], buffer);
5050                 i++;
5051             }
5052             // RelocationInfo
5053             for (RelocationInfo *r : function_reloc_symtab) {
5054                 r->addToBuffer(buffer, m);
5055             }
5056             i++;
5057             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5058                 m->addToBuffer(fields[i], buffer);
5059                 i++;
5060             }
5061             // GenBinary
5062             for (GenBinary *r : gen_binary_info) {
5063                 r->addToBuffer(buffer, m);
5064             }
5065             i++;
5066         }
5067 
5068         //!
5069         //! \brief      Makes the changes needed to support 306 version's Kernel.
5070         //! \details    This function is called when the current ISA file has the 306 version.
5071         //!             Initially all the objects are created with last version's format, so
5072         //!             in order to suppport newer versions, changes of datatypes and insertion/removal
5073         //!             of fields can be needed.
5074         //!
setVersion306()5075         void setVersion306()
5076         {
5077             fields[0] = Datatype::ONE;
5078         }
5079     MEDIA_CLASS_DEFINE_END(vp__vISA__Kernel)
5080     };
5081 
5082     //!
5083     //! \brief      Header Class.
5084     //! \details    This class represents the Header from vISA Object Format.
5085     //!             Provides getters, setters for its fields and structs as well as
5086     //!             functions to read/write it from/to file.
5087     //!
5088     class Header {
5089     public:
5090         std::array<Field, 9> fields = std::array<Field, 9>
5091         {
5092             Field(Datatype::FOUR), // magic_number
5093                 Field(Datatype::ONE), // major_version
5094                 Field(Datatype::ONE), // minor_version
5095                 Field(Datatype::TWO), // num_kernels
5096                 Field(Datatype::STRUCT, 3), // kernel_info
5097                 Field(Datatype::TWO), // num_variables
5098                 Field(Datatype::STRUCT, 5), // file_scope_var_info
5099                 Field(Datatype::TWO), // num_functions
5100                 Field(Datatype::STRUCT, 7), // function_info
5101         };
5102         std::vector<Kernel*> kernel_info;
5103         std::vector<GlobalVariable*> file_scope_var_info;
5104         std::vector<Function*> function_info;
5105 
5106         //!
5107         //! \brief      Constructor of Header class.
5108         //! \param      [in] version.
5109         //!             Version of current ISA file.
5110         //!
Header(unsigned version)5111         Header(unsigned version) {}
5112 
5113         //!
5114         //! \brief      Copy Constructor of Header class.
5115         //! \param      [in] other.
5116         //!             Reference to object to copy..
5117         //!
Header(const Header & other)5118         Header(const Header& other) {
5119             fields = other.fields;
5120             for (Kernel *r : other.kernel_info) {
5121                 Kernel *s = new Kernel();
5122                 *s = *r;
5123                 kernel_info.push_back(s);
5124             }
5125             for (GlobalVariable *r : other.file_scope_var_info) {
5126                 GlobalVariable *s = new GlobalVariable();
5127                 *s = *r;
5128                 file_scope_var_info.push_back(s);
5129             }
5130             for (Function *r : other.function_info) {
5131                 Function *s = new Function();
5132                 *s = *r;
5133                 function_info.push_back(s);
5134             }
5135         }
5136 
5137         //!
5138         //! \brief      Assignment operator.
5139         //! \param      [in] other.
5140         //!             Reference to object to copy..
5141         //!
5142         Header& operator= (const Header& other) {
5143             if (this != &other) {
5144                 fields = other.fields;
5145                 for (Kernel *r : kernel_info)
5146                     delete r;
5147                 for (Kernel *r : other.kernel_info) {
5148                     Kernel *s = new Kernel();
5149                     *s = *r;
5150                     kernel_info.push_back(s);
5151                 }
5152                 for (GlobalVariable *r : file_scope_var_info)
5153                     delete r;
5154                 for (GlobalVariable *r : other.file_scope_var_info) {
5155                     GlobalVariable *s = new GlobalVariable();
5156                     *s = *r;
5157                     file_scope_var_info.push_back(s);
5158                 }
5159                 for (Function *r : function_info)
5160                     delete r;
5161                 for (Function *r : other.function_info) {
5162                     Function *s = new Function();
5163                     *s = *r;
5164                     function_info.push_back(s);
5165                 }
5166             }
5167             return *this;
5168         }
5169 
5170         //!
5171         //! \brief      Destructor of Header class.
5172         //!
~Header()5173         ~Header() {
5174             for (Kernel *s : kernel_info) delete s;
5175             for (GlobalVariable *s : file_scope_var_info) delete s;
5176             for (Function *s : function_info) delete s;
5177         }
5178 
5179         //!
5180         //! \brief      Returns the integer value of the MagicNumber field.
5181         //! \details    MagicNumber field is at index 0 in the internal
5182         //!             array of Fields.
5183         //! \retval     An integer.
5184         //!
getMagicNumber()5185         uint32_t getMagicNumber() {
5186             return (uint32_t)fields[0].number32;
5187         }
5188 
5189         //!
5190         //! \brief      Sets the integer value of the MagicNumber field.
5191         //! \details    MagicNumber field is at index 0 in the internal
5192         //!             array of Fields.
5193         //! \param      [in] value.
5194         //!             Integer be assigned.
5195         //!
setMagicNumber(uint32_t value)5196         void setMagicNumber(uint32_t value) {
5197             fields[0].number32 = value;
5198         }
5199 
5200         //!
5201         //! \brief      Returns the integer value of the MajorVersion field.
5202         //! \details    MajorVersion field is at index 1 in the internal
5203         //!             array of Fields.
5204         //! \retval     An integer.
5205         //!
getMajorVersion()5206         uint8_t getMajorVersion() {
5207             return (uint8_t)fields[1].number8;
5208         }
5209 
5210         //!
5211         //! \brief      Sets the integer value of the MajorVersion field.
5212         //! \details    MajorVersion field is at index 1 in the internal
5213         //!             array of Fields.
5214         //! \param      [in] value.
5215         //!             Integer be assigned.
5216         //!
setMajorVersion(uint8_t value)5217         void setMajorVersion(uint8_t value) {
5218             fields[1].number8 = value;
5219         }
5220 
5221         //!
5222         //! \brief      Returns the integer value of the MinorVersion field.
5223         //! \details    MinorVersion field is at index 2 in the internal
5224         //!             array of Fields.
5225         //! \retval     An integer.
5226         //!
getMinorVersion()5227         uint8_t getMinorVersion() {
5228             return (uint8_t)fields[2].number8;
5229         }
5230 
5231         //!
5232         //! \brief      Sets the integer value of the MinorVersion field.
5233         //! \details    MinorVersion field is at index 2 in the internal
5234         //!             array of Fields.
5235         //! \param      [in] value.
5236         //!             Integer be assigned.
5237         //!
setMinorVersion(uint8_t value)5238         void setMinorVersion(uint8_t value) {
5239             fields[2].number8 = value;
5240         }
5241 
5242         //!
5243         //! \brief      Returns the integer value of the NumKernels field.
5244         //! \details    NumKernels field is at index 3 in the internal
5245         //!             array of Fields.
5246         //! \retval     An integer.
5247         //!
getNumKernels()5248         uint16_t getNumKernels() {
5249             return (uint16_t)fields[3].number16;
5250         }
5251 
5252         //!
5253         //! \brief      Sets the integer value of the NumKernels field.
5254         //! \details    NumKernels field is at index 3 in the internal
5255         //!             array of Fields.
5256         //! \param      [in] value.
5257         //!             Integer be assigned.
5258         //!
setNumKernels(uint16_t value)5259         void setNumKernels(uint16_t value) {
5260             fields[3].number16 = value;
5261         }
5262 
5263         //!
5264         //! \brief      Returns the reference to the vector of Kernel objects.
5265         //! \details    Header has a vector of Kernel objects
5266         //!             that represents another entity within the vISA object format.
5267         //! \retval     Reference to the vector of Kernel*.
5268         //!
getKernelInfo()5269         std::vector<Kernel*> &getKernelInfo() {
5270             return kernel_info;
5271         }
5272 
5273         //!
5274         //! \brief      Returns the integer value of the NumVariables field.
5275         //! \details    NumVariables field is at index 5 in the internal
5276         //!             array of Fields.
5277         //! \retval     An integer.
5278         //!
getNumVariables()5279         uint16_t getNumVariables() {
5280             return (uint16_t)fields[5].number16;
5281         }
5282 
5283         //!
5284         //! \brief      Sets the integer value of the NumVariables field.
5285         //! \details    NumVariables field is at index 5 in the internal
5286         //!             array of Fields.
5287         //! \param      [in] value.
5288         //!             Integer be assigned.
5289         //!
setNumVariables(uint16_t value)5290         void setNumVariables(uint16_t value) {
5291             fields[5].number16 = value;
5292         }
5293 
5294         //!
5295         //! \brief      Returns the reference to the vector of GlobalVariable objects.
5296         //! \details    Header has a vector of GlobalVariable objects
5297         //!             that represents another entity within the vISA object format.
5298         //! \retval     Reference to the vector of GlobalVariable*.
5299         //!
getFileScopeVarInfo()5300         std::vector<GlobalVariable*> &getFileScopeVarInfo() {
5301             return file_scope_var_info;
5302         }
5303 
5304         //!
5305         //! \brief      Returns the integer value of the NumFunctions field.
5306         //! \details    NumFunctions field is at index 7 in the internal
5307         //!             array of Fields.
5308         //! \retval     An integer.
5309         //!
getNumFunctions()5310         uint16_t getNumFunctions() {
5311             return (uint16_t)fields[7].number16;
5312         }
5313 
5314         //!
5315         //! \brief      Sets the integer value of the NumFunctions field.
5316         //! \details    NumFunctions field is at index 7 in the internal
5317         //!             array of Fields.
5318         //! \param      [in] value.
5319         //!             Integer be assigned.
5320         //!
setNumFunctions(uint16_t value)5321         void setNumFunctions(uint16_t value) {
5322             fields[7].number16 = value;
5323         }
5324 
5325         //!
5326         //! \brief      Returns the reference to the vector of Function objects.
5327         //! \details    Header has a vector of Function objects
5328         //!             that represents another entity within the vISA object format.
5329         //! \retval     Reference to the vector of Function*.
5330         //!
getFunctionInfo()5331         std::vector<Function*> &getFunctionInfo() {
5332             return function_info;
5333         }
5334 
5335         //!
5336         //! \brief      Parses one Header object from ISA file.
5337         //! \details    Reads and parses all the fields of the Header object
5338         //!             from the file buffer and returns the pointer immediately
5339         //!             after all this data.
5340         //!             If this class contains internal structs, their Parse
5341         //!             functions are called when corresponding.
5342         //! \param      [in] p.
5343         //!             Pointer to file buffer to start reading.
5344         //! \param      [in] end.
5345         //!             Pointer to end of file buffer.
5346         //! \param      [in] m.
5347         //!             Pointer ISAfile object.
5348         //! \retval     Pointer to file buffe after parsing one Header object.
5349         //!
parse(const uint8_t * p,const uint8_t * end,ISAfile * m)5350         const uint8_t* parse(const uint8_t *p, const uint8_t *end, ISAfile *m) {
5351             unsigned i = 0, count = 0;
5352             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5353                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
5354                 if (!p) return m->setError("bad offset/size for Header's field", i);
5355                 i++;
5356             }
5357             m->setCurrentVISAVersion(getMajorVersion() * 100 + getMinorVersion());
5358             // Kernel
5359             count = fields[fields[i].countField].number32;
5360             kernel_info.resize(count);
5361             for (unsigned j = 0; j < count; j++) {
5362                 Kernel *r = new Kernel(m->getCurrentVISAVersion());
5363                 p = r->parse(p, end, m);
5364                 if (!p) {
5365                     delete r;
5366                     return 0;
5367                 }
5368                 kernel_info[j] = r;
5369             }
5370             i++;
5371             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5372                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
5373                 if (!p) return m->setError("bad offset/size for Header's field", i);
5374                 i++;
5375             }
5376             // GlobalVariable
5377             count = fields[fields[i].countField].number32;
5378             file_scope_var_info.resize(count);
5379             for (unsigned j = 0; j < count; j++) {
5380                 GlobalVariable *r = new GlobalVariable(m->getCurrentVISAVersion());
5381                 p = r->parse(p, end, m);
5382                 if (!p) {
5383                     delete r;
5384                     return 0;
5385                 }
5386                 file_scope_var_info[j] = r;
5387             }
5388             i++;
5389             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5390                 p = m->readField(p, end, fields[i], fields[fields[i].countField].number32);
5391                 if (!p) return m->setError("bad offset/size for Header's field", i);
5392                 i++;
5393             }
5394             // Function
5395             count = fields[fields[i].countField].number32;
5396             function_info.resize(count);
5397             for (unsigned j = 0; j < count; j++) {
5398                 Function *r = new Function(m->getCurrentVISAVersion());
5399                 p = r->parse(p, end, m);
5400                 if (!p) {
5401                     delete r;
5402                     return 0;
5403                 }
5404                 function_info[j] = r;
5405             }
5406             i++;
5407             return p;
5408         }
5409 
5410         //!
5411         //! \brief      Adds all the Header's fields to a buffer.
5412         //! \details    Every field from this class is added to a buffer
5413         //!             in order to be written into an ISA file afterwards
5414         //!             If this class contains other internal structus, their addToBuffer
5415         //!             functions are called when corresponding.
5416         //! \param      [out] buffer.
5417         //!             The buffer where the fields data will be added.
5418         //! \param      [in] m.
5419         //!             Pointer to ISAfile object.
5420         //!
addToBuffer(std::vector<char> & buffer,ISAfile * m)5421         void addToBuffer(std::vector<char> &buffer, ISAfile *m) {
5422             unsigned i = 0;
5423             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5424                 m->addToBuffer(fields[i], buffer);
5425                 i++;
5426             }
5427             // Kernel
5428             for (Kernel *r : kernel_info) {
5429                 r->addToBuffer(buffer, m);
5430             }
5431             i++;
5432             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5433                 m->addToBuffer(fields[i], buffer);
5434                 i++;
5435             }
5436             // GlobalVariable
5437             for (GlobalVariable *r : file_scope_var_info) {
5438                 r->addToBuffer(buffer, m);
5439             }
5440             i++;
5441             while (i < fields.size() && fields[i].type != Datatype::STRUCT) {
5442                 m->addToBuffer(fields[i], buffer);
5443                 i++;
5444             }
5445             // Function
5446             for (Function *r : function_info) {
5447                 r->addToBuffer(buffer, m);
5448             }
5449             i++;
5450         }
5451     MEDIA_CLASS_DEFINE_END(vp__vISA__Header)
5452     };
5453 
5454 } // namespace vISA
5455 } // namespace vp
5456 
5457 #endif //__VP_VISA_H__
5458