mirror of
git://projects.qi-hardware.com/fped.git
synced 2024-11-22 08:09:42 +02:00
add %iprint, to track variables during instantiation
This commit is contained in:
parent
91154440a3
commit
3c39600c1c
11
README
11
README
@ -684,6 +684,7 @@ most of which mimick the effect of GUI operations:
|
|||||||
%move <identifier> [<number>] <identifier>
|
%move <identifier> [<number>] <identifier>
|
||||||
%frame <identifier> <qualified-base>
|
%frame <identifier> <qualified-base>
|
||||||
%print <expression>
|
%print <expression>
|
||||||
|
%iprint <expression>
|
||||||
%meas <identifier>
|
%meas <identifier>
|
||||||
%dump
|
%dump
|
||||||
%exit
|
%exit
|
||||||
@ -715,7 +716,15 @@ parent frame's origin can be references as "@".
|
|||||||
%dump writes the footprint definition in the fped language to standard
|
%dump writes the footprint definition in the fped language to standard
|
||||||
output. %exit immediately exits fped, without invoking the GUI.
|
output. %exit immediately exits fped, without invoking the GUI.
|
||||||
|
|
||||||
%print evaluates the expression and prints the result to standard output.
|
%print and %iprint evaluate the expression and print the result to
|
||||||
|
standard output. The difference between them is that %print runs only
|
||||||
|
once and without explicit instantiation, while %iprint is treated as
|
||||||
|
a regular object and is executed as many times as instantiation
|
||||||
|
demands.
|
||||||
|
|
||||||
|
For example, after loop x = 1, 3 we would obtain just 1 with %print
|
||||||
|
while %iprint would display, 1, 2, and 3.
|
||||||
|
|
||||||
%meas performs an instantiation and prints the value of the labeled
|
%meas performs an instantiation and prints the value of the labeled
|
||||||
measurement.
|
measurement.
|
||||||
|
|
||||||
|
9
delete.c
9
delete.c
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* delete.c - Object deletion
|
* delete.c - Object deletion
|
||||||
*
|
*
|
||||||
* Written 2009, 2010 by Werner Almesberger
|
* Written 2009, 2010, 2012 by Werner Almesberger
|
||||||
* Copyright 2009, 2010 by Werner Almesberger
|
* Copyright 2009, 2010, 2012 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -143,6 +143,8 @@ static int obj_has_ref(const struct obj *obj, const struct vec *ref)
|
|||||||
return obj->u.arc.start == ref || obj->u.arc.end == ref;
|
return obj->u.arc.start == ref || obj->u.arc.end == ref;
|
||||||
case ot_meas:
|
case ot_meas:
|
||||||
return obj->u.meas.high == ref;
|
return obj->u.meas.high == ref;
|
||||||
|
case ot_iprint:
|
||||||
|
return 0;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
@ -238,6 +240,9 @@ static void destroy_obj(struct obj *obj)
|
|||||||
if (obj->u.meas.offset)
|
if (obj->u.meas.offset)
|
||||||
free_expr(obj->u.meas.offset);
|
free_expr(obj->u.meas.offset);
|
||||||
break;
|
break;
|
||||||
|
case ot_iprint:
|
||||||
|
free_expr(obj->u.iprint.expr);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
6
fpd.h
6
fpd.h
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* fpd.c - Things fpd.l and fpd.y export
|
* fpd.c - Things fpd.l and fpd.y export
|
||||||
*
|
*
|
||||||
* Written 2009 by Werner Almesberger
|
* Written 2009, 2012 by Werner Almesberger
|
||||||
* Copyright 2009 by Werner Almesberger
|
* Copyright 2009, 2012 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -23,6 +23,8 @@ extern const char *var_id;
|
|||||||
extern struct value *var_value_list;
|
extern struct value *var_value_list;
|
||||||
|
|
||||||
|
|
||||||
|
int dbg_print(const struct expr *expr, const struct frame *frame);
|
||||||
|
|
||||||
void scan_empty(void);
|
void scan_empty(void);
|
||||||
void scan_expr(const char *s);
|
void scan_expr(const char *s);
|
||||||
void scan_var(const char *s);
|
void scan_var(const char *s);
|
||||||
|
2
fpd.l
2
fpd.l
@ -136,6 +136,8 @@ SP [\t ]*
|
|||||||
return TOK_DBG_FRAME; }
|
return TOK_DBG_FRAME; }
|
||||||
<INITIAL>"%print" { BEGIN(NOKEYWORD);
|
<INITIAL>"%print" { BEGIN(NOKEYWORD);
|
||||||
return TOK_DBG_PRINT; }
|
return TOK_DBG_PRINT; }
|
||||||
|
<INITIAL>"%iprint" { BEGIN(NOKEYWORD);
|
||||||
|
return TOK_DBG_IPRINT; }
|
||||||
<INITIAL>"%meas" { BEGIN(NOKEYWORD);
|
<INITIAL>"%meas" { BEGIN(NOKEYWORD);
|
||||||
return TOK_DBG_MEAS; }
|
return TOK_DBG_MEAS; }
|
||||||
<INITIAL>"%dump" { BEGIN(NOKEYWORD);
|
<INITIAL>"%dump" { BEGIN(NOKEYWORD);
|
||||||
|
17
fpd.y
17
fpd.y
@ -365,17 +365,17 @@ static int dbg_link_frame(const char *frame_name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int dbg_print(const struct expr *expr)
|
int dbg_print(const struct expr *expr, const struct frame *frame)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
struct num num;
|
struct num num;
|
||||||
|
|
||||||
s = eval_str(expr, curr_frame);
|
s = eval_str(expr, frame);
|
||||||
if (s) {
|
if (s) {
|
||||||
printf("%s\n", s);
|
printf("%s\n", s);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
num = eval_num(expr, curr_frame);
|
num = eval_num(expr, frame);
|
||||||
if (is_undef(num))
|
if (is_undef(num))
|
||||||
return 0;
|
return 0;
|
||||||
printf("%lg%s\n", num.n, str_unit(num));
|
printf("%lg%s\n", num.n, str_unit(num));
|
||||||
@ -457,7 +457,8 @@ static int dbg_meas(const char *name)
|
|||||||
%token TOK_PAD TOK_RPAD TOK_HOLE TOK_RECT TOK_LINE TOK_CIRC TOK_ARC
|
%token TOK_PAD TOK_RPAD TOK_HOLE TOK_RECT TOK_LINE TOK_CIRC TOK_ARC
|
||||||
%token TOK_MEAS TOK_MEASX TOK_MEASY TOK_UNIT
|
%token TOK_MEAS TOK_MEASX TOK_MEASY TOK_UNIT
|
||||||
%token TOK_NEXT TOK_NEXT_INVERTED TOK_MAX TOK_MAX_INVERTED
|
%token TOK_NEXT TOK_NEXT_INVERTED TOK_MAX TOK_MAX_INVERTED
|
||||||
%token TOK_DBG_DEL TOK_DBG_MOVE TOK_DBG_FRAME TOK_DBG_PRINT
|
%token TOK_DBG_DEL TOK_DBG_MOVE TOK_DBG_FRAME
|
||||||
|
%token TOK_DBG_PRINT TOK_DBG_IPRINT
|
||||||
%token TOK_DBG_DUMP TOK_DBG_EXIT TOK_DBG_TSORT TOK_DBG_MEAS
|
%token TOK_DBG_DUMP TOK_DBG_EXIT TOK_DBG_TSORT TOK_DBG_MEAS
|
||||||
%token TOK_ALLOW_OVERLAP TOK_ALLOW_TOUCH
|
%token TOK_ALLOW_OVERLAP TOK_ALLOW_TOUCH
|
||||||
|
|
||||||
@ -666,7 +667,7 @@ debug_item:
|
|||||||
}
|
}
|
||||||
| TOK_DBG_PRINT expr
|
| TOK_DBG_PRINT expr
|
||||||
{
|
{
|
||||||
if (!dbg_print($2))
|
if (!dbg_print($2, curr_frame))
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
| TOK_DBG_MEAS ID
|
| TOK_DBG_MEAS ID
|
||||||
@ -976,6 +977,12 @@ obj:
|
|||||||
$$->u.frame.ref->active_ref = $$;
|
$$->u.frame.ref->active_ref = $$;
|
||||||
$$->u.frame.lineno = $<num>3.n;
|
$$->u.frame.lineno = $<num>3.n;
|
||||||
}
|
}
|
||||||
|
| TOK_DBG_IPRINT expr
|
||||||
|
{
|
||||||
|
$$ = new_obj(ot_iprint);
|
||||||
|
$$->base = NULL;
|
||||||
|
$$->u.iprint.expr = $2;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
pad_type:
|
pad_type:
|
||||||
|
4
obj.c
4
obj.c
@ -25,6 +25,7 @@
|
|||||||
#include "overlap.h"
|
#include "overlap.h"
|
||||||
#include "layer.h"
|
#include "layer.h"
|
||||||
#include "delete.h"
|
#include "delete.h"
|
||||||
|
#include "fpd.h"
|
||||||
#include "obj.h"
|
#include "obj.h"
|
||||||
|
|
||||||
|
|
||||||
@ -316,6 +317,9 @@ static int generate_objs(struct frame *frame, struct coord base_pos,
|
|||||||
goto error;
|
goto error;
|
||||||
inst_meas_hint(obj, offset.n);
|
inst_meas_hint(obj, offset.n);
|
||||||
break;
|
break;
|
||||||
|
case ot_iprint:
|
||||||
|
dbg_print(obj->u.iprint.expr, frame);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
10
obj.h
10
obj.h
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* obj.h - Object definition model
|
* obj.h - Object definition model
|
||||||
*
|
*
|
||||||
* Written 2009-2011 by Werner Almesberger
|
* Written 2009-2012 by Werner Almesberger
|
||||||
* Copyright 2009-2011 by Werner Almesberger
|
* Copyright 2009-2012 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -186,6 +186,7 @@ enum obj_type {
|
|||||||
ot_line,
|
ot_line,
|
||||||
ot_arc,
|
ot_arc,
|
||||||
ot_meas,
|
ot_meas,
|
||||||
|
ot_iprint,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct frame_ref {
|
struct frame_ref {
|
||||||
@ -215,6 +216,10 @@ struct arc {
|
|||||||
struct expr *width;
|
struct expr *width;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct iprint {
|
||||||
|
struct expr *expr;
|
||||||
|
};
|
||||||
|
|
||||||
struct obj {
|
struct obj {
|
||||||
enum obj_type type;
|
enum obj_type type;
|
||||||
const char *name; /* NULL if anonymous */
|
const char *name; /* NULL if anonymous */
|
||||||
@ -226,6 +231,7 @@ struct obj {
|
|||||||
struct hole hole;
|
struct hole hole;
|
||||||
struct arc arc;
|
struct arc arc;
|
||||||
struct meas meas;
|
struct meas meas;
|
||||||
|
struct iprint iprint;
|
||||||
} u;
|
} u;
|
||||||
struct frame *frame;
|
struct frame *frame;
|
||||||
struct vec *base;
|
struct vec *base;
|
||||||
|
101
test/iprint
Executable file
101
test/iprint
Executable file
@ -0,0 +1,101 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
. ./Common
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
fped "iprint: loop" <<EOF
|
||||||
|
loop x = 1, 3
|
||||||
|
%iprint x
|
||||||
|
EOF
|
||||||
|
expect <<EOF
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fped "iprint: two tables (independent)" <<EOF
|
||||||
|
table { a } { 1 } { 2 }
|
||||||
|
table { b } { 3 } { 4 }
|
||||||
|
|
||||||
|
%iprint a*10+b
|
||||||
|
EOF
|
||||||
|
expect <<EOF
|
||||||
|
13
|
||||||
|
14
|
||||||
|
23
|
||||||
|
24
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fped "iprint: two tables (2nd references 1st)" <<EOF
|
||||||
|
table { a } { 1 } { 2 }
|
||||||
|
table { b } { 3+a } { 4+a }
|
||||||
|
|
||||||
|
%iprint a*10+b
|
||||||
|
EOF
|
||||||
|
expect <<EOF
|
||||||
|
14
|
||||||
|
15
|
||||||
|
25
|
||||||
|
26
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fped "iprint: two tables (1st references 2nd)" <<EOF
|
||||||
|
table { a } { 1+b } { 2+b }
|
||||||
|
table { b } { 3 } { 4 }
|
||||||
|
|
||||||
|
%iprint a*10+b
|
||||||
|
EOF
|
||||||
|
expect <<EOF
|
||||||
|
43
|
||||||
|
54
|
||||||
|
53
|
||||||
|
64
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fped "iprint: inside frame (global variable)" <<EOF
|
||||||
|
frame foo {
|
||||||
|
%iprint n
|
||||||
|
}
|
||||||
|
|
||||||
|
loop n = 1, 2
|
||||||
|
frame foo @
|
||||||
|
EOF
|
||||||
|
expect <<EOF
|
||||||
|
1
|
||||||
|
2
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fped "iprint: inside frame (local variable) " <<EOF
|
||||||
|
frame foo {
|
||||||
|
set n1 = n+1
|
||||||
|
%iprint n1
|
||||||
|
}
|
||||||
|
|
||||||
|
loop n = 1, 2
|
||||||
|
frame foo @
|
||||||
|
EOF
|
||||||
|
expect <<EOF
|
||||||
|
2
|
||||||
|
3
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fped_fail "iprint: undefined variable" <<EOF
|
||||||
|
%iprint foo
|
||||||
|
EOF
|
||||||
|
expect <<EOF
|
||||||
|
undefined variable "foo"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
###############################################################################
|
Loading…
Reference in New Issue
Block a user