mirror of
git://projects.qi-hardware.com/fped.git
synced 2024-11-25 20:09:21 +02:00
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
This commit is contained in:
parent
b7db446cbb
commit
59335b63b0
8
dump.c
8
dump.c
@ -75,6 +75,8 @@ static int need(const struct vec *base, const struct vec *prev)
|
||||
|
||||
static int later(const struct vec *base, const struct vec *prev)
|
||||
{
|
||||
return base && !base->dumped;
|
||||
#if 0
|
||||
while (1) {
|
||||
prev = prev->next;
|
||||
if (!prev)
|
||||
@ -83,6 +85,7 @@ static int later(const struct vec *base, const struct vec *prev)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -134,7 +137,7 @@ static void put_obj(struct order **curr, struct obj *obj,
|
||||
}
|
||||
|
||||
/*
|
||||
* Tricky logic ahead: when dumping a vector, we search for a vectors that
|
||||
* Tricky logic ahead: when dumping a vector, we search for a vector that
|
||||
* depends on that vector for ".". If we find one, we dump it immediately after
|
||||
* this vector.
|
||||
*/
|
||||
@ -144,6 +147,7 @@ static void recurse_vec(struct order **curr, struct vec *vec)
|
||||
struct vec *next;
|
||||
struct obj *obj;
|
||||
|
||||
vec->dumped = 1;
|
||||
add_item(curr, vec, NULL);
|
||||
for (obj = vec->frame->objs; obj; obj = obj->next)
|
||||
if (may_put_obj_now(obj, vec))
|
||||
@ -178,6 +182,8 @@ struct order *order_frame(const struct frame *frame)
|
||||
if (obj->type != ot_meas)
|
||||
n++;
|
||||
|
||||
for (vec = frame->vecs; vec; vec = vec->next)
|
||||
vec->dumped = 0;
|
||||
for (obj = frame->objs; obj; obj = obj->next)
|
||||
obj->dumped = 0;
|
||||
|
||||
|
14
fpd.y
14
fpd.y
@ -404,7 +404,7 @@ frame_def:
|
||||
;
|
||||
|
||||
frame_items:
|
||||
measurements
|
||||
| measurements
|
||||
| frame_item frame_items
|
||||
;
|
||||
|
||||
@ -459,7 +459,11 @@ frame_item:
|
||||
if (!dbg_print($2))
|
||||
YYABORT;
|
||||
}
|
||||
| TOK_DBG_DUMP
|
||||
| debug_item
|
||||
;
|
||||
|
||||
debug_item:
|
||||
TOK_DBG_DUMP
|
||||
{
|
||||
/*
|
||||
* It's okay to do append the root frame multiple
|
||||
@ -718,11 +722,17 @@ pad_type:
|
||||
;
|
||||
|
||||
measurements:
|
||||
meas
|
||||
{
|
||||
*next_obj = $1;
|
||||
next_obj = &$1->next;
|
||||
}
|
||||
| measurements meas
|
||||
{
|
||||
*next_obj = $2;
|
||||
next_obj = &$2->next;
|
||||
}
|
||||
| measurements debug_item
|
||||
;
|
||||
|
||||
meas:
|
||||
|
Loading…
Reference in New Issue
Block a user