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