1 /*
2 * Copyright (C) 2010 Marcin Kościelnicki <koriakin@0x04.net>
3 * Copyright (C) 2010 Luca Barbieri <luca@luca-barbieri.com>
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26 #ifndef RNN_H
27 #define RNN_H
28
29 #include <stdint.h>
30 #include <stdlib.h>
31
32 struct rnnauthor {
33 char* name;
34 char* email;
35 char* contributions;
36 char* license;
37 char** nicknames;
38 int nicknamesnum;
39 int nicknamesmax;
40 };
41
42 struct rnncopyright {
43 unsigned firstyear;
44 char* license;
45 struct rnnauthor **authors;
46 int authorsnum;
47 int authorsmax;
48 };
49
50 struct rnndb {
51 struct rnncopyright copyright;
52 struct rnnenum **enums;
53 int enumsnum;
54 int enumsmax;
55 struct rnnbitset **bitsets;
56 int bitsetsnum;
57 int bitsetsmax;
58 struct rnndomain **domains;
59 int domainsnum;
60 int domainsmax;
61 struct rnngroup **groups;
62 int groupsnum;
63 int groupsmax;
64 struct rnnspectype **spectypes;
65 int spectypesnum;
66 int spectypesmax;
67 char **files;
68 int filesnum;
69 int filesmax;
70 int estatus;
71 };
72
73 struct rnnvarset {
74 struct rnnenum *venum;
75 int *variants;
76 };
77
78 struct rnnvarinfo {
79 char *prefixstr;
80 char *varsetstr;
81 char *variantsstr;
82 int dead;
83 struct rnnenum *prefenum;
84 char *prefix;
85 struct rnnvarset **varsets;
86 int varsetsnum;
87 int varsetsmax;
88 };
89
90 struct rnnenum {
91 char *name;
92 int bare;
93 int isinline;
94 struct rnnvarinfo varinfo;
95 struct rnnvalue **vals;
96 int valsnum;
97 int valsmax;
98 char *fullname;
99 int prepared;
100 char *file;
101 };
102
103 struct rnnvalue {
104 char *name;
105 int valvalid;
106 uint64_t value;
107 struct rnnvarinfo varinfo;
108 char *fullname;
109 char *file;
110 };
111
112 struct rnntypeinfo {
113 char *name;
114 enum rnnttype {
115 RNN_TTYPE_INVALID,
116 RNN_TTYPE_INLINE_ENUM,
117 RNN_TTYPE_INLINE_BITSET,
118 RNN_TTYPE_ENUM,
119 RNN_TTYPE_BITSET,
120 RNN_TTYPE_SPECTYPE,
121 RNN_TTYPE_HEX,
122 RNN_TTYPE_INT,
123 RNN_TTYPE_UINT,
124 RNN_TTYPE_FLOAT,
125 RNN_TTYPE_BOOLEAN,
126 RNN_TTYPE_FIXED,
127 RNN_TTYPE_UFIXED,
128 RNN_TTYPE_A3XX_REGID,
129 } type;
130 struct rnnenum *eenum;
131 struct rnnbitset *ebitset;
132 struct rnnspectype *spectype;
133 struct rnnbitfield **bitfields;
134 int bitfieldsnum;
135 int bitfieldsmax;
136 struct rnnvalue **vals;
137 int valsnum;
138 int valsmax;
139 int shr, low, high;
140 uint64_t min, max, align, radix;
141 int addvariant;
142 int minvalid, maxvalid, alignvalid, radixvalid;
143 };
144
typeinfo_mask(struct rnntypeinfo * ti)145 static inline uint64_t typeinfo_mask(struct rnntypeinfo *ti)
146 {
147 if (ti->high == 63)
148 return -(1ULL << ti->low);
149 else
150 return (1ULL << (ti->high + 1)) - (1ULL << ti->low);
151 }
152
153 struct rnnbitset {
154 char *name;
155 int bare;
156 int isinline;
157 struct rnnvarinfo varinfo;
158 struct rnnbitfield **bitfields;
159 int bitfieldsnum;
160 int bitfieldsmax;
161 char *fullname;
162 char *file;
163 };
164
165 struct rnnbitfield {
166 char *name;
167 struct rnnvarinfo varinfo;
168 struct rnntypeinfo typeinfo;
169 char *fullname;
170 char *file;
171 };
172
173 struct rnndomain {
174 char *name;
175 int bare;
176 int width;
177 uint64_t size;
178 int sizevalid;
179 struct rnnvarinfo varinfo;
180 struct rnndelem **subelems;
181 int subelemsnum;
182 int subelemsmax;
183 char *fullname;
184 char *file;
185 };
186
187 struct rnngroup {
188 char *name;
189 struct rnndelem **subelems;
190 int subelemsnum;
191 int subelemsmax;
192 };
193
194 struct rnndelem {
195 enum rnnetype {
196 RNN_ETYPE_REG,
197 RNN_ETYPE_ARRAY,
198 RNN_ETYPE_STRIPE,
199 RNN_ETYPE_USE_GROUP,
200 } type;
201 char *name;
202 int width;
203 enum rnnaccess {
204 RNN_ACCESS_R,
205 RNN_ACCESS_W,
206 RNN_ACCESS_RW,
207 } access;
208 uint64_t offset;
209 uint64_t *offsets; /* for "array" with irregular offsets */
210 int offsetsnum;
211 int offsetsmax;
212 char *doffset;
213 char **doffsets;
214 int doffsetsnum;
215 int doffsetsmax;
216 uint64_t length;
217 uint64_t stride;
218 struct rnndelem **subelems;
219 int subelemsnum;
220 int subelemsmax;
221 struct rnnvarinfo varinfo;
222 struct rnntypeinfo typeinfo;
223 struct rnnenum *index; /* for arrays, for symbolic idx values */
224 char *fullname;
225 char *file;
226 };
227
228 struct rnnspectype {
229 char *name;
230 struct rnntypeinfo typeinfo;
231 char *file;
232 };
233
234 void rnn_init(void);
235 struct rnndb *rnn_newdb(void);
236 void rnn_parsefile (struct rnndb *db, char *file);
237 void rnn_prepdb (struct rnndb *db);
238 struct rnnenum *rnn_findenum (struct rnndb *db, const char *name);
239 struct rnnbitset *rnn_findbitset (struct rnndb *db, const char *name);
240 struct rnndomain *rnn_finddomain (struct rnndb *db, const char *name);
241 struct rnnspectype *rnn_findspectype (struct rnndb *db, const char *name);
242
243 #endif
244