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