2 * Copyright 2011 Leiden University. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following
13 * disclaimer in the documentation and/or other materials provided
14 * with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY LEIDEN UNIVERSITY ''AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LEIDEN UNIVERSITY OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 * The views and conclusions contained in the software and documentation
29 * are those of the authors and should not be interpreted as
30 * representing official policies, either expressed or implied, of
38 #include "scop_yaml.h"
40 static char *extract_string(isl_ctx
*ctx
, yaml_document_t
*document
,
43 if (node
->type
!= YAML_SCALAR_NODE
)
44 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
47 return strdup((char *) node
->data
.scalar
.value
);
50 static int extract_int(isl_ctx
*ctx
, yaml_document_t
*document
,
53 if (node
->type
!= YAML_SCALAR_NODE
)
54 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
57 return atoi((char *) node
->data
.scalar
.value
);
60 static double extract_double(isl_ctx
*ctx
, yaml_document_t
*document
,
63 if (node
->type
!= YAML_SCALAR_NODE
)
64 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
67 return strtod((char *) node
->data
.scalar
.value
, NULL
);
70 static enum pet_expr_type
extract_expr_type(isl_ctx
*ctx
,
71 yaml_document_t
*document
, yaml_node_t
*node
)
73 if (node
->type
!= YAML_SCALAR_NODE
)
74 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
77 return pet_str_type((char *) node
->data
.scalar
.value
);
80 static enum pet_op_type
extract_op(isl_ctx
*ctx
, yaml_document_t
*document
,
83 if (node
->type
!= YAML_SCALAR_NODE
)
84 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
87 return pet_str_op((char *) node
->data
.scalar
.value
);
90 static __isl_give isl_set
*extract_set(isl_ctx
*ctx
, yaml_document_t
*document
,
93 if (node
->type
!= YAML_SCALAR_NODE
)
94 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
97 return isl_set_read_from_str(ctx
, (char *) node
->data
.scalar
.value
);
100 static __isl_give isl_id
*extract_id(isl_ctx
*ctx
, yaml_document_t
*document
,
103 if (node
->type
!= YAML_SCALAR_NODE
)
104 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
107 return isl_id_alloc(ctx
, (char *) node
->data
.scalar
.value
, NULL
);
110 static __isl_give isl_map
*extract_map(isl_ctx
*ctx
, yaml_document_t
*document
,
113 if (node
->type
!= YAML_SCALAR_NODE
)
114 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
117 return isl_map_read_from_str(ctx
, (char *) node
->data
.scalar
.value
);
120 /* Extract an isl_multi_pw_aff from "node".
122 static __isl_give isl_multi_pw_aff
*extract_multi_pw_aff(isl_ctx
*ctx
,
123 yaml_document_t
*document
, yaml_node_t
*node
)
125 if (node
->type
!= YAML_SCALAR_NODE
)
126 isl_die(ctx
, isl_error_invalid
, "expecting scalar node",
129 return isl_multi_pw_aff_read_from_str(ctx
,
130 (char *) node
->data
.scalar
.value
);
133 /* Extract a pet_type from "node".
135 static struct pet_type
*extract_type(isl_ctx
*ctx
,
136 yaml_document_t
*document
, yaml_node_t
*node
)
138 struct pet_type
*type
;
139 yaml_node_pair_t
* pair
;
141 if (node
->type
!= YAML_MAPPING_NODE
)
142 isl_die(ctx
, isl_error_invalid
, "expecting mapping",
145 type
= isl_calloc_type(ctx
, struct pet_type
);
149 for (pair
= node
->data
.mapping
.pairs
.start
;
150 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
151 yaml_node_t
*key
, *value
;
153 key
= yaml_document_get_node(document
, pair
->key
);
154 value
= yaml_document_get_node(document
, pair
->value
);
156 if (key
->type
!= YAML_SCALAR_NODE
)
157 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
158 return pet_type_free(type
));
160 if (!strcmp((char *) key
->data
.scalar
.value
, "name"))
161 type
->name
= extract_string(ctx
, document
, value
);
162 if (!strcmp((char *) key
->data
.scalar
.value
, "definition"))
163 type
->definition
= extract_string(ctx
, document
, value
);
169 /* Extract a sequence of types from "node" and store them in scop->types.
171 static struct pet_scop
*extract_types(isl_ctx
*ctx
,
172 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_scop
*scop
)
175 yaml_node_item_t
*item
;
177 if (node
->type
!= YAML_SEQUENCE_NODE
)
178 isl_die(ctx
, isl_error_invalid
, "expecting sequence",
181 scop
->n_type
= node
->data
.sequence
.items
.top
182 - node
->data
.sequence
.items
.start
;
183 scop
->types
= isl_calloc_array(ctx
, struct pet_type
*, scop
->n_type
);
185 return pet_scop_free(scop
);
187 for (item
= node
->data
.sequence
.items
.start
, i
= 0;
188 item
< node
->data
.sequence
.items
.top
; ++item
, ++i
) {
191 n
= yaml_document_get_node(document
, *item
);
192 scop
->types
[i
] = extract_type(ctx
, document
, n
);
194 return pet_scop_free(scop
);
200 static struct pet_array
*extract_array(isl_ctx
*ctx
, yaml_document_t
*document
,
203 struct pet_array
*array
;
204 yaml_node_pair_t
* pair
;
206 if (node
->type
!= YAML_MAPPING_NODE
)
207 isl_die(ctx
, isl_error_invalid
, "expecting mapping",
210 array
= isl_calloc_type(ctx
, struct pet_array
);
214 for (pair
= node
->data
.mapping
.pairs
.start
;
215 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
216 yaml_node_t
*key
, *value
;
218 key
= yaml_document_get_node(document
, pair
->key
);
219 value
= yaml_document_get_node(document
, pair
->value
);
221 if (key
->type
!= YAML_SCALAR_NODE
)
222 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
223 return pet_array_free(array
));
225 if (!strcmp((char *) key
->data
.scalar
.value
, "context"))
226 array
->context
= extract_set(ctx
, document
, value
);
227 if (!strcmp((char *) key
->data
.scalar
.value
, "extent"))
228 array
->extent
= extract_set(ctx
, document
, value
);
229 if (!strcmp((char *) key
->data
.scalar
.value
, "value_bounds"))
230 array
->value_bounds
= extract_set(ctx
, document
, value
);
231 if (!strcmp((char *) key
->data
.scalar
.value
, "element_type"))
232 array
->element_type
=
233 extract_string(ctx
, document
, value
);
234 if (!strcmp((char *) key
->data
.scalar
.value
, "element_size"))
235 array
->element_size
= extract_int(ctx
, document
, value
);
236 if (!strcmp((char *) key
->data
.scalar
.value
,
237 "element_is_record"))
238 array
->element_is_record
=
239 extract_int(ctx
, document
, value
);
240 if (!strcmp((char *) key
->data
.scalar
.value
, "live_out"))
241 array
->live_out
= extract_int(ctx
, document
, value
);
242 if (!strcmp((char *) key
->data
.scalar
.value
,
244 array
->uniquely_defined
=
245 extract_int(ctx
, document
, value
);
246 if (!strcmp((char *) key
->data
.scalar
.value
, "declared"))
247 array
->declared
= extract_int(ctx
, document
, value
);
248 if (!strcmp((char *) key
->data
.scalar
.value
, "exposed"))
249 array
->exposed
= extract_int(ctx
, document
, value
);
255 static struct pet_scop
*extract_arrays(isl_ctx
*ctx
, yaml_document_t
*document
,
256 yaml_node_t
*node
, struct pet_scop
*scop
)
259 yaml_node_item_t
*item
;
261 if (node
->type
!= YAML_SEQUENCE_NODE
)
262 isl_die(ctx
, isl_error_invalid
, "expecting sequence",
265 scop
->n_array
= node
->data
.sequence
.items
.top
266 - node
->data
.sequence
.items
.start
;
267 scop
->arrays
= isl_calloc_array(ctx
, struct pet_array
*, scop
->n_array
);
269 return pet_scop_free(scop
);
271 for (item
= node
->data
.sequence
.items
.start
, i
= 0;
272 item
< node
->data
.sequence
.items
.top
; ++item
, ++i
) {
275 n
= yaml_document_get_node(document
, *item
);
276 scop
->arrays
[i
] = extract_array(ctx
, document
, n
);
277 if (!scop
->arrays
[i
])
278 return pet_scop_free(scop
);
284 static struct pet_expr
*extract_expr(isl_ctx
*ctx
, yaml_document_t
*document
,
287 static struct pet_expr
*extract_arguments(isl_ctx
*ctx
,
288 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_expr
*expr
)
291 yaml_node_item_t
*item
;
293 if (node
->type
!= YAML_SEQUENCE_NODE
)
294 isl_die(ctx
, isl_error_invalid
, "expecting sequence",
295 return pet_expr_free(expr
));
297 expr
->n_arg
= node
->data
.sequence
.items
.top
298 - node
->data
.sequence
.items
.start
;
299 expr
->args
= isl_calloc_array(ctx
, struct pet_expr
*, expr
->n_arg
);
301 return pet_expr_free(expr
);
303 for (item
= node
->data
.sequence
.items
.start
, i
= 0;
304 item
< node
->data
.sequence
.items
.top
; ++item
, ++i
) {
307 n
= yaml_document_get_node(document
, *item
);
308 expr
->args
[i
] = extract_expr(ctx
, document
, n
);
310 return pet_expr_free(expr
);
316 /* Extract pet_expr_double specific fields from "node" and
317 * update "expr" accordingly.
319 static struct pet_expr
*extract_expr_double(isl_ctx
*ctx
,
320 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_expr
*expr
)
322 yaml_node_pair_t
*pair
;
324 for (pair
= node
->data
.mapping
.pairs
.start
;
325 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
326 yaml_node_t
*key
, *value
;
328 key
= yaml_document_get_node(document
, pair
->key
);
329 value
= yaml_document_get_node(document
, pair
->value
);
331 if (key
->type
!= YAML_SCALAR_NODE
)
332 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
333 return pet_expr_free(expr
));
335 if (!strcmp((char *) key
->data
.scalar
.value
, "value"))
336 expr
->d
.val
= extract_double(ctx
, document
, value
);
337 if (!strcmp((char *) key
->data
.scalar
.value
, "string"))
338 expr
->d
.s
= extract_string(ctx
, document
, value
);
344 /* Extract pet_expr_access specific fields from "node" and
345 * update "expr" accordingly.
347 static struct pet_expr
*extract_expr_access(isl_ctx
*ctx
,
348 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_expr
*expr
)
350 yaml_node_pair_t
*pair
;
352 for (pair
= node
->data
.mapping
.pairs
.start
;
353 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
354 yaml_node_t
*key
, *value
;
356 key
= yaml_document_get_node(document
, pair
->key
);
357 value
= yaml_document_get_node(document
, pair
->value
);
359 if (key
->type
!= YAML_SCALAR_NODE
)
360 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
361 return pet_expr_free(expr
));
363 if (!strcmp((char *) key
->data
.scalar
.value
, "relation"))
364 expr
->acc
.access
= extract_map(ctx
, document
, value
);
365 if (!strcmp((char *) key
->data
.scalar
.value
, "index"))
366 expr
->acc
.index
= extract_multi_pw_aff(ctx
, document
,
368 if (!strcmp((char *) key
->data
.scalar
.value
, "reference"))
369 expr
->acc
.ref_id
= extract_id(ctx
, document
, value
);
370 if (!strcmp((char *) key
->data
.scalar
.value
, "read"))
371 expr
->acc
.read
= extract_int(ctx
, document
, value
);
372 if (!strcmp((char *) key
->data
.scalar
.value
, "write"))
373 expr
->acc
.write
= extract_int(ctx
, document
, value
);
379 /* Extract operation expression specific fields from "node" and
380 * update "expr" accordingly.
382 static struct pet_expr
*extract_expr_op(isl_ctx
*ctx
,
383 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_expr
*expr
)
385 yaml_node_pair_t
*pair
;
387 for (pair
= node
->data
.mapping
.pairs
.start
;
388 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
389 yaml_node_t
*key
, *value
;
391 key
= yaml_document_get_node(document
, pair
->key
);
392 value
= yaml_document_get_node(document
, pair
->value
);
394 if (key
->type
!= YAML_SCALAR_NODE
)
395 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
396 return pet_expr_free(expr
));
398 if (!strcmp((char *) key
->data
.scalar
.value
, "operation"))
399 expr
->op
= extract_op(ctx
, document
, value
);
405 /* Extract pet_expr_call specific fields from "node" and
406 * update "expr" accordingly.
408 static struct pet_expr
*extract_expr_call(isl_ctx
*ctx
,
409 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_expr
*expr
)
411 yaml_node_pair_t
*pair
;
413 for (pair
= node
->data
.mapping
.pairs
.start
;
414 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
415 yaml_node_t
*key
, *value
;
417 key
= yaml_document_get_node(document
, pair
->key
);
418 value
= yaml_document_get_node(document
, pair
->value
);
420 if (key
->type
!= YAML_SCALAR_NODE
)
421 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
422 return pet_expr_free(expr
));
424 if (!strcmp((char *) key
->data
.scalar
.value
, "name"))
425 expr
->name
= extract_string(ctx
, document
, value
);
431 /* Extract pet_expr_cast specific fields from "node" and
432 * update "expr" accordingly.
434 static struct pet_expr
*extract_expr_cast(isl_ctx
*ctx
,
435 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_expr
*expr
)
437 yaml_node_pair_t
*pair
;
439 for (pair
= node
->data
.mapping
.pairs
.start
;
440 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
441 yaml_node_t
*key
, *value
;
443 key
= yaml_document_get_node(document
, pair
->key
);
444 value
= yaml_document_get_node(document
, pair
->value
);
446 if (key
->type
!= YAML_SCALAR_NODE
)
447 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
448 return pet_expr_free(expr
));
450 if (!strcmp((char *) key
->data
.scalar
.value
, "type_name"))
451 expr
->type_name
= extract_string(ctx
, document
, value
);
457 /* Extract a pet_expr from "node".
459 * We first extract the type and arguments of the expression and
460 * then extract additional fields depending on the type.
462 static struct pet_expr
*extract_expr(isl_ctx
*ctx
, yaml_document_t
*document
,
465 struct pet_expr
*expr
;
466 yaml_node_pair_t
*pair
;
468 if (node
->type
!= YAML_MAPPING_NODE
)
469 isl_die(ctx
, isl_error_invalid
, "expecting mapping",
472 expr
= isl_calloc_type(ctx
, struct pet_expr
);
476 for (pair
= node
->data
.mapping
.pairs
.start
;
477 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
478 yaml_node_t
*key
, *value
;
480 key
= yaml_document_get_node(document
, pair
->key
);
481 value
= yaml_document_get_node(document
, pair
->value
);
483 if (key
->type
!= YAML_SCALAR_NODE
)
484 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
485 return pet_expr_free(expr
));
487 if (!strcmp((char *) key
->data
.scalar
.value
, "type"))
488 expr
->type
= extract_expr_type(ctx
, document
, value
);
490 if (!strcmp((char *) key
->data
.scalar
.value
, "arguments"))
491 expr
= extract_arguments(ctx
, document
, value
, expr
);
496 switch (expr
->type
) {
497 case pet_expr_access
:
498 expr
= extract_expr_access(ctx
, document
, node
, expr
);
500 case pet_expr_double
:
501 expr
= extract_expr_double(ctx
, document
, node
, expr
);
504 expr
= extract_expr_call(ctx
, document
, node
, expr
);
507 expr
= extract_expr_cast(ctx
, document
, node
, expr
);
510 case pet_expr_binary
:
511 case pet_expr_ternary
:
512 expr
= extract_expr_op(ctx
, document
, node
, expr
);
519 static struct pet_stmt
*extract_stmt_arguments(isl_ctx
*ctx
,
520 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_stmt
*stmt
)
523 yaml_node_item_t
*item
;
525 if (node
->type
!= YAML_SEQUENCE_NODE
)
526 isl_die(ctx
, isl_error_invalid
, "expecting sequence",
527 return pet_stmt_free(stmt
));
529 stmt
->n_arg
= node
->data
.sequence
.items
.top
530 - node
->data
.sequence
.items
.start
;
531 stmt
->args
= isl_calloc_array(ctx
, struct pet_expr
*, stmt
->n_arg
);
533 return pet_stmt_free(stmt
);
535 for (item
= node
->data
.sequence
.items
.start
, i
= 0;
536 item
< node
->data
.sequence
.items
.top
; ++item
, ++i
) {
539 n
= yaml_document_get_node(document
, *item
);
540 stmt
->args
[i
] = extract_expr(ctx
, document
, n
);
542 return pet_stmt_free(stmt
);
548 static struct pet_stmt
*extract_stmt(isl_ctx
*ctx
, yaml_document_t
*document
,
551 struct pet_stmt
*stmt
;
552 yaml_node_pair_t
* pair
;
554 if (node
->type
!= YAML_MAPPING_NODE
)
555 isl_die(ctx
, isl_error_invalid
, "expecting mapping",
558 stmt
= isl_calloc_type(ctx
, struct pet_stmt
);
562 for (pair
= node
->data
.mapping
.pairs
.start
;
563 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
564 yaml_node_t
*key
, *value
;
566 key
= yaml_document_get_node(document
, pair
->key
);
567 value
= yaml_document_get_node(document
, pair
->value
);
569 if (key
->type
!= YAML_SCALAR_NODE
)
570 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
571 return pet_stmt_free(stmt
));
573 if (!strcmp((char *) key
->data
.scalar
.value
, "line"))
574 stmt
->line
= extract_int(ctx
, document
, value
);
575 if (!strcmp((char *) key
->data
.scalar
.value
, "domain"))
576 stmt
->domain
= extract_set(ctx
, document
, value
);
577 if (!strcmp((char *) key
->data
.scalar
.value
, "schedule"))
578 stmt
->schedule
= extract_map(ctx
, document
, value
);
579 if (!strcmp((char *) key
->data
.scalar
.value
, "body"))
580 stmt
->body
= extract_expr(ctx
, document
, value
);
582 if (!strcmp((char *) key
->data
.scalar
.value
, "arguments"))
583 stmt
= extract_stmt_arguments(ctx
, document
,
592 static struct pet_scop
*extract_statements(isl_ctx
*ctx
,
593 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_scop
*scop
)
596 yaml_node_item_t
*item
;
598 if (node
->type
!= YAML_SEQUENCE_NODE
)
599 isl_die(ctx
, isl_error_invalid
, "expecting sequence",
602 scop
->n_stmt
= node
->data
.sequence
.items
.top
603 - node
->data
.sequence
.items
.start
;
604 scop
->stmts
= isl_calloc_array(ctx
, struct pet_stmt
*, scop
->n_stmt
);
606 return pet_scop_free(scop
);
608 for (item
= node
->data
.sequence
.items
.start
, i
= 0;
609 item
< node
->data
.sequence
.items
.top
; ++item
, ++i
) {
612 n
= yaml_document_get_node(document
, *item
);
613 scop
->stmts
[i
] = extract_stmt(ctx
, document
, n
);
615 return pet_scop_free(scop
);
621 /* Extract a pet_implication from "node".
623 static struct pet_implication
*extract_implication(isl_ctx
*ctx
,
624 yaml_document_t
*document
, yaml_node_t
*node
)
626 struct pet_implication
*implication
;
627 yaml_node_pair_t
* pair
;
629 if (node
->type
!= YAML_MAPPING_NODE
)
630 isl_die(ctx
, isl_error_invalid
, "expecting mapping",
633 implication
= isl_calloc_type(ctx
, struct pet_implication
);
637 for (pair
= node
->data
.mapping
.pairs
.start
;
638 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
639 yaml_node_t
*key
, *value
;
641 key
= yaml_document_get_node(document
, pair
->key
);
642 value
= yaml_document_get_node(document
, pair
->value
);
644 if (key
->type
!= YAML_SCALAR_NODE
)
645 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
646 return pet_implication_free(implication
));
648 if (!strcmp((char *) key
->data
.scalar
.value
, "satisfied"))
649 implication
->satisfied
=
650 extract_int(ctx
, document
, value
);
651 if (!strcmp((char *) key
->data
.scalar
.value
, "extension"))
652 implication
->extension
=
653 extract_map(ctx
, document
, value
);
659 /* Extract a sequence of implications from "node" and
660 * store them in scop->implications.
662 static struct pet_scop
*extract_implications(isl_ctx
*ctx
,
663 yaml_document_t
*document
, yaml_node_t
*node
, struct pet_scop
*scop
)
666 yaml_node_item_t
*item
;
668 if (node
->type
!= YAML_SEQUENCE_NODE
)
669 isl_die(ctx
, isl_error_invalid
, "expecting sequence",
672 scop
->n_implication
= node
->data
.sequence
.items
.top
673 - node
->data
.sequence
.items
.start
;
674 scop
->implications
= isl_calloc_array(ctx
, struct pet_implication
*,
675 scop
->n_implication
);
676 if (!scop
->implications
)
677 return pet_scop_free(scop
);
679 for (item
= node
->data
.sequence
.items
.start
, i
= 0;
680 item
< node
->data
.sequence
.items
.top
; ++item
, ++i
) {
683 n
= yaml_document_get_node(document
, *item
);
684 scop
->implications
[i
] = extract_implication(ctx
, document
, n
);
685 if (!scop
->implications
[i
])
686 return pet_scop_free(scop
);
692 static struct pet_scop
*extract_scop(isl_ctx
*ctx
, yaml_document_t
*document
,
695 struct pet_scop
*scop
;
696 yaml_node_pair_t
* pair
;
701 if (node
->type
!= YAML_MAPPING_NODE
)
702 isl_die(ctx
, isl_error_invalid
, "expecting mapping",
705 scop
= pet_scop_alloc(ctx
);
709 for (pair
= node
->data
.mapping
.pairs
.start
;
710 pair
< node
->data
.mapping
.pairs
.top
; ++pair
) {
711 yaml_node_t
*key
, *value
;
713 key
= yaml_document_get_node(document
, pair
->key
);
714 value
= yaml_document_get_node(document
, pair
->value
);
716 if (key
->type
!= YAML_SCALAR_NODE
)
717 isl_die(ctx
, isl_error_invalid
, "expecting scalar key",
718 return pet_scop_free(scop
));
719 if (!strcmp((char *) key
->data
.scalar
.value
, "context"))
720 scop
->context
= extract_set(ctx
, document
, value
);
721 if (!strcmp((char *) key
->data
.scalar
.value
, "context_value"))
722 scop
->context_value
= extract_set(ctx
, document
, value
);
723 if (!strcmp((char *) key
->data
.scalar
.value
, "types"))
724 scop
= extract_types(ctx
, document
, value
, scop
);
725 if (!strcmp((char *) key
->data
.scalar
.value
, "arrays"))
726 scop
= extract_arrays(ctx
, document
, value
, scop
);
727 if (!strcmp((char *) key
->data
.scalar
.value
, "statements"))
728 scop
= extract_statements(ctx
, document
, value
, scop
);
729 if (!strcmp((char *) key
->data
.scalar
.value
, "implications"))
730 scop
= extract_implications(ctx
, document
, value
, scop
);
735 if (!scop
->context_value
) {
736 isl_space
*space
= isl_space_params_alloc(ctx
, 0);
737 scop
->context_value
= isl_set_universe(space
);
738 if (!scop
->context_value
)
739 return pet_scop_free(scop
);
745 /* Extract a pet_scop from the YAML description in "in".
747 struct pet_scop
*pet_scop_parse(isl_ctx
*ctx
, FILE *in
)
749 struct pet_scop
*scop
= NULL
;
750 yaml_parser_t parser
;
752 yaml_document_t document
= { 0 };
754 yaml_parser_initialize(&parser
);
756 yaml_parser_set_input_file(&parser
, in
);
758 if (!yaml_parser_load(&parser
, &document
))
761 root
= yaml_document_get_root_node(&document
);
763 scop
= extract_scop(ctx
, &document
, root
);
765 yaml_document_delete(&document
);
767 yaml_parser_delete(&parser
);
771 yaml_parser_delete(&parser
);