r5332 - developers/werner/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Tue Jul 28 23:50:48 CEST 2009


Author: werner
Date: 2009-07-28 23:50:48 +0200 (Tue, 28 Jul 2009)
New Revision: 5332

Modified:
   developers/werner/fped/Makefile
   developers/werner/fped/TODO
   developers/werner/fped/expr.c
   developers/werner/fped/expr.h
   developers/werner/fped/inst.c
   developers/werner/fped/obj.c
   developers/werner/fped/qfn.fpd
   developers/werner/fped/util.h
Log:
- added pad name expansion
- made build process less verbose (make V=1 turns on full output)



Modified: developers/werner/fped/Makefile
===================================================================
--- developers/werner/fped/Makefile	2009-07-28 19:50:12 UTC (rev 5331)
+++ developers/werner/fped/Makefile	2009-07-28 21:50:48 UTC (rev 5332)
@@ -26,6 +26,39 @@
 YACC=bison -y
 YYFLAGS=-v
 
+# ----- Verbosity control -----------------------------------------------------
+
+CPP := $(CPP)   # make sure changing CC won't affect CPP
+
+CC_normal	:= $(CC)
+YACC_normal	:= $(YACC)
+LEX_normal	:= $(LEX)
+DEPEND_normal = \
+  $(CPP) $(CFLAGS) -MM -MG *.c >.depend || \
+  { rm -f .depend; exit 1; }
+
+CC_quiet	= @echo "  CC       " $@ && $(CC_normal)
+YACC_quiet	= @echo "  YACC     " $@ && $(YACC_normal)
+LEX_quiet	= @echo "  LEX      " $@ && $(LEX_normal)
+GEN_quiet	= @echo "  GENERATE " $@ &&
+DEPEND_quiet	= @echo "  DEPENDENCIES" && $(DEPEND_normal)
+
+ifeq ($(V),1)
+    CC		= $(CC_normal)
+    LEX		= $(LEX_normal)
+    YACC	= $(YACC_normal)
+    GEN		=
+    DEPEND	= $(DEPEND_normal)
+else
+    CC		= $(CC_quiet)
+    LEX		= $(LEX_quiet)
+    YACC	= $(YACC_quiet)
+    GEN		= $(GEN_quiet)
+    DEPEND	= $(DEPEND_quiet)
+endif
+
+# ----- Rules -----------------------------------------------------------------
+
 all:		fped
 
 fped:		$(OBJS)
@@ -46,8 +79,7 @@
 # ----- Dependencies ----------------------------------------------------------
 
 dep depend .depend: lex.yy.c y.tab.h y.tab.c
-		$(CPP) $(CFLAGS) -MM -MG *.c >.depend || \
-		  { rm -f .depend; exit 1; }
+		$(DEPEND)
 
 ifeq (.depend,$(wildcard .depend))
 include .depend

Modified: developers/werner/fped/TODO
===================================================================
--- developers/werner/fped/TODO	2009-07-28 19:50:12 UTC (rev 5331)
+++ developers/werner/fped/TODO	2009-07-28 21:50:48 UTC (rev 5332)
@@ -24,3 +24,4 @@
 - add KiCad output
 - add postscript output
 - add option to include/omit helper vecs and frames (display and postscript)
+- Q: how do we handle stacks of objects ?

Modified: developers/werner/fped/expr.c
===================================================================
--- developers/werner/fped/expr.c	2009-07-28 19:50:12 UTC (rev 5331)
+++ developers/werner/fped/expr.c	2009-07-28 21:50:48 UTC (rev 5332)
@@ -25,7 +25,7 @@
 }
 
 
-static double eval_var(const struct frame *frame, const char *name)
+double eval_var(const struct frame *frame, const char *name)
 {
 	const struct table *table;
 	const struct loop *loop;
@@ -131,11 +131,6 @@
 }
 
 
-double eval(const struct expr *expr, const struct frame *frame)
-{
-	return expr->op(expr, frame);
-}
-
 char *eval_str(const struct frame *frame, const struct expr *expr)
 {
 	abort();

Modified: developers/werner/fped/expr.h
===================================================================
--- developers/werner/fped/expr.h	2009-07-28 19:50:12 UTC (rev 5331)
+++ developers/werner/fped/expr.h	2009-07-28 21:50:48 UTC (rev 5332)
@@ -52,6 +52,7 @@
 struct expr *new_op(op_type op);
 struct expr *binary_op(op_type op, struct expr *a, struct expr *b);
 
+double eval_var(const struct frame *frame, const char *name);
 char *eval_str(const struct frame *frame, const struct expr *expr);
 double eval_num(const struct expr *expr, const struct frame *frame);
 

Modified: developers/werner/fped/inst.c
===================================================================
--- developers/werner/fped/inst.c	2009-07-28 19:50:12 UTC (rev 5331)
+++ developers/werner/fped/inst.c	2009-07-28 21:50:48 UTC (rev 5332)
@@ -169,7 +169,7 @@
 	struct inst *inst;
 
 	inst = add_inst(&pad_ops, a);
-	inst->u.name = name;
+	inst->u.name = stralloc(name);
 	update_bbox(&inst->bbox, b);
 	propagate_bbox(inst);
 	return 1;

Modified: developers/werner/fped/obj.c
===================================================================
--- developers/werner/fped/obj.c	2009-07-28 19:50:12 UTC (rev 5331)
+++ developers/werner/fped/obj.c	2009-07-28 21:50:48 UTC (rev 5332)
@@ -12,7 +12,10 @@
 
 
 #include <stdlib.h>
+#include <string.h>
 
+#include "util.h"
+#include "error.h"
 #include "expr.h"
 #include "obj.h"
 #include "inst.h"
@@ -25,12 +28,86 @@
     const struct frame *parent);
 
 
+static int is_id(char c, int first)
+{
+	if ((c >= 'A' && c <= 'Z') ||
+	    (c >= 'a' && c <= 'z') ||
+	    c == '_')
+		return 1;
+	if (first)
+		return 0;
+	return c >= '0' && c <= '9';
+}
+
+
+static char *expand(const char *name, const struct frame *frame)
+{
+	int len = strlen(name);
+	char *buf = alloc_size(len+1);
+	char num_buf[100]; /* enough :-) */
+	const char *s, *s0;
+	char *var;
+	const char *var_unique;
+	double value;
+	int i, value_len;
+
+	i = 0;
+	for (s = name; *s; s++) {
+		if (*s != '$') {
+			buf[i++] = *s;
+			continue;
+		}
+		s0 = ++s;
+		if (*s != '{') {
+			while (is_id(*s, s == s0))
+				s++;
+			var = strnalloc(s0, s-s0);
+			len -= s-s0+1;
+			s--;
+		} else {
+			s++;
+			while (*s != '}') {
+				if (!is_id(*s, s == s0+1))
+					goto invalid;
+				s++;
+			}
+			var = strnalloc(s0+1, s-s0-1);
+			len -= s-s0+2;
+		}
+		var_unique = unique(var);
+		free(var);
+		value = eval_var(frame, var_unique);
+		if (value == UNDEF) {
+			fail("undefined variable \"%s\"", var_unique);
+			goto fail;
+		}
+		value_len = snprintf(num_buf, sizeof(num_buf), "%lg", value);
+		len += value_len;
+		buf = realloc(buf, len);
+		if (!buf)
+			abort();
+		strcpy(buf+i, num_buf);
+		i += value_len;
+	}
+	buf[i] = 0;
+	return buf;
+
+invalid:
+	fail("invalid character in variable name");
+fail:
+	free(buf);
+	return NULL;
+}
+
+
 static int generate_objects(struct frame *frame, struct coord base)
 {
 	struct coord vec_base;
 	struct vec *vec;
 	struct obj *obj;
 	double x, y;
+	char *name;
+	int res;
 
 	for (vec = frame->vecs; vec; vec = vec->next) {
 		x = eval_num(vec->x, frame);
@@ -64,9 +141,14 @@
 				return 0;
 			break;
 		case ot_pad:
-			if (!inst_pad(obj->u.pad.name,
+			name = expand(obj->u.pad.name, frame);
+			if (!name)
+				return 0;
+			res = inst_pad(name,
 			    obj->base ? obj->base->pos : base,
-			    obj->u.pad.other ? obj->u.pad.other->pos : base))
+			    obj->u.pad.other ? obj->u.pad.other->pos : base);
+			free(name);
+			if (!res)
 				return 0;
 			break;
 		case ot_arc:

Modified: developers/werner/fped/qfn.fpd
===================================================================
--- developers/werner/fped/qfn.fpd	2009-07-28 19:50:12 UTC (rev 5331)
+++ developers/werner/fped/qfn.fpd	2009-07-28 21:50:48 UTC (rev 5332)
@@ -1,9 +1,10 @@
-# http://www.nxp.com/acrobat/packages/footprint/SOT616-1_fp_reflow.pdf
+// http://www.nxp.com/acrobat/packages/footprint/SOT616-1_fp_reflow.pdf
 
 .frame pad_up {
 	c = .vec @ -D/2, 0
 	.vec . D, C
-	.pad "N/4+n" c .
+	pad = n+1
+	.pad "$pad" c .
 }
 
 N = 24
@@ -26,7 +27,7 @@
 .vec @ P*(n-(N/4-1)/2), -Ay/2
 .frame pad_up .
 
-# ARC, just for testing
+// ARC, just for testing
 
 c = .vec @ -1mm, 1mm
 r = .vec c 0mm, 0.5mm

Modified: developers/werner/fped/util.h
===================================================================
--- developers/werner/fped/util.h	2009-07-28 19:50:12 UTC (rev 5331)
+++ developers/werner/fped/util.h	2009-07-28 21:50:48 UTC (rev 5332)
@@ -18,12 +18,14 @@
 #include <string.h>
 
 
-#define alloc_type(t)					\
-    ({	t *alloc_type_tmp = (t *) malloc(sizeof(t));	\
-	if (!alloc_type_tmp)				\
+#define alloc_size(s)					\
+    ({	void *alloc_size_tmp = malloc(s);		\
+	if (!alloc_size_tmp)				\
 		abort();				\
-	alloc_type_tmp; })
+	alloc_size_tmp; })
 
+#define alloc_type(t) ((t *) alloc_size(sizeof(t)))
+
 #define zalloc_type(t)					\
     ({	t *zalloc_type_tmp = alloc_type(t);		\
 	memset(zalloc_type_tmp, 0, sizeof(t));		\
@@ -35,6 +37,14 @@
 		abort();				\
 	stralloc_tmp; })
 
+#define strnalloc(s, n)					\
+    ({	char *strnalloc_tmp = alloc_size((n)+1);	\
+	if (!strnalloc_tmp)				\
+		abort();				\
+	strncpy(strnalloc_tmp, (s), (n));		\
+	strnalloc_tmp[n] = 0;				\
+	strnalloc_tmp; })
+
 const char *unique(const char *s);
 
 #endif /* !UTIL_H */




More information about the commitlog mailing list