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 32struct rnnauthor { 33 char* name; 34 char* email; 35 char* contributions; 36 char* license; 37 char** nicknames; 38 int nicknamesnum; 39 int nicknamesmax; 40}; 41 42struct rnncopyright { 43 unsigned firstyear; 44 char* license; 45 struct rnnauthor **authors; 46 int authorsnum; 47 int authorsmax; 48}; 49 50struct 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 73struct rnnvarset { 74 struct rnnenum *venum; 75 int *variants; 76}; 77 78struct 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 90struct 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 103struct rnnvalue { 104 char *name; 105 int valvalid; 106 uint64_t value; 107 struct rnnvarinfo varinfo; 108 char *fullname; 109 char *file; 110}; 111 112struct 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 145static 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 153struct 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 165struct rnnbitfield { 166 char *name; 167 struct rnnvarinfo varinfo; 168 struct rnntypeinfo typeinfo; 169 char *fullname; 170 char *file; 171}; 172 173struct 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 187struct rnngroup { 188 char *name; 189 struct rnndelem **subelems; 190 int subelemsnum; 191 int subelemsmax; 192}; 193 194struct 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 228struct rnnspectype { 229 char *name; 230 struct rnntypeinfo typeinfo; 231 char *file; 232}; 233 234void rnn_init(void); 235struct rnndb *rnn_newdb(void); 236void rnn_parsefile (struct rnndb *db, char *file); 237void rnn_prepdb (struct rnndb *db); 238struct rnnenum *rnn_findenum (struct rnndb *db, const char *name); 239struct rnnbitset *rnn_findbitset (struct rnndb *db, const char *name); 240struct rnndomain *rnn_finddomain (struct rnndb *db, const char *name); 241struct rnnspectype *rnn_findspectype (struct rnndb *db, const char *name); 242 243#endif 244