r5947 - in trunk/eda/fped: . test

werner at docs.openmoko.org werner at docs.openmoko.org
Wed Apr 28 00:36:46 CEST 2010


Author: werner
Date: 2010-04-28 00:36:46 +0200 (Wed, 28 Apr 2010)
New Revision: 5947

Added:
   trunk/eda/fped/test/del_frame
   trunk/eda/fped/test/del_vec
Modified:
   trunk/eda/fped/README
   trunk/eda/fped/delete.c
   trunk/eda/fped/fpd.y
Log:
Deleting things often left measurements behind. Fixed these bugs, enhanced %del
to also delete frames and items in other frames than the current one, and added
the corresponding regression tests.

- fpd.y, README: %del can now also delete frames
- test/del_frame: regression test for frame deletion
- fpd.y: moved all debug items into debug_item, so that they can be invoked
  after defining measurements
- README: clarified that object labels aren't entirely hidden in the GUI
- delete.c (delete_references): also delete measurements referencing the frame
  (test/del_frame)
- fpd.y (dbg_link_frame): described why we need base_frame in addition to 
  base_vec
- fpd.y, README: %del can now also reach into frames other than the current one
- delete.c (do_delete_vec): also delete references in the root frame, i.e.,
  measurements (tests/del_vec)



Modified: trunk/eda/fped/README
===================================================================
--- trunk/eda/fped/README	2010-04-27 10:57:09 UTC (rev 5946)
+++ trunk/eda/fped/README	2010-04-27 22:36:46 UTC (rev 5947)
@@ -588,7 +588,7 @@
 For debugging and regression tests, fped supports the following commands,
 most of which mimick the effect of GUI operations:
 
-%del <identifier>
+%del <qualified-identifier>
 %move <identifier> [<number>] <identifier>
 %frame <identifier> <qualified-base>
 %print <expression>
@@ -596,14 +596,17 @@
 %exit
 %tsort { -<id> | +<id> | <id-before> <id-after> [<number>] ... }
 
-%del and %move take as their first argument the name of the vector or
-object to manipulate. For this purpose, also objects can be labeled.
+%del removes the specified item. This can be a vector, an object, or
+a frame. If the vector or object is in a different frame than the
+current, its name is qualified with the frame name, e.g., "foo.obj".
 
-Object labels behave like vector labels and share the same name space.
-They are not shown anywhere in the GUI.
+For this purpose, also objects can be labeled. Object labels behave like
+vector labels and share the same name space.  They are not normally
+accessible in the GUI. (You can see them in the code view.)
 
-%move sets an anchor point to the vector named as its last argument.
-The anchor point is identified by index as follows:
+%move take as its first argument the name of the vector or object to
+manipulate. %move sets an anchor point to the vector named as its last
+argument. The anchor point is identified by index as follows:
 
 anchor index	vec/frame	line/rect/pad	arc		measurement
 --------------	---------	-------------	------------	-----------

Modified: trunk/eda/fped/delete.c
===================================================================
--- trunk/eda/fped/delete.c	2010-04-27 10:57:09 UTC (rev 5946)
+++ trunk/eda/fped/delete.c	2010-04-27 22:36:46 UTC (rev 5947)
@@ -177,6 +177,7 @@
 
 	delete_vecs_by_ref(vec->frame->vecs, vec);
 	delete_objs_by_ref(&vec->frame->objs, vec);
+	delete_objs_by_ref(&root_frame->objs, vec); /* catch measurements */
 }
 
 
@@ -522,9 +523,19 @@
 
 	for (frame = frames; frame; frame = frame->next)
 		for (obj = frame->objs; obj; obj = obj->next)
-			if (obj->type == ot_frame)
+			switch (obj->type) {
+			case ot_frame:
 				if (obj->u.frame.ref == ref)
 					do_delete_obj(obj);
+				break;
+			case ot_meas:
+				if (obj->base->frame == ref ||
+				    obj->u.meas.high->frame == ref)
+					do_delete_obj(obj);
+				break;
+			default:
+				break;
+			}
 	for (obj = ref->objs; obj; obj = obj->next)
 		if (obj->type == ot_frame)
 			if (obj->u.frame.ref->active_ref == obj)

Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y	2010-04-27 10:57:09 UTC (rev 5946)
+++ trunk/eda/fped/fpd.y	2010-04-27 22:36:46 UTC (rev 5947)
@@ -178,22 +178,48 @@
 }
 
 
-static int dbg_delete(const char *name)
+static int dbg_delete(const char *frame_name, const char *name)
 {
 	struct vec *vec;
 	struct obj *obj;
+	struct frame *frame;
 
-	vec = find_vec(curr_frame, name);
+	if (!frame_name)
+		frame = curr_frame;
+	else {
+		frame = find_frame(frame_name);
+		if (!frame) {
+			yyerrorf("unknown frame \"%s\"", frame_name);
+			return 0;
+		}
+	}
+	vec = find_vec(frame, name);
 	if (vec) {
 		delete_vec(vec);
 		return 1;
 	}
-	obj = find_obj(curr_frame, name);
+	obj = find_obj(frame, name);
 	if (obj) {
 		delete_obj(obj);
 		return 1;
 	}
-	yyerrorf("unknown item \"%s\"", name);
+	if (!frame_name) {
+		frame = find_frame(name);
+		if (frame) {
+			if (curr_frame == frame) {
+				yyerrorf("a frame can't delete itself");
+				return 0;
+			}
+			if (last_frame == frame)
+				last_frame = frame->prev;
+			delete_frame(frame);
+			return 1;
+		}
+	}
+	if (frame_name)
+		yyerrorf("unknown item \"%s.%s\"", frame_name, name);
+	else
+		yyerrorf("unknown item \"%s\"", name);
 	return 0;
 }
 
@@ -238,12 +264,19 @@
  * @@@ This is very similar to what we do in rule "obj". Consider merging.
  */
 
+/*
+ * We need to pass base_frame and base_vec, not just the vector (with the
+ * frame implied) since we can also reference the frame's origin, whose
+ * "vector" is NULL.
+ */
+
 static int dbg_link_frame(const char *frame_name,
     struct frame *base_frame, struct vec *base_vec)
 {
 	struct frame *frame;
 	struct obj *obj;
 
+	assert(!base_vec || base_vec->frame == base_frame);
 	frame = find_frame(frame_name);
 	if (!frame) {
 		yyerrorf("unknown frame \"%s\"", frame_name);
@@ -496,11 +529,22 @@
 			}
 			$2->name = $1;
 		}
-	| TOK_DBG_DEL ID
+	| debug_item
+	;
+
+debug_item:
+	TOK_DBG_DEL ID
 		{
-			if (!dbg_delete($2))
+			append_root_frame();
+			if (!dbg_delete(NULL, $2))
 				YYABORT;
 		}
+	| TOK_DBG_DEL ID '.' ID
+		{
+			append_root_frame();
+			if (!dbg_delete($2, $4))
+				YYABORT;
+		}
 	| TOK_DBG_MOVE ID opt_num ID
 		{
 			if (!dbg_move($2, $3.n, $4))
@@ -516,11 +560,7 @@
 			if (!dbg_print($2))
 				YYABORT;
 		}
-	| debug_item
-	;
-
-debug_item:
-	TOK_DBG_DUMP
+	| TOK_DBG_DUMP
 		{
 			/*
 			 * It's okay to do append the root frame multiple

Added: trunk/eda/fped/test/del_frame
===================================================================
--- trunk/eda/fped/test/del_frame	                        (rev 0)
+++ trunk/eda/fped/test/del_frame	2010-04-27 22:36:46 UTC (rev 5947)
@@ -0,0 +1,67 @@
+#!/bin/sh
+. ./Common
+
+###############################################################################
+
+fped_fail "delete frame: can't self-destruct" <<EOF
+frame f {
+	%del f
+}
+EOF
+expect <<EOF
+3: a frame can't delete itself near "}"
+EOF
+
+#------------------------------------------------------------------------------
+
+fped_dump "delete frame: content disappears" <<EOF
+frame f {
+	vec @(0mm, 0mm)
+}
+
+%del f
+EOF
+expect <<EOF
+/* MACHINE-GENERATED ! */
+
+package "_"
+unit mm
+EOF
+
+#------------------------------------------------------------------------------
+
+fped_dump "delete frame: references disappear" <<EOF
+frame f {
+	vec @(0mm, 0mm)
+}
+
+frame f @
+
+%del f
+EOF
+expect <<EOF
+/* MACHINE-GENERATED ! */
+
+package "_"
+unit mm
+EOF
+
+#------------------------------------------------------------------------------
+
+fped_dump "delete frame: measurements disappear" <<EOF
+frame f {
+	v: vec @(0mm, 0mm)
+}
+
+meas f.v -> f.v
+
+%del f
+EOF
+expect <<EOF
+/* MACHINE-GENERATED ! */
+
+package "_"
+unit mm
+EOF
+
+###############################################################################


Property changes on: trunk/eda/fped/test/del_frame
___________________________________________________________________
Name: svn:executable
   + *

Added: trunk/eda/fped/test/del_vec
===================================================================
--- trunk/eda/fped/test/del_vec	                        (rev 0)
+++ trunk/eda/fped/test/del_vec	2010-04-27 22:36:46 UTC (rev 5947)
@@ -0,0 +1,64 @@
+#!/bin/sh
+. ./Common
+
+###############################################################################
+
+fped_dump "delete vector: it disappears" <<EOF
+v: vec @(0mm, 0mm)
+%del v
+EOF
+expect <<EOF
+/* MACHINE-GENERATED ! */
+
+package "_"
+unit mm
+EOF
+
+#------------------------------------------------------------------------------
+
+fped_dump "delete vector: references disappear" <<EOF
+v: vec @(0mm, 0mm)
+line v v
+%del v
+EOF
+expect <<EOF
+/* MACHINE-GENERATED ! */
+
+package "_"
+unit mm
+EOF
+
+#------------------------------------------------------------------------------
+
+fped_dump "delete vector: measurements disappear (same frame)" <<EOF
+v: vec @(0mm, 0mm)
+meas v -> v
+%del v
+EOF
+expect <<EOF
+/* MACHINE-GENERATED ! */
+
+package "_"
+unit mm
+EOF
+
+#------------------------------------------------------------------------------
+
+fped_dump "delete vector: measurements disappear (other frame)" <<EOF
+frame f {
+	v: vec @(0mm, 0mm)
+}
+meas f.v -> f.v
+%del f.v
+EOF
+expect <<EOF
+/* MACHINE-GENERATED ! */
+
+frame f {
+}
+
+package "_"
+unit mm
+EOF
+
+###############################################################################


Property changes on: trunk/eda/fped/test/del_vec
___________________________________________________________________
Name: svn:executable
   + *




More information about the commitlog mailing list