Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_IParser_Exe.H
Go to the documentation of this file.
1#ifndef AMREX_IPARSER_EXE_H_
2#define AMREX_IPARSER_EXE_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_IParser_Y.H>
6#include <AMReX_Stack.H>
7#include <AMReX_Vector.H>
8
9#include <limits>
10
11#ifndef AMREX_IPARSER_STACK_SIZE
12#define AMREX_IPARSER_STACK_SIZE 16
13#endif
14
15#define AMREX_IPARSER_LOCAL_IDX0 1000
16#define AMREX_IPARSER_GET_DATA(i) ((i)>=1000) ? pstack[(i)-1000] : x[i]
17
18namespace amrex {
19
20// N: node
21// P: pointer offset
22// V: value (i.e., int literal)
23
59
60struct alignas(8) IParserExeNull {
62};
63
64struct alignas(8) IParserExeNumber {
66 long long v;
67};
68
69struct alignas(8) IParserExeSymbol {
71 int i;
72};
73
74struct alignas(8) IParserExeADD {
76};
77
78struct alignas(8) IParserExeSUB {
80 long long sign;
81};
82
83struct alignas(8) IParserExeMUL {
85};
86
87struct alignas(8) IParserExeDIV_F {
89};
90
91struct alignas(8) IParserExeDIV_B {
93};
94
95struct alignas(8) IParserExeNEG {
97};
98
103
108
113
114struct alignas(8) IParserExeADD_VP {
116 int i;
117 long long v;
118};
119
120struct alignas(8) IParserExeSUB_VP {
122 int i;
123 long long v;
124};
125
126struct alignas(8) IParserExeMUL_VP {
128 int i;
129 long long v;
130};
131
132struct alignas(8) IParserExeDIV_VP {
134 int i;
135 long long v;
136};
137
138struct alignas(8) IParserExeDIV_PV {
140 int i;
141 long long v;
142};
143
144struct alignas(8) IParserExeADD_PP {
146 int i1;
147 int i2;
148};
149
150struct alignas(8) IParserExeSUB_PP {
152 int i1;
153 int i2;
154};
155
156struct alignas(8) IParserExeMUL_PP {
158 int i1;
159 int i2;
160};
161
162struct alignas(8) IParserExeDIV_PP {
164 int i1;
165 int i2;
166};
167
168struct alignas(8) IParserExeNEG_P {
170 int i;
171};
172
173struct alignas(8) IParserExeADD_VN {
175 long long v;
176};
177
178struct alignas(8) IParserExeSUB_VN {
180 long long v;
181};
182
183struct alignas(8) IParserExeMUL_VN {
185 long long v;
186};
187
188struct alignas(8) IParserExeDIV_VN {
190 long long v;
191};
192
193struct alignas(8) IParserExeDIV_NV {
195 long long v;
196};
197
198struct alignas(8) IParserExeADD_PN {
200 int i;
201};
202
203struct alignas(8) IParserExeSUB_PN {
205 int i;
206 long long sign;
207};
208
209struct alignas(8) IParserExeMUL_PN {
211 int i;
212};
213
214struct alignas(8) IParserExeDIV_PN {
216 int i;
218};
219
220struct alignas(8) IParserExeIF {
223};
224
225struct alignas(8) IParserExeJUMP {
228};
229
231long long iparser_exe_eval (const char* p, long long const* x)
232{
233 if (p == nullptr) { return std::numeric_limits<long long>::max(); }
234
236 while (*((iparser_exe_t*)p) != IPARSER_EXE_NULL) {
237 switch (*((iparser_exe_t*)p))
238 {
240 {
241 pstack.push(((IParserExeNumber*)p)->v);
242 p += sizeof(IParserExeNumber);
243 break;
244 }
246 {
247 int i = ((IParserExeSymbol*)p)->i;
248 auto d = AMREX_IPARSER_GET_DATA(i);
249 pstack.push(d);
250 p += sizeof(IParserExeSymbol);
251 break;
252 }
253 case IPARSER_EXE_ADD:
254 {
255 auto b = pstack.top();
256 pstack.pop();
257 pstack.top() += b;
258 p += sizeof(IParserExeADD);
259 break;
260 }
261 case IPARSER_EXE_SUB:
262 {
263 auto b = pstack.top();
264 pstack.pop();
265 pstack.top() = (pstack.top() - b) * (((IParserExeSUB*)p)->sign);
266 p += sizeof(IParserExeSUB);
267 break;
268 }
269 case IPARSER_EXE_MUL:
270 {
271 auto b = pstack.top();
272 pstack.pop();
273 pstack.top() *= b;
274 p += sizeof(IParserExeMUL);
275 break;
276 }
278 {
279 auto v = pstack.top();
280 pstack.pop();
281 pstack.top() /= v;
282 p += sizeof(IParserExeDIV_F);
283 break;
284 }
286 {
287 auto v = pstack.top();
288 pstack.pop();
289 pstack.top() = v / pstack.top();
290 p += sizeof(IParserExeDIV_B);
291 break;
292 }
293 case IPARSER_EXE_NEG:
294 {
295 pstack.top() = -pstack.top();
296 p += sizeof(IParserExeNEG);
297 break;
298 }
299 case IPARSER_EXE_F1:
300 {
301 pstack.top() = iparser_call_f1(((IParserExeF1*)p)->ftype, pstack.top());
302 p += sizeof(IParserExeF1);
303 break;
304 }
305 case IPARSER_EXE_F2_F:
306 {
307 auto v = pstack.top();
308 pstack.pop();
309 pstack.top() = iparser_call_f2(((IParserExeF2_F*)p)->ftype, pstack.top(), v);
310 p += sizeof(IParserExeF2_F);
311 break;
312 }
313 case IPARSER_EXE_F2_B:
314 {
315 auto v = pstack.top();
316 pstack.pop();
317 pstack.top() = iparser_call_f2(((IParserExeF2_B*)p)->ftype, v, pstack.top());
318 p += sizeof(IParserExeF2_B);
319 break;
320 }
322 {
323 int i = ((IParserExeADD_VP*)p)->i;
324 auto d = AMREX_IPARSER_GET_DATA(i);
325 pstack.push(((IParserExeADD_VP*)p)->v + d);
326 p += sizeof(IParserExeADD_VP);
327 break;
328 }
330 {
331 int i = ((IParserExeSUB_VP*)p)->i;
332 auto d = AMREX_IPARSER_GET_DATA(i);
333 pstack.push(((IParserExeSUB_VP*)p)->v - d);
334 p += sizeof(IParserExeSUB_VP);
335 break;
336 }
338 {
339 int i = ((IParserExeMUL_VP*)p)->i;
340 auto d = AMREX_IPARSER_GET_DATA(i);
341 pstack.push(((IParserExeMUL_VP*)p)->v * d);
342 p += sizeof(IParserExeMUL_VP);
343 break;
344 }
346 {
347 int i = ((IParserExeDIV_VP*)p)->i;
348 auto d = AMREX_IPARSER_GET_DATA(i);
349 pstack.push(((IParserExeDIV_VP*)p)->v / d);
350 p += sizeof(IParserExeDIV_VP);
351 break;
352 }
354 {
355 int i = ((IParserExeDIV_PV*)p)->i;
356 auto d = AMREX_IPARSER_GET_DATA(i);
357 pstack.push(d / ((IParserExeDIV_PV*)p)->v);
358 p += sizeof(IParserExeDIV_PV);
359 break;
360 }
362 {
363 int i = ((IParserExeADD_PP*)p)->i1;
364 auto d1 = AMREX_IPARSER_GET_DATA(i);
365 i = ((IParserExeADD_PP*)p)->i2;
366 auto d2 = AMREX_IPARSER_GET_DATA(i);
367 pstack.push(d1+d2);
368 p += sizeof(IParserExeADD_PP);
369 break;
370 }
372 {
373 int i = ((IParserExeSUB_PP*)p)->i1;
374 auto d1 = AMREX_IPARSER_GET_DATA(i);
375 i = ((IParserExeSUB_PP*)p)->i2;
376 auto d2 = AMREX_IPARSER_GET_DATA(i);
377 pstack.push(d1-d2);
378 p += sizeof(IParserExeSUB_PP);
379 break;
380 }
382 {
383 int i = ((IParserExeMUL_PP*)p)->i1;
384 auto d1 = AMREX_IPARSER_GET_DATA(i);
385 i = ((IParserExeMUL_PP*)p)->i2;
386 auto d2 = AMREX_IPARSER_GET_DATA(i);
387 pstack.push(d1*d2);
388 p += sizeof(IParserExeMUL_PP);
389 break;
390 }
392 {
393 int i = ((IParserExeDIV_PP*)p)->i1;
394 auto d1 = AMREX_IPARSER_GET_DATA(i);
395 i = ((IParserExeDIV_PP*)p)->i2;
396 auto d2 = AMREX_IPARSER_GET_DATA(i);
397 pstack.push(d1/d2);
398 p += sizeof(IParserExeDIV_PP);
399 break;
400 }
402 {
403 int i = ((IParserExeNEG_P*)p)->i;
404 auto d = AMREX_IPARSER_GET_DATA(i);
405 pstack.push(-d);
406 p += sizeof(IParserExeNEG_P);
407 break;
408 }
410 {
411 pstack.top() += ((IParserExeADD_VN*)p)->v;
412 p += sizeof(IParserExeADD_VN);
413 break;
414 }
416 {
417 pstack.top() = ((IParserExeSUB_VN*)p)->v - pstack.top();
418 p += sizeof(IParserExeSUB_VN);
419 break;
420 }
422 {
423 pstack.top() *= ((IParserExeMUL_VN*)p)->v;
424 p += sizeof(IParserExeMUL_VN);
425 break;
426 }
428 {
429 pstack.top() = ((IParserExeDIV_VN*)p)->v / pstack.top();
430 p += sizeof(IParserExeDIV_VN);
431 break;
432 }
434 {
435 pstack.top() /= ((IParserExeDIV_NV*)p)->v;
436 p += sizeof(IParserExeDIV_NV);
437 break;
438 }
440 {
441 int i = ((IParserExeADD_PN*)p)->i;
442 auto d = AMREX_IPARSER_GET_DATA(i);
443 pstack.top() += d;
444 p += sizeof(IParserExeADD_PN);
445 break;
446 }
448 {
449 int i = ((IParserExeSUB_PN*)p)->i;
450 auto d = AMREX_IPARSER_GET_DATA(i);
451 pstack.top() = (d - pstack.top()) * (((IParserExeSUB_PN*)p)->sign);
452 p += sizeof(IParserExeSUB_PN);
453 break;
454 }
456 {
457 int i = ((IParserExeMUL_PN*)p)->i;
458 auto d = AMREX_IPARSER_GET_DATA(i);
459 pstack.top() *= d;
460 p += sizeof(IParserExeMUL_PN);
461 break;
462 }
464 {
465 int i = ((IParserExeDIV_PN*)p)->i;
466 auto d = AMREX_IPARSER_GET_DATA(i);
467 if (((IParserExeDIV_PN*)p)->reverse) {
468 pstack.top() /= d;
469 } else {
470 pstack.top() = d / pstack.top();
471 }
472 p += sizeof(IParserExeDIV_PN);
473 break;
474 }
475 case IPARSER_EXE_IF:
476 {
477 auto cond = pstack.top();
478 pstack.pop();
479 if (cond == 0) { // false branch
480 p += ((IParserExeIF*)p)->offset;
481 }
482 p += sizeof(IParserExeIF);
483 break;
484 }
485 case IPARSER_EXE_JUMP:
486 {
487 int offset = ((IParserExeJUMP*)p)->offset;
488 p += sizeof(IParserExeJUMP) + offset;
489 break;
490 }
491 default:
492 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(false,"parser_exe_eval: unknown node type");
493 }
494 }
495 return pstack.top();
496}
497
498void iparser_compile_exe_size (struct iparser_node* node, char*& p, std::size_t& exe_size,
499 int& max_stack_size, int& stack_size, Vector<char*>& local_variables);
500
501inline std::size_t
502iparser_exe_size (struct amrex_iparser* parser, int& max_stack_size, int& stack_size)
503{
504 char* p = nullptr;
505 std::size_t exe_size = 0;
506 max_stack_size = 0;
507 stack_size = 0;
508 Vector<char*> local_variables;
509 iparser_compile_exe_size(parser->ast, p, exe_size, max_stack_size, stack_size, local_variables);
510 stack_size -= static_cast<int>(local_variables.size())+1;
511 return exe_size+sizeof(IParserExeNull);
512}
513
514inline void
515iparser_compile (struct amrex_iparser* parser, char* p)
516{
517 std::size_t exe_size = 0;
518 int max_stack_size = 0;
519 int stack_size = 0;
520 Vector<char*> local_variables;
521 iparser_compile_exe_size(parser->ast, p, exe_size, max_stack_size, stack_size, local_variables);
522 new(p) IParserExeNull;
523}
524
525}
526
527#endif
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1089
#define AMREX_IPARSER_GET_DATA(i)
Definition AMReX_IParser_Exe.H:16
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:27
Long size() const noexcept
Definition AMReX_Vector.H:50
Definition AMReX_Amr.cpp:49
void iparser_compile(struct amrex_iparser *parser, char *p)
Definition AMReX_IParser_Exe.H:515
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE long long iparser_exe_eval(const char *p, long long const *x)
Definition AMReX_IParser_Exe.H:231
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE long long iparser_call_f1(enum iparser_f1_t, long long a)
Definition AMReX_IParser_Y.H:185
iparser_f1_t
Definition AMReX_IParser_Y.H:22
iparser_exe_t
Definition AMReX_IParser_Exe.H:24
@ IPARSER_EXE_F2_F
Definition AMReX_IParser_Exe.H:35
@ IPARSER_EXE_NEG_P
Definition AMReX_IParser_Exe.H:46
@ IPARSER_EXE_SYMBOL
Definition AMReX_IParser_Exe.H:27
@ IPARSER_EXE_ADD
Definition AMReX_IParser_Exe.H:28
@ IPARSER_EXE_DIV_PP
Definition AMReX_IParser_Exe.H:45
@ IPARSER_EXE_SUB_PP
Definition AMReX_IParser_Exe.H:43
@ IPARSER_EXE_NEG
Definition AMReX_IParser_Exe.H:33
@ IPARSER_EXE_MUL_VP
Definition AMReX_IParser_Exe.H:39
@ IPARSER_EXE_MUL_PN
Definition AMReX_IParser_Exe.H:54
@ IPARSER_EXE_ADD_PP
Definition AMReX_IParser_Exe.H:42
@ IPARSER_EXE_ADD_VP
Definition AMReX_IParser_Exe.H:37
@ IPARSER_EXE_DIV_VN
Definition AMReX_IParser_Exe.H:51
@ IPARSER_EXE_SUB_VP
Definition AMReX_IParser_Exe.H:38
@ IPARSER_EXE_DIV_B
Definition AMReX_IParser_Exe.H:32
@ IPARSER_EXE_DIV_VP
Definition AMReX_IParser_Exe.H:40
@ IPARSER_EXE_MUL_VN
Definition AMReX_IParser_Exe.H:49
@ IPARSER_EXE_NULL
Definition AMReX_IParser_Exe.H:25
@ IPARSER_EXE_MUL_PP
Definition AMReX_IParser_Exe.H:44
@ IPARSER_EXE_DIV_PV
Definition AMReX_IParser_Exe.H:41
@ IPARSER_EXE_MUL
Definition AMReX_IParser_Exe.H:30
@ IPARSER_EXE_SUB_PN
Definition AMReX_IParser_Exe.H:53
@ IPARSER_EXE_SUB
Definition AMReX_IParser_Exe.H:29
@ IPARSER_EXE_SUB_VN
Definition AMReX_IParser_Exe.H:48
@ IPARSER_EXE_IF
Definition AMReX_IParser_Exe.H:56
@ IPARSER_EXE_JUMP
Definition AMReX_IParser_Exe.H:57
@ IPARSER_EXE_F2_B
Definition AMReX_IParser_Exe.H:36
@ IPARSER_EXE_DIV_PN
Definition AMReX_IParser_Exe.H:55
@ IPARSER_EXE_F1
Definition AMReX_IParser_Exe.H:34
@ IPARSER_EXE_ADD_PN
Definition AMReX_IParser_Exe.H:52
@ IPARSER_EXE_DIV_F
Definition AMReX_IParser_Exe.H:31
@ IPARSER_EXE_NUMBER
Definition AMReX_IParser_Exe.H:26
@ IPARSER_EXE_ADD_VN
Definition AMReX_IParser_Exe.H:47
@ IPARSER_EXE_DIV_NV
Definition AMReX_IParser_Exe.H:50
void iparser_compile_exe_size(struct iparser_node *node, char *&p, std::size_t &exe_size, int &max_stack_size, int &stack_size, Vector< char * > &local_variables)
Definition AMReX_IParser_Exe.cpp:19
iparser_f2_t
Definition AMReX_IParser_Y.H:26
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE long long iparser_call_f2(enum iparser_f2_t type, long long a, long long b)
Definition AMReX_IParser_Y.H:192
std::size_t iparser_exe_size(struct amrex_iparser *parser, int &max_stack_size, int &stack_size)
Definition AMReX_IParser_Exe.H:502
Definition AMReX_IParser_Exe.H:198
int i
Definition AMReX_IParser_Exe.H:200
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:199
Definition AMReX_IParser_Exe.H:144
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:145
int i2
Definition AMReX_IParser_Exe.H:147
int i1
Definition AMReX_IParser_Exe.H:146
Definition AMReX_IParser_Exe.H:173
long long v
Definition AMReX_IParser_Exe.H:175
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:174
Definition AMReX_IParser_Exe.H:114
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:115
int i
Definition AMReX_IParser_Exe.H:116
long long v
Definition AMReX_IParser_Exe.H:117
Definition AMReX_IParser_Exe.H:74
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:75
Definition AMReX_IParser_Exe.H:91
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:92
Definition AMReX_IParser_Exe.H:87
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:88
Definition AMReX_IParser_Exe.H:193
long long v
Definition AMReX_IParser_Exe.H:195
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:194
Definition AMReX_IParser_Exe.H:214
int i
Definition AMReX_IParser_Exe.H:216
bool reverse
Definition AMReX_IParser_Exe.H:217
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:215
Definition AMReX_IParser_Exe.H:162
int i1
Definition AMReX_IParser_Exe.H:164
int i2
Definition AMReX_IParser_Exe.H:165
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:163
Definition AMReX_IParser_Exe.H:138
int i
Definition AMReX_IParser_Exe.H:140
long long v
Definition AMReX_IParser_Exe.H:141
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:139
Definition AMReX_IParser_Exe.H:188
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:189
long long v
Definition AMReX_IParser_Exe.H:190
Definition AMReX_IParser_Exe.H:132
int i
Definition AMReX_IParser_Exe.H:134
long long v
Definition AMReX_IParser_Exe.H:135
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:133
Definition AMReX_IParser_Exe.H:99
iparser_f1_t ftype
Definition AMReX_IParser_Exe.H:101
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:100
Definition AMReX_IParser_Exe.H:109
iparser_f2_t ftype
Definition AMReX_IParser_Exe.H:111
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:110
Definition AMReX_IParser_Exe.H:104
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:105
iparser_f2_t ftype
Definition AMReX_IParser_Exe.H:106
Definition AMReX_IParser_Exe.H:220
int offset
Definition AMReX_IParser_Exe.H:222
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:221
Definition AMReX_IParser_Exe.H:225
int offset
Definition AMReX_IParser_Exe.H:227
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:226
Definition AMReX_IParser_Exe.H:209
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:210
int i
Definition AMReX_IParser_Exe.H:211
Definition AMReX_IParser_Exe.H:156
int i1
Definition AMReX_IParser_Exe.H:158
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:157
int i2
Definition AMReX_IParser_Exe.H:159
Definition AMReX_IParser_Exe.H:183
long long v
Definition AMReX_IParser_Exe.H:185
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:184
Definition AMReX_IParser_Exe.H:126
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:127
long long v
Definition AMReX_IParser_Exe.H:129
int i
Definition AMReX_IParser_Exe.H:128
Definition AMReX_IParser_Exe.H:83
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:84
Definition AMReX_IParser_Exe.H:168
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:169
int i
Definition AMReX_IParser_Exe.H:170
Definition AMReX_IParser_Exe.H:95
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:96
Definition AMReX_IParser_Exe.H:60
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:61
Definition AMReX_IParser_Exe.H:64
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:65
long long v
Definition AMReX_IParser_Exe.H:66
Definition AMReX_IParser_Exe.H:203
long long sign
Definition AMReX_IParser_Exe.H:206
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:204
int i
Definition AMReX_IParser_Exe.H:205
Definition AMReX_IParser_Exe.H:150
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:151
int i2
Definition AMReX_IParser_Exe.H:153
int i1
Definition AMReX_IParser_Exe.H:152
Definition AMReX_IParser_Exe.H:178
long long v
Definition AMReX_IParser_Exe.H:180
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:179
Definition AMReX_IParser_Exe.H:120
long long v
Definition AMReX_IParser_Exe.H:123
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:121
int i
Definition AMReX_IParser_Exe.H:122
Definition AMReX_IParser_Exe.H:78
long long sign
Definition AMReX_IParser_Exe.H:80
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:79
Definition AMReX_IParser_Exe.H:69
int i
Definition AMReX_IParser_Exe.H:71
enum iparser_exe_t type
Definition AMReX_IParser_Exe.H:70
Definition AMReX_Stack.H:8
constexpr void push(T v)
Definition AMReX_Stack.H:10
constexpr T const & top() const
Definition AMReX_Stack.H:14
constexpr void pop()
Definition AMReX_Stack.H:11
Definition AMReX_IParser_Y.H:153
struct iparser_node * ast
Definition AMReX_IParser_Y.H:156