xref: /aosp_15_r20/external/mesa3d/src/freedreno/rnn/rnn.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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