r5928 - trunk/eda/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Tue Apr 20 23:01:16 CEST 2010


Author: werner
Date: 2010-04-20 23:01:16 +0200 (Tue, 20 Apr 2010)
New Revision: 5928

Modified:
   trunk/eda/fped/dump.c
   trunk/eda/fped/fpd.y
   trunk/eda/fped/obj.h
Log:
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.



Modified: trunk/eda/fped/dump.c
===================================================================
--- trunk/eda/fped/dump.c	2010-04-20 18:39:26 UTC (rev 5927)
+++ trunk/eda/fped/dump.c	2010-04-20 21:01:16 UTC (rev 5928)
@@ -75,6 +75,8 @@
 
 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 @@
 			return 1;
 	}
 	return 0;
+#endif
 }
 
 
@@ -134,7 +137,7 @@
 }
 
 /*
- * 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 @@
 	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 @@
 		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;
 

Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y	2010-04-20 18:39:26 UTC (rev 5927)
+++ trunk/eda/fped/fpd.y	2010-04-20 21:01:16 UTC (rev 5928)
@@ -404,7 +404,7 @@
 	;
 
 frame_items:
-	measurements
+	| measurements
 	| frame_item frame_items
 	;
 
@@ -459,7 +459,11 @@
 			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 @@
 	;
 
 measurements:
+	meas
+		{
+			*next_obj = $1;
+			next_obj = &$1->next;
+		}
 	| measurements meas
 		{
 			*next_obj = $2;
 			next_obj = &$2->next;
 		}
+	| measurements debug_item
 	;
 
 meas:

Modified: trunk/eda/fped/obj.h
===================================================================
--- trunk/eda/fped/obj.h	2010-04-20 18:39:26 UTC (rev 5927)
+++ trunk/eda/fped/obj.h	2010-04-20 21:01:16 UTC (rev 5928)
@@ -142,6 +142,9 @@
 	/* for re-ordering after a move */
 	int mark;
 
+	/* for dumping */
+	int dumped;
+
 	/* for the GUI */
 	GtkWidget *list_widget; /* NULL if items aren't shown */
 };




More information about the commitlog mailing list