Send commitlog mailing list submissions to
        commitlog@lists.openmoko.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        commitlog-requ...@lists.openmoko.org

You can reach the person managing the list at
        commitlog-ow...@lists.openmoko.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r5390 - trunk/eda/fped (wer...@docs.openmoko.org)
   2. r5391 - trunk/eda/fped (wer...@docs.openmoko.org)
   3. r5392 - trunk/eda/fped (wer...@docs.openmoko.org)
--- Begin Message ---
Author: werner
Date: 2009-08-05 20:43:00 +0200 (Wed, 05 Aug 2009)
New Revision: 5390

Modified:
   trunk/eda/fped/README
   trunk/eda/fped/TODO
   trunk/eda/fped/delete.c
   trunk/eda/fped/delete.h
   trunk/eda/fped/gui.c
   trunk/eda/fped/gui_canvas.c
   trunk/eda/fped/gui_status.c
   trunk/eda/fped/inst.c
   trunk/eda/fped/inst.h
Log:
- revamped delete logic: delete now always works. If there are references, we
  remove them as well. (In progress.)
- added frame deletion
- gui_status.c:add_label added vertical padding to keep the input area from
  bouncing (by Alvaro Lopes)



Modified: trunk/eda/fped/README
===================================================================
--- trunk/eda/fped/README       2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/README       2009-08-05 18:43:00 UTC (rev 5390)
@@ -10,6 +10,28 @@
 that can be performed through the GUI.
 
 
+Building
+--------
+
+Check out the repository:
+
+  svn co http://svn.openmoko.org/trunk/eda/fped
+  cd fped
+
+Get updates:
+
+  svn update
+
+Compile:
+
+  make dep
+  make
+
+Run an example:
+
+  ./fped qfp.fpd
+
+
 Motivation
 ----------
 
@@ -346,7 +368,8 @@
 GUI
 ---
 
-Keys:
+Keyboard shortcuts
+- - - - - - - - -
 
 Space  reset user coordinates
 +, =   zoom in (like mouse wheel forward)
@@ -356,3 +379,28 @@
 #      zoom and center to currently active frame instance
 Delete delete the currently selected object
 U      undelete the previously deleted object
+
+
+Canvas
+- - -
+
+To create a new object, click on the corresponding tool icon, move the
+mouse to the base point of the new object, then drag to the object's
+second point.
+
+Frame references are created as follows:
+
+- select the frame you want to add
+- click on the frame icon. A black dot should appear on the icon.
+- select the frame on which you want to add the new reference.
+  The black dot should change to a green dot. If the current frame
+  is a child of the selected frame, the dot remains black.
+- click on the desired base location
+
+To change a point of an object, select the object, then drag the point
+to its new location. To edit the object's parameters, select it and
+make the changes in the input area at the bottom.
+
+To delete an object, select it and press Delete. Deleted objects can
+be undeleted by pressing "u". If any other changes have been made
+since deletion, fped may misbehave.

Modified: trunk/eda/fped/TODO
===================================================================
--- trunk/eda/fped/TODO 2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/TODO 2009-08-05 18:43:00 UTC (rev 5390)
@@ -17,6 +17,7 @@
 - make column of entry field greedily consume all unallocated space
 - status area looks awful
 - status area bounces when something becomes editable
+- add button with GTK_STOCK_UNDELETE for "undelete" to menu bar
 
 Bugs:
 - default silk width has no business being hard-coded in obj.c

Modified: trunk/eda/fped/delete.c
===================================================================
--- trunk/eda/fped/delete.c     2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/delete.c     2009-08-05 18:43:00 UTC (rev 5390)
@@ -25,9 +25,14 @@
        enum del_type {
                dt_vec,
                dt_obj,
+               dt_frame,
        } type;
        union {
                struct {
+                       struct frame *ref;
+                       struct frame *prev;
+               } frame;
+               struct {
                        struct vec *ref;
                        struct vec *prev;
                } vec;
@@ -77,7 +82,7 @@
 }
 
 
-int delete_vec(struct vec *vec)
+void delete_vec(struct vec *vec)
 {
        struct vec *walk, *prev;
        struct deletion *del;
@@ -85,7 +90,7 @@
        if (vec->n_refs) {
                fail("vector has %d reference%s", vec->n_refs,
                    vec->n_refs == 1 ? "" : "s");
-               return 0;
+               return;
        }
        prev = NULL;
        for (walk = vec->frame->vecs; walk != vec; walk = walk->next)
@@ -98,7 +103,6 @@
        del = new_deletion(dt_vec);
        del->u.vec.ref = vec;
        del->u.vec.prev = prev;
-       return 1;
 }
 
 
@@ -204,7 +208,7 @@
 }
 
 
-int delete_obj(struct obj *obj)
+void delete_obj(struct obj *obj)
 {
        struct obj *walk, *prev;
        struct deletion *del;
@@ -220,7 +224,6 @@
        del = new_deletion(dt_obj);
        del->u.obj.ref = obj;
        del->u.obj.prev = prev;
-       return 1;
 }
 
 
@@ -237,6 +240,54 @@
 }
 
 
+/* ----- frames ------------------------------------------------------------ */
+
+
+static void delete_references(const struct frame *ref)
+{
+       struct frame *frame;
+       struct obj *obj;
+
+       for (frame = frames; frame; frame = frame->next)
+               for (obj = frame->objs; obj; obj = obj->next)
+                       if (obj->type == ot_frame)
+                               if (obj->u.frame.ref == ref)
+                                       delete_obj(obj);
+}
+
+
+void delete_frame(struct frame *frame)
+{
+       struct deletion *del;
+
+       delete_references(frame);
+
+       del = new_deletion(dt_frame);
+       del->u.frame.ref = frame;
+       del->u.frame.prev = frame->prev;
+
+       if (frame->next)
+               frame->next->prev = frame->prev;
+       if (frame->prev)
+               frame->prev->next = frame->next;
+       else
+               frames = frame->next;
+}
+
+
+static void undelete_frame(struct frame *frame, struct frame *prev)
+{
+       if (prev) {
+               assert(frame->next == prev->next);
+               prev->next = frame;
+       } else {
+               assert(frame->next == frames);
+               frames = frame;
+       }
+       frame->next->prev = frame;
+}
+
+
 /* ----- destroy/undelete interface ---------------------------------------- */
 
 
@@ -254,6 +305,10 @@
        case dt_obj:
                destroy_obj(del->u.obj.ref);
                break;
+       case dt_frame:
+               abort();
+               /* @@@ later */
+               break;
        default:
                abort();
        }
@@ -277,6 +332,9 @@
        case dt_obj:
                undelete_obj(del->u.obj.ref, del->u.obj.prev);
                break;
+       case dt_frame:
+               undelete_frame(del->u.frame.ref, del->u.frame.prev);
+               break;
        default:
                abort();
        }

Modified: trunk/eda/fped/delete.h
===================================================================
--- trunk/eda/fped/delete.h     2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/delete.h     2009-08-05 18:43:00 UTC (rev 5390)
@@ -18,8 +18,9 @@
 #include "obj.h"
 
 
-int delete_vec(struct vec *vec);
-int delete_obj(struct obj *obj);
+void delete_vec(struct vec *vec);
+void delete_obj(struct obj *obj);
+void delete_frame(struct frame *frame);
 int destroy(void);
 int undelete(void);
 

Modified: trunk/eda/fped/gui.c
===================================================================
--- trunk/eda/fped/gui.c        2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/gui.c        2009-08-05 18:43:00 UTC (rev 5390)
@@ -15,10 +15,13 @@
 #include <string.h>
 #include <math.h>
 #include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
 
 #include "util.h"
+#include "error.h"
 #include "inst.h"
 #include "obj.h"
+#include "delete.h"
 #include "unparse.h"
 #include "gui_util.h"
 #include "gui_style.h"
@@ -540,6 +543,49 @@
 }
 
 
+/* ----- frame delete ------------------------------------------------------ */
+
+
+static gboolean frame_delete_event(GtkWidget *widget, GdkEventButton *event,
+    gpointer data)
+{
+       struct frame *frame = data;
+
+       switch (event->button) {
+       case 1:
+               if (frame == root_frame) {
+                       fail("you cannot delete the root frame");
+                       break;
+               }
+               delete_frame(frame);
+               if (active_frame == frame)
+                       select_frame(root_frame);
+               change_world();
+               break;
+       }
+       return TRUE;
+}
+
+
+static GtkWidget *build_frame_delete(struct frame *frame)
+{
+       GtkWidget *evbox, *image;
+
+       evbox = gtk_event_box_new();
+       image = 
+           gtk_image_new_from_stock(GTK_STOCK_CANCEL,
+               GTK_ICON_SIZE_SMALL_TOOLBAR);
+       gtk_container_add(GTK_CONTAINER(evbox), image);
+
+       gtk_misc_set_padding(GTK_MISC(image), 2, 2);
+       gtk_misc_set_alignment(GTK_MISC(image), 0.3, 0);
+
+       g_signal_connect(G_OBJECT(evbox),
+           "button_press_event", G_CALLBACK(frame_delete_event), frame);
+       return evbox;
+}
+
+
 /* ----- frame references -------------------------------------------------- */
 
 
@@ -576,7 +622,7 @@
 static void build_frames(GtkWidget *vbox)
 {
        struct frame *frame;
-       GtkWidget *tab, *label, *refs, *vars;
+       GtkWidget *tab, *label, *delete, *refs, *vars;
        int n = 0;
 
        destroy_all_children(GTK_CONTAINER(vbox));
@@ -593,9 +639,15 @@
                label = build_frame_label(frame);
                gtk_table_attach_defaults(GTK_TABLE(tab), label,
                    0, 1, n*2, n*2+1);
+
+               delete = build_frame_delete(frame);
+               gtk_table_attach_defaults(GTK_TABLE(tab), delete,
+                    0, 1, n*2+1, n*2+2);
+
                refs = build_frame_refs(frame);
                gtk_table_attach_defaults(GTK_TABLE(tab), refs,
                    1, 2, n*2, n*2+1);
+
                vars = build_vars(frame);
                gtk_table_attach_defaults(GTK_TABLE(tab), vars,
                    1, 2, n*2+1, n*2+2);

Modified: trunk/eda/fped/gui_canvas.c
===================================================================
--- trunk/eda/fped/gui_canvas.c 2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/gui_canvas.c 2009-08-05 18:43:00 UTC (rev 5390)
@@ -301,7 +301,8 @@
        case GDK_BackSpace:
        case GDK_Delete:
        case GDK_KP_Delete:
-               if (selected_inst && inst_delete(selected_inst)) {
+               if (selected_inst) {
+                       inst_delete(selected_inst);
                        tool_frame_update();
                        change_world();
                }

Modified: trunk/eda/fped/gui_status.c
===================================================================
--- trunk/eda/fped/gui_status.c 2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/gui_status.c 2009-08-05 18:43:00 UTC (rev 5390)
@@ -444,8 +444,11 @@
        GtkWidget *label;
 
        label = label_in_box_new(NULL);
-       gtk_table_attach_defaults(GTK_TABLE(tab), box_of_label(label),
-           col, col+1, row, row+1);
+       gtk_table_attach(GTK_TABLE(tab), box_of_label(label),
+           col, col+1, row, row+1,
+           GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 1);
+           /* 0 , 1 - padding */
+
        gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
        gtk_label_set_selectable(GTK_LABEL(label), TRUE);
        return label;
@@ -472,9 +475,9 @@
 
 void make_status_area(GtkWidget *vbox)
 {
-       GtkWidget *tab;
+       GtkWidget *tab, *sep;
 
-       tab = gtk_table_new(6, 3, FALSE);
+       tab = gtk_table_new(7, 3, FALSE);
        gtk_box_pack_start(GTK_BOX(vbox), tab, FALSE, TRUE, 0);
 
        /* types */
@@ -495,22 +498,27 @@
        status_name = add_label(tab, 1, 2);
        status_entry = add_entry(tab, 2, 2);
 
+       /* separator */
+
+       sep = gtk_vseparator_new();
+       gtk_table_attach_defaults(GTK_TABLE(tab), sep, 3, 4, 0, 3);
+
        /* sys / user pos */
 
-       status_sys_x = add_label(tab, 3, 0);
-       status_sys_y = add_label(tab, 3, 1);
-       status_user_x = add_label(tab, 4, 0);
-       status_user_y = add_label(tab, 4, 1);
+       status_sys_x = add_label(tab, 4, 0);
+       status_sys_y = add_label(tab, 4, 1);
+       status_user_x = add_label(tab, 5, 0);
+       status_user_y = add_label(tab, 5, 1);
 
        /* r / angle */
 
-       status_r = add_label(tab, 3, 2);
-       status_angle = add_label(tab, 4, 2);
+       status_r = add_label(tab, 4, 2);
+       status_angle = add_label(tab, 5, 2);
 
        /* zoom / grid */
 
-       status_zoom = add_label(tab, 5, 0);
-       status_grid = add_label(tab, 5, 1);
+       status_zoom = add_label(tab, 6, 0);
+       status_grid = add_label(tab, 6, 1);
 
        /* message bar */
 

Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c       2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/inst.c       2009-08-05 18:43:00 UTC (rev 5390)
@@ -870,10 +870,12 @@
 }
 
 
-int inst_delete(struct inst *inst)
+void inst_delete(struct inst *inst)
 {
-       return inst->ops == &vec_ops ?
-           delete_vec(inst->vec) : delete_obj(inst->obj);
+       if (inst->ops == &vec_ops)
+               delete_vec(inst->vec);
+       else
+               delete_obj(inst->obj);
 }
 
 

Modified: trunk/eda/fped/inst.h
===================================================================
--- trunk/eda/fped/inst.h       2009-08-05 14:44:36 UTC (rev 5389)
+++ trunk/eda/fped/inst.h       2009-08-05 18:43:00 UTC (rev 5390)
@@ -117,7 +117,7 @@
     struct coord pos, int i);
 int inst_do_move_to(struct inst *inst, struct vec *vec, int i);
 void inst_hover(struct inst *inst, struct draw_ctx *ctx, int on);
-int inst_delete(struct inst *inst);
+void inst_delete(struct inst *inst);
 void inst_debug(void);
 
 #endif /* !INST_H */




--- End Message ---
--- Begin Message ---
Author: werner
Date: 2009-08-06 06:33:49 +0200 (Thu, 06 Aug 2009)
New Revision: 5391

Modified:
   trunk/eda/fped/README
   trunk/eda/fped/delete.c
   trunk/eda/fped/dump.c
   trunk/eda/fped/fpd.y
   trunk/eda/fped/fped.c
   trunk/eda/fped/gui_tools.c
   trunk/eda/fped/inst.c
   trunk/eda/fped/inst.h
   trunk/eda/fped/obj.h
Log:
- undelete after recursive delete now brings back everything deleted in that
  operation, not just one object at a time
- vector reference counting is not needed now that we have recursive delete.
  Removed it.
- completed recursive delete of vectors
- gridify: give new vectors a minimum length, so that we don't get a weird
  display when starting a new footprint.



Modified: trunk/eda/fped/README
===================================================================
--- trunk/eda/fped/README       2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/README       2009-08-06 04:33:49 UTC (rev 5391)
@@ -403,4 +403,5 @@
 
 To delete an object, select it and press Delete. Deleted objects can
 be undeleted by pressing "u". If any other changes have been made
-since deletion, fped may misbehave.
+since deletion, fped may misbehave. If deleting a vector, all items
+that reference it are deleted.

Modified: trunk/eda/fped/delete.c
===================================================================
--- trunk/eda/fped/delete.c     2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/delete.c     2009-08-06 04:33:49 UTC (rev 5391)
@@ -41,16 +41,24 @@
                        struct obj *prev;
                } obj;
        } u;
+       int group;
        struct deletion *next;
 } *deletions = NULL;
 
+static int groups = 0;
 
+
+static void do_delete_vec(struct vec *vec);
+static void do_delete_obj(struct obj *obj);
+
+
 static struct deletion *new_deletion(enum del_type type)
 {
        struct deletion *del;
 
        del = alloc_type(struct deletion);
        del->type = type;
+       del->group = groups;
        del->next = deletions;
        deletions = del;
        return del;
@@ -60,38 +68,64 @@
 /* ----- vectors ----------------------------------------------------------- */
 
 
-static void dereference_vec(struct vec *vec)
-{
-       assert(!vec->n_refs);
-       put_vec(vec->base);
-}
-
-
 static void destroy_vec(struct vec *vec)
 {
-       assert(!vec->n_refs);
        free_expr(vec->x);
        free_expr(vec->y);
        free(vec);
 }
 
 
-static void rereference_vec(struct vec *vec)
+static void delete_vecs_by_ref(struct vec *vecs, const struct vec *ref)
 {
-       get_vec(vec->base);
+       while (vecs) {
+               if (vecs->base == ref)
+                       do_delete_vec(vecs);
+               vecs = vecs->next;
+       }
 }
 
 
-void delete_vec(struct vec *vec)
+static int obj_has_ref(const struct obj *obj, const struct vec *ref)
 {
+       if (obj->base == ref)
+               return 1;
+       switch (obj->type) {
+       case ot_frame:
+               return 0;
+       case ot_line:
+               return obj->u.line.other == ref;
+       case ot_rect:
+               return obj->u.rect.other == ref;
+       case ot_pad:
+               return obj->u.pad.other == ref;
+       case ot_arc:
+               return obj->u.arc.start == ref || obj->u.arc.end == ref;
+       case ot_meas:
+       default:
+               abort();
+       }
+}
+
+
+static void delete_objs_by_ref(struct obj **objs, const struct vec *ref)
+{
+       struct obj *obj;
+
+       for (obj = *objs; obj; obj = obj->next)
+               if (obj_has_ref(obj, ref))
+                       do_delete_obj(obj);
+}
+
+
+static void do_delete_vec(struct vec *vec)
+{
        struct vec *walk, *prev;
        struct deletion *del;
 
-       if (vec->n_refs) {
-               fail("vector has %d reference%s", vec->n_refs,
-                   vec->n_refs == 1 ? "" : "s");
-               return;
-       }
+       delete_vecs_by_ref(vec->frame->vecs, vec);
+       delete_objs_by_ref(&vec->frame->objs, vec);
+
        prev = NULL;
        for (walk = vec->frame->vecs; walk != vec; walk = walk->next)
                prev = walk;
@@ -99,13 +133,19 @@
                prev->next = vec->next;
        else
                vec->frame->vecs = vec->next;
-       dereference_vec(vec);
        del = new_deletion(dt_vec);
        del->u.vec.ref = vec;
        del->u.vec.prev = prev;
 }
 
 
+void delete_vec(struct vec *vec)
+{
+       groups++;
+       do_delete_vec(vec);
+}
+
+
 static void undelete_vec(struct vec *vec, struct vec *prev)
 {
        if (prev) {
@@ -115,42 +155,12 @@
                assert(vec->next == vec->frame->vecs);
                vec->frame->vecs = vec;
        }
-       rereference_vec(vec);
 }
 
 
 /* ----- objects ----------------------------------------------------------- */
 
 
-static void dereference_obj(struct obj *obj)
-{
-       switch (obj->type) {
-       case ot_frame:
-               /* nothing */
-               break;
-       case ot_pad:
-               put_vec(obj->u.pad.other);
-               break;
-       case ot_line:
-               put_vec(obj->u.line.other);
-               break;
-       case ot_rect:
-               put_vec(obj->u.rect.other);
-               break;
-       case ot_arc:
-               put_vec(obj->u.arc.start);
-               put_vec(obj->u.arc.end);
-               break;
-       case ot_meas:
-               put_vec(obj->u.meas.other);
-               break;
-       default:
-               abort();
-       }
-       put_vec(obj->base);
-}
-
-
 static void destroy_obj(struct obj *obj)
 {
        switch (obj->type) {
@@ -179,37 +189,8 @@
 }
 
 
-static void rereference_obj(struct obj *obj)
+static void do_delete_obj(struct obj *obj)
 {
-       switch (obj->type) {
-       case ot_frame:
-               /* nothing */
-               break;
-       case ot_pad:
-               get_vec(obj->u.pad.other);
-               break;
-       case ot_line:
-               get_vec(obj->u.line.other);
-               break;
-       case ot_rect:
-               get_vec(obj->u.rect.other);
-               break;
-       case ot_arc:
-               get_vec(obj->u.arc.start);
-               get_vec(obj->u.arc.end);
-               break;
-       case ot_meas:
-               get_vec(obj->u.meas.other);
-               break;
-       default:
-               abort();
-       }
-       get_vec(obj->base);
-}
-
-
-void delete_obj(struct obj *obj)
-{
        struct obj *walk, *prev;
        struct deletion *del;
 
@@ -220,13 +201,19 @@
                prev->next = obj->next;
        else
                obj->frame->objs = obj->next;
-       dereference_obj(obj);
        del = new_deletion(dt_obj);
        del->u.obj.ref = obj;
        del->u.obj.prev = prev;
 }
 
 
+void delete_obj(struct obj *obj)
+{
+       groups++;
+       do_delete_obj(obj);
+}
+
+
 static void undelete_obj(struct obj *obj, struct obj *prev)
 {
        if (prev) {
@@ -236,7 +223,6 @@
                assert(obj->next == obj->frame->objs);
                obj->frame->objs = obj;
        }
-       rereference_obj(obj);
 }
 
 
@@ -260,6 +246,7 @@
 {
        struct deletion *del;
 
+       groups++;
        delete_references(frame);
 
        del = new_deletion(dt_frame);
@@ -318,7 +305,7 @@
 }
 
 
-int undelete(void)
+static int undelete_one(void)
 {
        struct deletion *del;
 
@@ -342,3 +329,16 @@
        free(del);
        return 1;
 }
+
+
+int undelete(void)
+{
+       int group;
+
+       if (!deletions)
+               return 0;
+       group = deletions->group;
+       while (deletions && deletions->group == group)
+               undelete_one();
+       return 1;
+}

Modified: trunk/eda/fped/dump.c
===================================================================
--- trunk/eda/fped/dump.c       2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/dump.c       2009-08-06 04:33:49 UTC (rev 5391)
@@ -114,8 +114,6 @@
        const struct vec *walk;
        int n;
 
-       if (!vec->n_refs)
-               return 0;
        n = 0;
        for (walk = vec->frame->vecs; walk; walk = walk->next)
                if (walk->base == vec)

Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y        2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/fpd.y        2009-08-06 04:33:49 UTC (rev 5391)
@@ -345,7 +345,6 @@
                        $$->base = $2;
                        $$->x = $4;
                        $$->y = $6;
-                       $$->n_refs = 0;
                        $$->frame = curr_frame;
                        $$->next = NULL;
                        last_vec = $$;
@@ -366,7 +365,6 @@
                                yyerrorf(". without predecessor");
                                YYABORT;
                        }
-                       $$->n_refs++;
                }
        | ID
                {
@@ -375,7 +373,6 @@
                                yyerrorf("unknown vector \"%s\"", $1);
                                YYABORT;
                        }
-                       $$->n_refs++;
                }
        ;
 
@@ -406,7 +403,7 @@
                        $$ = new_obj(ot_arc);
                        $$->base = $2;
                        $$->u.arc.start = $3;
-                       $$->u.arc.end = get_vec($3);
+                       $$->u.arc.end = $3;
                        $$->u.arc.width = $4;
                }
        | TOK_ARC base base base opt_expr

Modified: trunk/eda/fped/fped.c
===================================================================
--- trunk/eda/fped/fped.c       2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/fped.c       2009-08-06 04:33:49 UTC (rev 5391)
@@ -54,7 +54,7 @@
        if (error)
                return error;
 
-//     dump(stdout);
+       dump(stdout);
 
        return 0;
 }

Modified: trunk/eda/fped/gui_tools.c
===================================================================
--- trunk/eda/fped/gui_tools.c  2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/gui_tools.c  2009-08-06 04:33:49 UTC (rev 5391)
@@ -80,8 +80,7 @@
 
        vec = alloc_type(struct vec);
        vec->name = NULL;
-       vec->base = inst_get_ref(base);
-       vec->n_refs = 0;
+       vec->base = inst_get_vec(base);
        vec->next = NULL;
        vec->frame = active_frame;
        for (walk = &active_frame->vecs; *walk; walk = &(*walk)->next);
@@ -97,7 +96,7 @@
        obj = alloc_type(struct obj);
        obj->type = type;
        obj->frame = active_frame;
-       obj->base = inst_get_ref(base);
+       obj->base = inst_get_vec(base);
        obj->next = NULL;
        obj->lineno = 0;
        for (walk = &active_frame->objs; *walk; walk = &(*walk)->next);
@@ -164,10 +163,20 @@
 /* ----- vec --------------------------------------------------------------- */
 
 
-static void gridify(struct coord base, struct coord *pos)
+static struct coord gridify(struct coord base, struct coord pos)
 {
-       pos->x -= fmod(pos->x-base.x, mm_to_units(0.1));
-       pos->y -= fmod(pos->y-base.y, mm_to_units(0.1));
+       struct coord new;
+       unit_type unit = mm_to_units(0.1);
+
+       new.x = pos.x-(pos.x-base.x % unit);
+       new.y = pos.y-(pos.y-base.y % unit);
+       if (new.x != base.x || new.y != base.y)
+               return new;
+       if (fabs(pos.x-base.x) > fabs(pos.y-base.y))
+               new.x += pos.x > base.x ? unit : -unit;
+       else
+               new.y += pos.y > base.y ? unit : -unit;
+       return new;
 }
 
 
@@ -178,7 +187,7 @@
        struct pix_buf *buf;
 
        pos = inst_get_point(from);
-       gridify(pos, &to);
+       to = gridify(pos, to);
        status_set_type_x("dX =");
        status_set_type_y("dX =");
        status_set_x("%lg mm", units_to_mm(to.x-pos.x));
@@ -207,7 +216,7 @@
 
        vec = new_vec(from);
        pos = inst_get_point(from);
-       gridify(pos, &to);
+       to = gridify(pos, to);
        vec->x = new_num(make_mm(units_to_mm(to.x-pos.x)));
        vec->y = new_num(make_mm(units_to_mm(to.y-pos.y)));
        return 1;
@@ -252,7 +261,7 @@
        if (from == to)
                return 0;
        obj = new_obj(ot_line, from);
-       obj->u.line.other = inst_get_ref(to);
+       obj->u.line.other = inst_get_vec(to);
        obj->u.line.width = NULL;
        return 1;
 }
@@ -298,7 +307,7 @@
        if (from == to)
                return 0;
        obj = new_obj(ot_rect, from);
-       obj->u.rect.other = inst_get_ref(to);
+       obj->u.rect.other = inst_get_vec(to);
        obj->u.rect.width = NULL;
        return 1;
 }
@@ -321,7 +330,7 @@
        if (from == to)
                return 0;
        obj = new_obj(ot_pad, from);
-       obj->u.pad.other = inst_get_ref(to);
+       obj->u.pad.other = inst_get_vec(to);
        obj->u.pad.name = stralloc("?");
        return 1;
 }
@@ -367,8 +376,8 @@
        if (from == to)
                return 0;
        obj = new_obj(ot_arc, from);
-       obj->u.arc.start = inst_get_ref(to);
-       obj->u.arc.end = inst_get_ref(to);
+       obj->u.arc.start = inst_get_vec(to);
+       obj->u.arc.end = inst_get_vec(to);
        obj->u.arc.width = NULL;
        return 1;
 }
@@ -417,16 +426,6 @@
 }
 
 
-static void replace(struct vec **anchor, struct vec *new)
-{
-       if (*anchor)
-               (*anchor)->n_refs--;
-       *anchor = new;
-       if (new)
-               new->n_refs++;
-}
-
-
 void do_move_to_arc(struct inst *inst, struct vec *vec, int i)
 {
        struct obj *obj = inst->obj;
@@ -435,15 +434,15 @@
        is_circle = obj->u.arc.start == obj->u.arc.end;
        switch (i) {
        case 0:
-               replace(&obj->base, vec);
+               obj->base = vec;
                break;
        case 1:
-               replace(&obj->u.arc.start, vec);
+               obj->u.arc.start = vec;
                if (!is_circle)
                        break;
                /* fall through */
        case 2:
-               replace(&obj->u.arc.end, vec);
+               obj->u.arc.end = vec;
                break;
        default:
                abort();
@@ -475,7 +474,7 @@
        if (from == to)
                return 0;
        obj = new_obj(ot_meas, from);
-       obj->u.meas.other = inst_get_ref(to);
+       obj->u.meas.other = inst_get_vec(to);
        obj->u.meas.offset = parse_expr("0mm");
        return 1;
 }
@@ -643,13 +642,8 @@
 
 static void do_move_to(struct drag_state *state, struct inst *curr)
 {
-       struct vec *old;
-
        assert(may_move_to(state, curr));
-       old = *state->anchors[state->anchor_i];
-       if (old)
-               old->n_refs--;
-       *state->anchors[state->anchor_i] = inst_get_ref(curr);
+       *state->anchors[state->anchor_i] = inst_get_vec(curr);
 }
 
 

Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c       2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/inst.c       2009-08-06 04:33:49 UTC (rev 5391)
@@ -219,18 +219,6 @@
 }
 
 
-struct vec *inst_get_ref(const struct inst *inst)
-{
-       if (inst->ops == &vec_ops) {
-               inst->vec->n_refs++;
-               return inst->vec;
-       }
-       if (inst->ops == &frame_ops)
-               return NULL;
-       abort();
-}
-
-
 struct vec *inst_get_vec(const struct inst *inst)
 {
        if (inst->ops == &vec_ops)

Modified: trunk/eda/fped/inst.h
===================================================================
--- trunk/eda/fped/inst.h       2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/inst.h       2009-08-06 04:33:49 UTC (rev 5391)
@@ -87,7 +87,6 @@
 struct inst *inst_find_point(const struct draw_ctx *ctx, struct coord pos);
 struct coord inst_get_point(const struct inst *inst);
 int inst_anchors(struct inst *inst, struct vec ***anchors);
-struct vec *inst_get_ref(const struct inst *inst);
 struct vec *inst_get_vec(const struct inst *inst);
 
 int inst_vec(struct vec *vec, struct coord base);

Modified: trunk/eda/fped/obj.h
===================================================================
--- trunk/eda/fped/obj.h        2009-08-05 18:43:00 UTC (rev 5390)
+++ trunk/eda/fped/obj.h        2009-08-06 04:33:49 UTC (rev 5391)
@@ -88,7 +88,6 @@
        struct expr *x;
        struct expr *y;
        struct vec *base; /* NULL if frame */
-       int n_refs;
        struct vec *next;
 
        /* used during generation */
@@ -174,23 +173,6 @@
 extern struct frame *active_frame;
 
 
-static inline struct vec *get_vec(struct vec *vec)
-{
-       if (vec)
-               vec->n_refs++;
-       return vec;
-}
-
-
-static inline void put_vec(struct vec *vec)
-{
-       if (vec) {
-               assert(vec->n_refs);
-               vec->n_refs--;
-       }
-}
-
-
 int instantiate(void);
 
 #endif /* !OBJ_H */




--- End Message ---
--- Begin Message ---
Author: werner
Date: 2009-08-06 06:56:47 +0200 (Thu, 06 Aug 2009)
New Revision: 5392

Modified:
   trunk/eda/fped/dump.c
   trunk/eda/fped/fped.c
   trunk/eda/fped/obj.h
Log:
- dumping now labels all vectors, even those we only reference as .
- dump objects only after all the vectors they reference have been dumped
- instead of relying on clever algorithms to dump each object only once, just
  mark them
- left "dump" enabled in "main", oops



Modified: trunk/eda/fped/dump.c
===================================================================
--- trunk/eda/fped/dump.c       2009-08-06 04:33:49 UTC (rev 5391)
+++ trunk/eda/fped/dump.c       2009-08-06 04:56:47 UTC (rev 5392)
@@ -82,17 +82,11 @@
 /* ----- vectors and objects ----------------------------------------------- */
 
 
-static char *base_name(const struct vec *vec, const struct vec *base)
+static char *generate_name(const struct vec *base)
 {
        const struct vec *walk;
        int n;
 
-       if (!base)
-               return stralloc("@");
-       if (vec && base->next == vec)
-               return stralloc(".");
-       if (base->name)
-               return stralloc(base->name);
        n = 0;
        for (walk = base->frame->vecs; walk != base; walk = walk->next)
                n++;
@@ -101,11 +95,23 @@
 }
 
 
+static char *base_name(const struct vec *base, const struct vec *next)
+{
+       if (!base)
+               return stralloc("@");
+       if (next && base->next == next)
+               return stralloc(".");
+       if (base->name)
+               return stralloc(base->name);
+       return generate_name(base);
+}
+
+
 static char *obj_base_name(const struct vec *base, const struct vec *prev)
 {
        if (base && base == prev)
                return stralloc(".");
-       return base_name(NULL, base);
+       return base_name(base, NULL);
 }
 
 
@@ -150,40 +156,70 @@
 }
 
 
-static void dump_obj(FILE *file, const struct obj *obj, const char *indent,
-    const struct vec *prev)
+/*
+ * If we need a vector that's defined later, we have to defer dumping the
+ * object.
+ */
+
+static int later(const struct vec *base, const struct vec *prev)
 {
-       char *base, *s1, *s2, *s3;
-       int n;
+       while (prev) {
+               if (base == prev)
+                       return 1;
+               prev = prev->next;
+       }
+       return 0;
+}
 
+
+static int may_dump_obj_now(const struct obj *obj, const struct vec *prev)
+{
+       int n, l;
+
        n = need(obj->base, prev);
+       l = later(obj->base, prev);
 
        switch (obj->type) {
        case ot_frame:
                break;
        case ot_line:
                n |= need(obj->u.line.other, prev);
+               l |= later(obj->u.line.other, prev);
                break;
        case ot_rect:
                n |= need(obj->u.rect.other, prev);
+               l |= later(obj->u.rect.other, prev);
                break;
        case ot_pad:
                n |= need(obj->u.pad.other, prev);
+               l |= later(obj->u.pad.other, prev);
                break;
        case ot_arc:
                n |= need(obj->u.arc.start, prev);
                n |= need(obj->u.arc.end, prev);
+               l |= later(obj->u.arc.start, prev);
+               l |= later(obj->u.arc.end, prev);
                break;
        case ot_meas:
                n |= need(obj->u.meas.other, prev);
+               l |= later(obj->u.meas.other, prev);
                break;
        default:
                abort();
        }
 
-       if (prev ? !n : n)
+       return n && !l;
+}
+
+
+static void dump_obj(FILE *file, struct obj *obj, const char *indent,
+    const struct vec *prev)
+{
+       char *base, *s1, *s2, *s3;
+
+       if (obj->dumped)
                return;
-
+       obj->dumped = 1;
        base = obj_base_name(obj->base, prev);
        switch (obj->type) {
        case ot_frame:
@@ -248,23 +284,27 @@
 static void recurse_vec(FILE *file, const struct vec *vec, const char *indent)
 {
        const struct vec *next;
-       const struct obj *obj;
-       char *base, *x, *y;
+       struct obj *obj;
+       char *base, *x, *y, *s;
 
-       base = base_name(vec, vec->base);
+       base = base_name(vec->base, vec);
        x = unparse(vec->x);
        y = unparse(vec->y);
        if (vec->name)
                fprintf(file, "%s%s: vec %s(%s, %s)\n",
                    indent, vec->name, base, x, y);
-       else
-               fprintf(file, "%svec %s(%s, %s)\n", indent, base, x, y);
+       else {
+               s = generate_name(vec);
+               fprintf(file, "%s%s: vec %s(%s, %s)\n", indent, s, base, x, y);
+               free(s);
+       }
        free(base);
        free(x);
        free(y);
 
        for (obj = vec->frame->objs; obj; obj = obj->next)
-               dump_obj(file, obj, indent, vec);
+               if (may_dump_obj_now(obj, vec))
+                       dump_obj(file, obj, indent, vec);
        if (n_vec_refs(vec) == 1) {
                for (next = vec->next; next->base != vec; next = next->next);
                recurse_vec(file, next, indent);
@@ -290,13 +330,17 @@
 {
        const struct table *table;
        const struct loop *loop;
-       const struct obj *obj;
+       struct obj *obj;
 
        for (table = frame->tables; table; table = table->next)
                dump_table(file, table, indent);
        for (loop = frame->loops; loop; loop = loop->next)
                dump_loop(file, loop, indent);
+       for (obj = frame->objs; obj; obj = obj->next)
+               obj->dumped = 0;
        dump_vecs(file, frame->vecs, indent);
+
+       /* duh. do we need this ? */
        for (obj = frame->objs; obj; obj = obj->next)
                dump_obj(file, obj, indent, NULL);
 }

Modified: trunk/eda/fped/fped.c
===================================================================
--- trunk/eda/fped/fped.c       2009-08-06 04:33:49 UTC (rev 5391)
+++ trunk/eda/fped/fped.c       2009-08-06 04:56:47 UTC (rev 5392)
@@ -54,7 +54,7 @@
        if (error)
                return error;
 
-       dump(stdout);
+//     dump(stdout);
 
        return 0;
 }

Modified: trunk/eda/fped/obj.h
===================================================================
--- trunk/eda/fped/obj.h        2009-08-06 04:33:49 UTC (rev 5391)
+++ trunk/eda/fped/obj.h        2009-08-06 04:56:47 UTC (rev 5392)
@@ -165,6 +165,9 @@
        struct vec *base;
        struct obj *next;
        int lineno;
+
+       /* for dumping */
+       int dumped;
 };
 
 




--- End Message ---
_______________________________________________
commitlog mailing list
commitlog@lists.openmoko.org
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to