r5392 - trunk/eda/fped
werner at docs.openmoko.org
werner at docs.openmoko.org
Thu Aug 6 06:56:50 CEST 2009
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;
};
More information about the commitlog
mailing list