Date: | 2010-04-20 23:01:16 (13 years 11 months ago) |
---|---|
Author: | werner |
Commit: | 59335b63b0bfc2e874d64fdd661d501124b9c2bd |
Message: | The partial order algorithm in dump.c sometimes dumped objects
before a vector they referenced. As a band-aid, we now explicitly
keep track of which vectors have been dumped, and defer objects
accordingly. A more correct solution would be to properly abstract
the partial order algorithms (along with the heuristics for
maximizing the number of ".") and to implement it properly. - fpd.y (debug_item): new rule for %dump and %exit, which can appear also among measurements - fpd.y (frame_items, measurements): rearranged grammar to allow debug_item also in measurements. To avoid ambiguities, the "measurements" section can no longer be empty, but it can be omitted as a whole. - obj.h, dump.c (later, recurse_vec, order_frame): vectors now also have a "dumped" flag which is used in "later" to defer dumping an object until all the vectors it depends on have been dumped. git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5928 99fdad57-331a-0410-800a-d7fa5415bdb3 |
Files: |
dump.c (5 diffs) fpd.y (3 diffs) obj.h (1 diff) |
Change Details
dump.c | ||
---|---|---|
75 | 75 | |
76 | 76 | static int later(const struct vec *base, const struct vec *prev) |
77 | 77 | { |
78 | return base && !base->dumped; | |
79 | #if 0 | |
78 | 80 | while (1) { |
79 | 81 | prev = prev->next; |
80 | 82 | if (!prev) |
... | ... | |
83 | 85 | return 1; |
84 | 86 | } |
85 | 87 | return 0; |
88 | #endif | |
86 | 89 | } |
87 | 90 | |
88 | 91 | |
... | ... | |
134 | 137 | } |
135 | 138 | |
136 | 139 | /* |
137 | * Tricky logic ahead: when dumping a vector, we search for a vectors that | |
140 | * Tricky logic ahead: when dumping a vector, we search for a vector that | |
138 | 141 | * depends on that vector for ".". If we find one, we dump it immediately after |
139 | 142 | * this vector. |
140 | 143 | */ |
... | ... | |
144 | 147 | struct vec *next; |
145 | 148 | struct obj *obj; |
146 | 149 | |
150 | vec->dumped = 1; | |
147 | 151 | add_item(curr, vec, NULL); |
148 | 152 | for (obj = vec->frame->objs; obj; obj = obj->next) |
149 | 153 | if (may_put_obj_now(obj, vec)) |
... | ... | |
178 | 182 | if (obj->type != ot_meas) |
179 | 183 | n++; |
180 | 184 | |
185 | for (vec = frame->vecs; vec; vec = vec->next) | |
186 | vec->dumped = 0; | |
181 | 187 | for (obj = frame->objs; obj; obj = obj->next) |
182 | 188 | obj->dumped = 0; |
183 | 189 |
fpd.y | ||
---|---|---|
404 | 404 | ; |
405 | 405 | |
406 | 406 | frame_items: |
407 | measurements | |
407 | | measurements | |
408 | 408 | | frame_item frame_items |
409 | 409 | ; |
410 | 410 | |
... | ... | |
459 | 459 | if (!dbg_print($2)) |
460 | 460 | YYABORT; |
461 | 461 | } |
462 | | TOK_DBG_DUMP | |
462 | | debug_item | |
463 | ; | |
464 | ||
465 | debug_item: | |
466 | TOK_DBG_DUMP | |
463 | 467 | { |
464 | 468 | /* |
465 | 469 | * It's okay to do append the root frame multiple |
... | ... | |
718 | 722 | ; |
719 | 723 | |
720 | 724 | measurements: |
725 | meas | |
726 | { | |
727 | *next_obj = $1; | |
728 | next_obj = &$1->next; | |
729 | } | |
721 | 730 | | measurements meas |
722 | 731 | { |
723 | 732 | *next_obj = $2; |
724 | 733 | next_obj = &$2->next; |
725 | 734 | } |
735 | | measurements debug_item | |
726 | 736 | ; |
727 | 737 | |
728 | 738 | meas: |
obj.h | ||
---|---|---|
142 | 142 | /* for re-ordering after a move */ |
143 | 143 | int mark; |
144 | 144 | |
145 | /* for dumping */ | |
146 | int dumped; | |
147 | ||
145 | 148 | /* for the GUI */ |
146 | 149 | GtkWidget *list_widget; /* NULL if items aren't shown */ |
147 | 150 | }; |
Branches:
master