1 /*
2 * Copyright © 2010 Marcin Kościelnicki <[email protected]>
3 * Copyright © 2010 Luca Barbieri <[email protected]>
4 * All Rights Reserved.
5 * SPDX-License-Identifier: MIT
6 */
7
8 #ifndef RNN_H
9 #define RNN_H
10
11 #include <stdint.h>
12 #include <stdlib.h>
13
14 struct rnnauthor {
15 char* name;
16 char* email;
17 char* contributions;
18 char* license;
19 char** nicknames;
20 int nicknamesnum;
21 int nicknamesmax;
22 };
23
24 struct rnncopyright {
25 unsigned firstyear;
26 char* license;
27 struct rnnauthor **authors;
28 int authorsnum;
29 int authorsmax;
30 };
31
32 struct rnndb {
33 struct rnncopyright copyright;
34 struct rnnenum **enums;
35 int enumsnum;
36 int enumsmax;
37 struct rnnbitset **bitsets;
38 int bitsetsnum;
39 int bitsetsmax;
40 struct rnndomain **domains;
41 int domainsnum;
42 int domainsmax;
43 struct rnngroup **groups;
44 int groupsnum;
45 int groupsmax;
46 struct rnnspectype **spectypes;
47 int spectypesnum;
48 int spectypesmax;
49 char **files;
50 int filesnum;
51 int filesmax;
52 int estatus;
53 };
54
55 struct rnnvarset {
56 struct rnnenum *venum;
57 int *variants;
58 };
59
60 struct rnnvarinfo {
61 char *prefixstr;
62 char *varsetstr;
63 char *variantsstr;
64 int dead;
65 struct rnnenum *prefenum;
66 char *prefix;
67 struct rnnvarset **varsets;
68 int varsetsnum;
69 int varsetsmax;
70 };
71
72 struct rnnenum {
73 char *name;
74 int bare;
75 int isinline;
76 struct rnnvarinfo varinfo;
77 struct rnnvalue **vals;
78 int valsnum;
79 int valsmax;
80 char *fullname;
81 int prepared;
82 char *file;
83 };
84
85 struct rnnvalue {
86 char *name;
87 int valvalid;
88 uint64_t value;
89 struct rnnvarinfo varinfo;
90 char *fullname;
91 char *file;
92 };
93
94 struct rnntypeinfo {
95 char *name;
96 enum rnnttype {
97 RNN_TTYPE_INVALID,
98 RNN_TTYPE_INLINE_ENUM,
99 RNN_TTYPE_INLINE_BITSET,
100 RNN_TTYPE_ENUM,
101 RNN_TTYPE_BITSET,
102 RNN_TTYPE_SPECTYPE,
103 RNN_TTYPE_HEX,
104 RNN_TTYPE_INT,
105 RNN_TTYPE_UINT,
106 RNN_TTYPE_FLOAT,
107 RNN_TTYPE_BOOLEAN,
108 RNN_TTYPE_FIXED,
109 RNN_TTYPE_UFIXED,
110 RNN_TTYPE_A3XX_REGID,
111 } type;
112 struct rnnenum *eenum;
113 struct rnnbitset *ebitset;
114 struct rnnspectype *spectype;
115 struct rnnbitfield **bitfields;
116 int bitfieldsnum;
117 int bitfieldsmax;
118 struct rnnvalue **vals;
119 int valsnum;
120 int valsmax;
121 int shr, low, high;
122 uint64_t min, max, align, radix;
123 int addvariant;
124 int minvalid, maxvalid, alignvalid, radixvalid;
125 };
126
typeinfo_mask(struct rnntypeinfo * ti)127 static inline uint64_t typeinfo_mask(struct rnntypeinfo *ti)
128 {
129 if (ti->high == 63)
130 return -(1ULL << ti->low);
131 else
132 return (1ULL << (ti->high + 1)) - (1ULL << ti->low);
133 }
134
135 struct rnnbitset {
136 char *name;
137 int bare;
138 int isinline;
139 struct rnnvarinfo varinfo;
140 struct rnnbitfield **bitfields;
141 int bitfieldsnum;
142 int bitfieldsmax;
143 char *fullname;
144 char *file;
145 };
146
147 struct rnnbitfield {
148 char *name;
149 struct rnnvarinfo varinfo;
150 struct rnntypeinfo typeinfo;
151 char *fullname;
152 char *file;
153 };
154
155 struct rnndomain {
156 char *name;
157 int bare;
158 int width;
159 uint64_t size;
160 int sizevalid;
161 struct rnnvarinfo varinfo;
162 struct rnndelem **subelems;
163 int subelemsnum;
164 int subelemsmax;
165 char *fullname;
166 char *file;
167 };
168
169 struct rnngroup {
170 char *name;
171 struct rnndelem **subelems;
172 int subelemsnum;
173 int subelemsmax;
174 };
175
176 struct rnndelem {
177 enum rnnetype {
178 RNN_ETYPE_REG,
179 RNN_ETYPE_ARRAY,
180 RNN_ETYPE_STRIPE,
181 RNN_ETYPE_USE_GROUP,
182 } type;
183 char *name;
184 int width;
185 enum rnnaccess {
186 RNN_ACCESS_R,
187 RNN_ACCESS_W,
188 RNN_ACCESS_RW,
189 } access;
190 uint64_t offset;
191 uint64_t *offsets; /* for "array" with irregular offsets */
192 int offsetsnum;
193 int offsetsmax;
194 char *doffset;
195 char **doffsets;
196 int doffsetsnum;
197 int doffsetsmax;
198 uint64_t length;
199 uint64_t stride;
200 struct rnndelem **subelems;
201 int subelemsnum;
202 int subelemsmax;
203 struct rnnvarinfo varinfo;
204 struct rnntypeinfo typeinfo;
205 struct rnnenum *index; /* for arrays, for symbolic idx values */
206 char *fullname;
207 char *file;
208 };
209
210 struct rnnspectype {
211 char *name;
212 struct rnntypeinfo typeinfo;
213 char *file;
214 };
215
216 void rnn_init(void);
217 struct rnndb *rnn_newdb(void);
218 void rnn_parsefile (struct rnndb *db, char *file);
219 void rnn_prepdb (struct rnndb *db);
220 struct rnnenum *rnn_findenum (struct rnndb *db, const char *name);
221 struct rnnbitset *rnn_findbitset (struct rnndb *db, const char *name);
222 struct rnndomain *rnn_finddomain (struct rnndb *db, const char *name);
223 struct rnnspectype *rnn_findspectype (struct rnndb *db, const char *name);
224
225 #endif
226