r5400 - trunk/eda/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Fri Aug 7 15:37:52 CEST 2009


Author: werner
Date: 2009-08-07 15:37:51 +0200 (Fri, 07 Aug 2009)
New Revision: 5400

Added:
   trunk/eda/fped/meas.c
   trunk/eda/fped/meas.fpd
   trunk/eda/fped/meas.h
Modified:
   trunk/eda/fped/Makefile
   trunk/eda/fped/README
   trunk/eda/fped/fpd.l
   trunk/eda/fped/fpd.y
   trunk/eda/fped/gui_inst.c
   trunk/eda/fped/inst.c
   trunk/eda/fped/inst.h
   trunk/eda/fped/obj.c
   trunk/eda/fped/obj.h
   trunk/eda/fped/sc89.fpd
Log:
- fpd.y: fixed check for empty part name
- added new-style measurements (experimental)



Modified: trunk/eda/fped/Makefile
===================================================================
--- trunk/eda/fped/Makefile	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/Makefile	2009-08-07 13:37:51 UTC (rev 5400)
@@ -11,7 +11,7 @@
 #
 
 OBJS = fped.o expr.o coord.o obj.o delete.o inst.o util.o error.o \
-       unparse.o dump.o \
+       unparse.o dump.o meas.o \
        cpp.o lex.yy.o y.tab.o \
        gui.o gui_util.o gui_style.o gui_inst.o gui_status.o gui_canvas.o \
        gui_tools.o

Modified: trunk/eda/fped/README
===================================================================
--- trunk/eda/fped/README	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/README	2009-08-07 13:37:51 UTC (rev 5400)
@@ -427,3 +427,45 @@
 be undeleted by pressing "u". If any other changes have been made
 since deletion, fped may misbehave. If deleting a vector, all items
 that reference it are deleted.
+
+
+Experimental: new-style measurements
+------------------------------------
+
+New-style measurements can measure the distance between various pairs
+of points, not only between points in the same instance and the same
+frame. They operate on the set of points produced during instantiation.
+
+New-style measurements are placed in the root frame after all other
+items.
+
+Known issues:
+- they are currently not dumped and they can't be entered or edited
+  through the GUI
+- 
+
+Syntax:
+
+<type> <from> <op> <to> <offset>
+
+Types:
+- measxy: measure diagonally
+- measx: measure along the X axis
+- measy: measure along the y axis
+
+Note that the type also affects the selection of the points. E.g.,
+measx will select maximum x values.
+
+Operators:
+- A -> B: smallest value of A and smallest B greater than A
+- A <- B: like A -> B, but normal (for offset and text) is inverted
+- A >> B: smallest value of A and greatest value of B
+- A << B: like A -> B, but normal (for offset and text) is inverted
+
+Operands are qualified vector names. Vectors in the root frame are
+referenced by their name. Vectors in other frames are prefixed with
+the name of the frame followed by a dot.
+
+Example:
+
+measx pad.sw -> pad.se 1mm

Modified: trunk/eda/fped/fpd.l
===================================================================
--- trunk/eda/fped/fpd.l	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/fpd.l	2009-08-07 13:37:51 UTC (rev 5400)
@@ -18,6 +18,7 @@
 #include "coord.h"
 #include "expr.h"
 #include "error.h"
+#include "meas.h"
 
 #include "y.tab.h"
 
@@ -94,6 +95,12 @@
 				  return TOK_ARC; }
 <INITIAL>"meas"			{ BEGIN(NOKEYWORD);
 				  return TOK_MEAS; }
+<INITIAL>"measxy"		{ BEGIN(NOKEYWORD);
+				  return TOK_MEASXY; }
+<INITIAL>"measx"		{ BEGIN(NOKEYWORD);
+				  return TOK_MEASX; }
+<INITIAL>"measy"		{ BEGIN(NOKEYWORD);
+				  return TOK_MEASY; }
 
 <INITIAL>[a-zA-Z_][a-zA-Z_0-9]*: { *strchr(yytext, ':') = 0;
 				  yylval.id = unique(yytext);
@@ -118,6 +125,11 @@
 				  yylval.str = stralloc(yytext+1);
 				  return STRING; }
 
+"->"				return TOK_NEXT;
+"<-"				return TOK_NEXT_INVERTED;
+">>"				return TOK_MAX;
+"<<"				return TOK_MAX_INVERTED;
+
 {SP}				;
 \n				{ if (!disable_keywords)
 					BEGIN(INITIAL);

Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/fpd.y	2009-08-07 13:37:51 UTC (rev 5400)
@@ -18,6 +18,7 @@
 #include "error.h"
 #include "expr.h"
 #include "obj.h"
+#include "meas.h"
 
 
 extern struct expr *expr_result;
@@ -48,11 +49,11 @@
 }
 
 
-static struct vec *find_vec(const char *name)
+static struct vec *find_vec(const struct frame *frame, const char *name)
 {
 	struct vec *v;
 
-	for (v = curr_frame->vecs; v; v = v->next)
+	for (v = frame->vecs; v; v = v->next)
 		if (v->name == name)
 			return v;
 	return NULL;
@@ -140,12 +141,20 @@
 	struct value *value;
 	struct vec *vec;
 	struct obj *obj;
+	struct meas *meas;
+	enum meas_type mt;
+	struct {
+		int inverted;
+		int max;
+	} mo;
 };
 
 
 %token		START_FPD START_EXPR
 %token		TOK_SET TOK_LOOP TOK_PART TOK_FRAME TOK_TABLE TOK_VEC
-%token		TOK_PAD TOK_RECT TOK_LINE TOK_CIRC TOK_ARC TOK_MEAS
+%token		TOK_PAD TOK_RECT TOK_LINE TOK_CIRC TOK_ARC
+%token		TOK_MEAS TOK_MEASXY TOK_MEASX TOK_MEASY
+%token		TOK_NEXT TOK_NEXT_INVERTED TOK_MAX TOK_MAX_INVERTED
 
 %token	<num>	NUMBER
 %token	<str>	STRING
@@ -155,9 +164,13 @@
 %type	<var>	vars var
 %type	<row>	rows
 %type	<value>	row value
-%type	<vec>	vec base
+%type	<vec>	vec base qbase
 %type	<obj>	obj
 %type	<expr>	expr opt_expr add_expr mult_expr unary_expr primary_expr
+%type	<meas>	measurements meas
+%type	<str>	opt_string
+%type	<mt>	meas_type
+%type	<mo>	meas_op
 
 %%
 
@@ -191,7 +204,7 @@
 		{
 			const char *p;
 
-			if (!*p) {
+			if (!*$2) {
 				yyerrorf("invalid part name");
 				YYABORT;
 			}
@@ -232,6 +245,10 @@
 	;
 
 frame_items:
+	measurements
+		{
+			measurements = $1;
+		}
 	| frame_item frame_items
 	;
 
@@ -248,7 +265,7 @@
 	| vec
 	| LABEL vec
 		{
-			if (find_vec($1)) {
+			if (find_vec(curr_frame, $1)) {
 				yyerrorf("duplicate vector \"%s\"", $1);
 				YYABORT;
 			}
@@ -370,6 +387,7 @@
 			$$->y = $6;
 			$$->frame = curr_frame;
 			$$->next = NULL;
+			$$->samples = NULL;
 			last_vec = $$;
 			*next_vec = $$;
 			next_vec = &$$->next;
@@ -391,7 +409,7 @@
 		}
 	| ID
 		{
-			$$ = find_vec($1);
+			$$ = find_vec(curr_frame, $1);
 			if (!$$) {
 				yyerrorf("unknown vector \"%s\"", $1);
 				YYABORT;
@@ -463,6 +481,101 @@
 		}
 	;
 
+measurements:
+		{
+			$$ = NULL;
+		}
+	| meas measurements
+		{
+			$$ = $1;
+			$$->next = $2;
+		}
+	;
+
+meas:
+	meas_type opt_string qbase meas_op qbase expr
+		{
+			$$ = alloc_type(struct meas);
+			$$->type = $4.max ? $1+3 : $1;
+			$$->label = $2;
+			$$->low = $3;
+			$$->inverted = $4.inverted;
+			$$->high = $5;
+			$$->offset = $6;
+			$$->next = NULL;
+		}
+	;
+
+qbase:
+	ID
+		{
+			$$ = find_vec(root_frame, $1);
+			if (!$$) {
+				yyerrorf("unknown vector \"%s\"", $1);
+				YYABORT;
+			}
+		}
+	| ID '.' ID
+		{
+			const struct frame *frame;
+
+			frame = find_frame($1);
+			$$ = frame ? find_vec(frame, $3) : NULL;
+			if (!$$) {
+				yyerrorf("unknown vector \"%s.%s\"", $1, $3);
+				YYABORT;
+			}
+		}
+	;
+
+meas_type:
+	TOK_MEASXY
+		{
+			$$ = mt_xy_next;
+		}
+	| TOK_MEASX
+		{
+			$$ = mt_x_next;
+		}
+	| TOK_MEASY
+		{
+			$$ = mt_y_next;
+		}
+	;
+
+meas_op:
+	TOK_NEXT
+		{
+			$$.max = 0;
+			$$.inverted = 0;
+		}
+	| TOK_NEXT_INVERTED
+		{
+			$$.max = 0;
+			$$.inverted = 1;
+		}
+	| TOK_MAX
+		{
+			$$.max = 1;
+			$$.inverted = 0;
+		}
+	| TOK_MAX_INVERTED
+		{
+			$$.max = 1;
+			$$.inverted = 1;
+		}
+	;
+
+opt_string:
+		{
+			$$ = NULL;
+		}
+	| STRING
+		{
+			$$ = $1;
+		}
+	;
+
 opt_expr:
 		{
 			$$ = NULL;

Modified: trunk/eda/fped/gui_inst.c
===================================================================
--- trunk/eda/fped/gui_inst.c	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/gui_inst.c	2009-08-07 13:37:51 UTC (rev 5400)
@@ -16,6 +16,7 @@
 #include <gtk/gtk.h>
 
 #include "util.h"
+#include "coord.h"
 #include "inst.h"
 #include "gui.h"
 #include "gui_util.h"
@@ -329,13 +330,12 @@
 /* ----- meas -------------------------------------------------------------- */
 
 
-static struct coord offset_vec(const struct inst *self)
+static struct coord offset_vec(struct coord a, struct coord b,
+    const struct inst *self)
 {
-	struct coord a, b, res;
+	struct coord res;
 	double f;
 
-	a = self->base;
-	b = self->u.meas.end;
 	res.x = a.y-b.y;
 	res.y = b.x-a.x;
 	if (res.x == 0 && res.y == 0)
@@ -352,7 +352,7 @@
 	struct coord a, b, off;
 	unit_type d;
 
-	off = offset_vec(self);
+	off = offset_vec(self->base, self->u.meas.end, self);
 	a = add_vec(self->base, off);
 	b = add_vec(self->u.meas.end, off);
 	d = dist_line(pos, a, b)/scale;
@@ -364,13 +364,34 @@
 {
 	struct coord a0, b0, a1, b1, off, c, d;
 	GdkGC *gc;
+	double len;
+	const char *label = self->u.meas.meas ?
+	    self->u.meas.meas->label ? self->u.meas.meas->label : "" : "";
 	char *s;
 
-	off = offset_vec(self);
 	a0 = translate(ctx, self->base);
 	b0 = translate(ctx, self->u.meas.end);
-	a1 = translate(ctx, add_vec(self->base, off));
-	b1 = translate(ctx, add_vec(self->u.meas.end, off));
+	a1 = self->base;
+	b1 = self->u.meas.end;
+	switch (self->u.meas.meas ? self->u.meas.meas->type : mt_xy_next) {
+	case mt_xy_next:
+	case mt_xy_max:
+		break;
+	case mt_x_next:
+	case mt_x_max:
+		b1.y = a1.y;
+		break;
+	case mt_y_next:
+	case mt_y_max:
+		b1.x = a1.x;
+		break;
+	default:
+		abort();
+	}
+	off = offset_vec(a1, b1, self);
+	len = units_to_mm(dist_point(a1, b1));
+	a1 = translate(ctx, add_vec(a1, off));
+	b1 = translate(ctx, add_vec(b1, off));
 	gc = gc_meas[get_mode(self)];
 	gdk_draw_line(DA, gc, a0.x, a0.y, a1.x, a1.y);
 	gdk_draw_line(DA, gc, b0.x, b0.y, b1.x, b1.y);
@@ -379,9 +400,8 @@
 	draw_arrow(ctx, gc, FALSE, b1, a1, MEAS_ARROW_LEN, MEAS_ARROW_ANGLE);
 
 	c = add_vec(a1, b1);
-	d = sub_vec(b0, a0);
-	s = stralloc_printf("%lgmm",
-	    units_to_mm(dist_point(self->base, self->u.meas.end)));
+	d = sub_vec(b1, a1);
+	s = stralloc_printf("%s%lgmm", label, len);
 	render_text(DA, gc, c.x/2, c.y/2, -atan2(d.y, d.x)/M_PI*180, s,
 	    MEAS_FONT, 0.5, -MEAS_BASELINE_OFFSET,
 	    dist_point(a1, b1)-1.5*MEAS_ARROW_LEN, 0);

Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/inst.c	2009-08-07 13:37:51 UTC (rev 5400)
@@ -291,8 +291,11 @@
 
 static void propagate_bbox(const struct inst *inst)
 {
-	update_bbox(&curr_frame->bbox, inst->bbox.min);
-	update_bbox(&curr_frame->bbox, inst->bbox.max);
+	/* @@@ for new-style measurements */
+	struct inst *frame = curr_frame ? curr_frame : insts[ip_frame];
+
+	update_bbox(&frame->bbox, inst->bbox.min);
+	update_bbox(&frame->bbox, inst->bbox.max);
 }
 
 
@@ -640,6 +643,8 @@
 	rect_status(self->bbox.min, self->bbox.max, -1);
 	status_set_type_entry("offset =");
 	status_set_name("%5.2f mm", units_to_mm(self->u.meas.offset));
+	if (!self->obj)
+		return; /* @@@ new-style measurements */
 	edit_expr(&self->obj->u.meas.offset, 0);
 }
 
@@ -648,6 +653,8 @@
 {
 	struct obj *obj = inst->obj;
 
+	if (!inst->obj)
+		return 0; /* @@@ new-style measurements */
 	anchors[0] = &obj->base;
 	anchors[1] = &obj->u.meas.other;
 	return 2;
@@ -664,8 +671,8 @@
 };
 
 
-int inst_meas(struct obj *obj, struct coord from, struct coord to,
-    unit_type offset)
+int inst_meas(struct obj *obj, struct meas *meas,
+    struct coord from, struct coord to, unit_type offset)
 {
 	struct inst *inst;
 
@@ -673,6 +680,9 @@
 	inst->obj = obj;
 	inst->u.meas.end = to;
 	inst->u.meas.offset = offset;
+	inst->u.meas.meas = meas;
+	if (!obj)
+		inst->active = 1; /* @@@ new-style measurements */
 	/* @@@ our bbox is actually a bit more complex than this */
 	update_bbox(&inst->bbox, to);
 	propagate_bbox(inst);

Modified: trunk/eda/fped/inst.h
===================================================================
--- trunk/eda/fped/inst.h	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/inst.h	2009-08-07 13:37:51 UTC (rev 5400)
@@ -18,6 +18,7 @@
 
 #include "coord.h"
 #include "obj.h"
+#include "meas.h"
 
 
 enum mode {
@@ -70,6 +71,7 @@
 		struct {
 			struct coord end;
 			double offset;
+			struct meas *meas; /* new-style measurement */
 		} meas;
 	} u;
 	struct inst *next;
@@ -95,8 +97,8 @@
 int inst_pad(struct obj *obj, const char *name, struct coord a, struct coord b);
 int inst_arc(struct obj *obj, struct coord center, struct coord start,
     struct coord stop, unit_type width);
-int inst_meas(struct obj *obj, struct coord from, struct coord to,
-    unit_type offset);
+int inst_meas(struct obj *obj, struct meas *meas,
+    struct coord from, struct coord to, unit_type offset);
 
 void inst_begin_active(int active);
 void inst_end_active(void);

Added: trunk/eda/fped/meas.c
===================================================================
--- trunk/eda/fped/meas.c	                        (rev 0)
+++ trunk/eda/fped/meas.c	2009-08-07 13:37:51 UTC (rev 5400)
@@ -0,0 +1,193 @@
+/*
+ * meas.c - Measurements
+ *
+ * Written 2009 by Werner Almesberger
+ * Copyright 2009 by Werner Almesberger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+
+#include <stdlib.h>
+
+#include "util.h"
+#include "coord.h"
+#include "expr.h"
+#include "obj.h"
+#include "inst.h"
+#include "meas.h"
+
+
+struct num eval_unit(const struct expr *expr, const struct frame *frame);
+
+struct sample {
+	struct coord pos;
+	struct sample *next;
+};
+
+struct meas *measurements = NULL;
+
+
+static void reset_samples(struct sample **samples)
+{
+	struct sample *next;
+
+	while (*samples) {
+		next = (*samples)->next;
+		free(*samples);
+		*samples = next;
+	}
+}
+
+
+void meas_start(void)
+{
+	struct frame *frame;
+	struct vec *vec;
+
+	for (frame = frames; frame; frame = frame->next)
+		for (vec = frame->vecs; vec; vec = vec->next)
+			reset_samples(&vec->samples);
+}
+
+
+void meas_post(struct vec *vec, struct coord pos)
+{
+	struct sample **walk, *new;
+
+	for (walk = &vec->samples; *walk; walk = &(*walk)->next) {
+		if (pos.y < (*walk)->pos.y)
+			break;
+		if (pos.y > (*walk)->pos.y)
+			continue;
+		if (pos.x < (*walk)->pos.x)
+			break;
+		if (pos.x == (*walk)->pos.x)
+			return;
+	}
+	new = alloc_type(struct sample);
+	new->pos = pos;
+	new->next = *walk;
+	*walk = new;
+}
+
+
+static int lt_x(struct coord a, struct coord b)
+{
+	return a.x < b.x;
+}
+
+
+static int lt_y(struct coord a, struct coord b)
+{
+	return a.y < b.y;
+}
+
+
+static int lt_xy(struct coord a, struct coord b)
+{
+	return a.y < b.y || (a.y == b.y && a.x < b.x);
+}
+
+
+static int (*lt_op[mt_n])(struct coord a, struct coord b) = {
+	lt_xy,
+	lt_x,
+	lt_y,
+	lt_xy,
+	lt_x,
+	lt_y
+};
+
+
+static int is_next[mt_n] = {
+	1, 1, 1,
+	0, 0, 0
+};
+
+
+static int better_next(int (*lt)(struct coord a, struct coord b),
+    struct coord a0, struct coord b0, struct coord b)
+{
+	/* if we don't have any suitable point A0 < B0 yet, use this one */
+	if (!lt(a0, b0))
+		return 1;
+
+	/* B must be strictly greater than A0 */
+	if (!lt(a0, b))
+		return 0;
+
+	/* if we can get closer to A0, do so */
+	if (lt(b, b0))
+		return 1;
+
+	/* reject B > B0 */
+	if (lt(b0, b))
+		return 0;
+
+	/*
+	 * B == B0 along the coordinate we measure. Now give the other
+	 * coordinate a chance. This gives us a stable sort order and it
+	 * makes meas/measx/measy usually select the same point.
+	 */
+	if (lt == lt_xy)
+		return 0;
+	if (lt == lt_x)
+		return better_next(lt_y, a0, b0, b);
+	if (lt == lt_y)
+		return better_next(lt_x, a0, b0, b);
+	abort();
+}
+
+
+int instantiate_meas(void)
+{
+	struct meas *meas;
+	struct coord a0, b0;
+	const struct sample *a, *b;
+	int (*lt)(struct coord a, struct coord b);
+	struct num offset;
+
+	for (meas = measurements; meas; meas = meas->next) {
+		if (!meas->low->samples || !meas->high->samples)
+			continue;
+
+		lt = lt_op[meas->type];
+
+		/*
+		 * In order to obtain a stable order, we sort points equal on
+		 * the measured coordinate also by xy:
+		 *
+		 * if (*a < a0) use *a
+		 * else if (*a == a0 && *a <xy a0) use *a
+		 */
+		a0 = meas->low->samples->pos;
+		for (a = meas->low->samples; a; a = a->next)
+			if (lt(a->pos, a0) ||
+			    (!lt(a0, a->pos) && lt_xy(a->pos, a0)))
+				a0 = a->pos;
+
+		b0 = meas->high->samples->pos;
+		for (b = meas->high->samples; b; b = b->next) {
+			if (is_next[meas->type]) {
+				if (better_next(lt, a0, b0, b->pos))
+					b0 = b->pos;
+			} else {
+				if (lt(b0, b->pos) ||
+				    (!lt(b->pos, b0) && lt_xy(b0, b->pos)))
+					b0 = b->pos;
+			}
+		}
+
+		offset = eval_unit(meas->offset, root_frame);
+		if (is_undef(offset))
+			return 0;
+		inst_meas(NULL, meas,
+		    meas->inverted ? b0 : a0, meas->inverted ? a0 : b0,
+		    offset.n);
+	}
+	return 1;
+}

Added: trunk/eda/fped/meas.fpd
===================================================================
--- trunk/eda/fped/meas.fpd	                        (rev 0)
+++ trunk/eda/fped/meas.fpd	2009-08-07 13:37:51 UTC (rev 5400)
@@ -0,0 +1,24 @@
+/*
+ * new-style measurements demo
+ */
+
+part "measurements"
+loop x = -2, 2
+A: vec @(0mm, 0mm)
+B: vec @(x*2mm, 2mm)
+C: vec @(0mm, 4mm)
+
+/*
+ * If we measure (x, y), y trumps x
+ */
+measxy "A -> B = " A -> B 0.2mm
+measxy "A <- B = " A <- B 0.5mm
+
+measxy "A >> B = " A >> B 1.5mm
+
+measx "x(A -> B) = " A -> B -0.5mm
+measx "x(A >> B) = " A >> B -1mm
+measy "y(A -> B) = " A -> B -2mm
+measy "y(A >> B) = " A >> B -4.5mm
+
+measxy "B -> C = " B -> C 0.5mm

Added: trunk/eda/fped/meas.h
===================================================================
--- trunk/eda/fped/meas.h	                        (rev 0)
+++ trunk/eda/fped/meas.h	2009-08-07 13:37:51 UTC (rev 5400)
@@ -0,0 +1,46 @@
+/*
+ * meas.h - Measurements
+ *
+ * Written 2009 by Werner Almesberger
+ * Copyright 2009 by Werner Almesberger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+
+#ifndef MEAS_H
+#define MEAS_H
+
+#include "obj.h"
+
+
+struct meas {
+	enum meas_type {
+		mt_xy_next,
+		mt_x_next,
+		mt_y_next,
+		mt_xy_max,
+		mt_x_max,
+		mt_y_max,
+		mt_n
+	} type;
+	char *label; /* or NULL */
+	int inverted;
+	struct vec *low;
+	struct vec *high;
+	struct expr *offset;
+	struct meas *next;
+};
+
+
+extern struct meas *measurements;
+
+
+void meas_start(void);
+void meas_post(struct vec *vec, struct coord pos);
+int instantiate_meas(void);
+
+#endif /* !MEAS_H */

Modified: trunk/eda/fped/obj.c
===================================================================
--- trunk/eda/fped/obj.c	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/obj.c	2009-08-07 13:37:51 UTC (rev 5400)
@@ -18,6 +18,7 @@
 #include "util.h"
 #include "error.h"
 #include "expr.h"
+#include "meas.h"
 #include "inst.h"
 #include "obj.h"
 
@@ -37,7 +38,8 @@
     const struct frame *parent, struct obj *frame_ref, int active);
 
 
-static struct num eval_unit(const struct expr *expr, const struct frame *frame)
+struct num eval_unit(const struct expr *expr, const struct frame *frame);
+/*static*/ struct num eval_unit(const struct expr *expr, const struct frame *frame)
 {
 	struct num d;
 
@@ -78,6 +80,7 @@
 		vec->pos.y += y.n;
 		if (!inst_vec(vec, vec_base))
 			return 0;
+		meas_post(vec, vec->pos);
 	}
 	return 1;
 }
@@ -144,7 +147,8 @@
 			offset = eval_unit(obj->u.meas.offset, frame);
 			if (is_undef(offset))
 				return 0;
-			if (!inst_meas(obj, obj->base ? obj->base->pos : base,
+			if (!inst_meas(obj, NULL,
+			    obj->base ? obj->base->pos : base,
 			    obj->u.meas.other ? obj->u.meas.other->pos : base,
 			    offset.n))
 				return 0;
@@ -261,8 +265,11 @@
 	int ok;
 
 	inst_start();
+	meas_start();
 	ok = generate_frame(root_frame, zero, NULL, NULL, 1);
 	if (ok)
+		ok = instantiate_meas();
+	if (ok)
 		inst_commit();
 	else
 		inst_revert();

Modified: trunk/eda/fped/obj.h
===================================================================
--- trunk/eda/fped/obj.h	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/obj.h	2009-08-07 13:37:51 UTC (rev 5400)
@@ -84,6 +84,8 @@
 	int initialized;
 };
 
+struct sample;
+
 struct vec {
 	const char *name; /* NULL if anonymous */
 	struct expr *x;
@@ -96,6 +98,9 @@
 
 	/* used when editing */
 	struct frame *frame;
+
+	/* samples for measurements */
+	struct sample *samples;
 };
 
 struct frame {
@@ -147,7 +152,7 @@
 	struct expr *width;
 };
 
-struct meas {
+struct old_meas {
 	struct vec *other; /* NULL if frame origin */
 	struct expr *offset;
 };
@@ -160,7 +165,7 @@
 		struct rect line;
 		struct pad pad;
 		struct arc arc;
-		struct meas meas;
+		struct old_meas meas;
 	} u;
 	struct frame *frame;
 	struct vec *base;

Modified: trunk/eda/fped/sc89.fpd
===================================================================
--- trunk/eda/fped/sc89.fpd	2009-08-07 02:23:04 UTC (rev 5399)
+++ trunk/eda/fped/sc89.fpd	2009-08-07 13:37:51 UTC (rev 5400)
@@ -1,12 +1,12 @@
 /* MACHINE-GENERATED ! */
 
 frame pad {
-	_pad_0: vec @(-Px/2, -Py/2)
-	_pad_1: vec .(Px, 0mm)
-	_pad_2: vec _pad_0(0mm, Py)
-	pad "$pad" _pad_1 _pad_2
-	meas _pad_0 _pad_1 -0.1mm
-	meas _pad_0 _pad_2 0.1mm
+	sw: vec @(-Px/2, -Py/2)
+	se: vec sw(Px, 0mm)
+	nw: vec sw(0mm, Py)
+	pad "$pad" se nw
+//	meas sw se -0.1mm
+//	meas sw nw 0.1mm
 }
 
 frame pad_ne {
@@ -41,3 +41,5 @@
 frame pad_sc __0
 frame pad_nw __1
 frame pad_ne __2
+
+measx pad.sw -> pad.se 1mm




More information about the commitlog mailing list