1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-11-16 20:07:31 +02:00

b2/: add "ignore" keyword for substitution rules

This allows us to decide in the project-specific rules how to indicate
DNP/NC/DNS/... parts. In the original BOOM, F1 == NC was hard-coded.
This commit is contained in:
Werner Almesberger 2012-05-21 23:17:33 -03:00
parent 2014e6053e
commit d2171eba47
7 changed files with 40 additions and 16 deletions

View File

@ -1,10 +1,12 @@
FN=DNP { ignore }
REF=R[0-9]* { REF=R[0-9]* {
T=R T=R
VAL=(#R) { R=$1 } VAL=(#R) { R=$1 }
TOL <= 5% TOL <= 5%
FN=*% { TOL<=$$ } FN=*% { TOL<=$$ }
break REF break REF
// end break again // end break again ignore
} }
/* /*

View File

@ -48,7 +48,10 @@ static void do_substitutions(void)
const struct param *var; const struct param *var;
const struct part **parts, **p; const struct part **parts, **p;
out = substitute(substitutions, vars); if (!substitute(substitutions, vars, &out)) {
fprintf(stderr, "ignore\n");
return;
}
if (select_parts) { if (select_parts) {
parts = select_parametric(out, &hierarchy); parts = select_parametric(out, &hierarchy);
if (!parts) { if (!parts) {

View File

@ -613,9 +613,12 @@ block:
} }
| WORD | WORD
{ {
if (strcmp($1, "end")) if (!strcmp($1, "end"))
$$ = subst_end();
else if (!strcmp($1, "ignore"))
$$ = subst_ignore();
else
yyerrorf("unknown keyword \"%s\"", $1); yyerrorf("unknown keyword \"%s\"", $1);
$$ = subst_end();
} }
; ;

View File

@ -30,9 +30,9 @@
static const char *fn = NULL, *f[FIELDS]; static const char *fn = NULL, *f[FIELDS];
/* Jump target that can never be reached. */ /* Jump targets that can never be reached. */
static struct subst jump_end; static struct subst jump_end;
static struct subst jump_ignore;
static char *canonicalize(const char *s, char unit) static char *canonicalize(const char *s, char unit)
@ -206,6 +206,8 @@ static const struct subst *recurse_sub(const struct subst *sub,
break; break;
case st_end: case st_end:
return &jump_end; return &jump_end;
case st_ignore:
return &jump_ignore;
case st_break: case st_break:
sub = sub->u.jump->next; sub = sub->u.jump->next;
continue; continue;
@ -221,9 +223,9 @@ static const struct subst *recurse_sub(const struct subst *sub,
} }
struct param *substitute(const struct subst *sub, const struct param *in) int substitute(const struct subst *sub, const struct param *in,
struct param **out)
{ {
struct param *out = NULL;
int i; int i;
char tmp[4]; char tmp[4];
@ -234,6 +236,6 @@ struct param *substitute(const struct subst *sub, const struct param *in)
f[i] = unique(tmp); f[i] = unique(tmp);
} }
} }
recurse_sub(sub, in, NULL, NULL, NULL, &out); *out = NULL;
return out; return recurse_sub(sub, in, NULL, NULL, NULL, out) != &jump_ignore;
} }

View File

@ -17,6 +17,7 @@
#include "subst.h" #include "subst.h"
struct param *substitute(const struct subst *sub, const struct param *in); int substitute(const struct subst *sub, const struct param *in,
struct param **out);
#endif /* !SUBEX_H */ #endif /* !SUBEX_H */

View File

@ -245,6 +245,12 @@ struct subst *subst_end(void)
} }
struct subst *subst_ignore(void)
{
return alloc_subst(st_ignore);
}
struct subst *subst_break(const char *block) struct subst *subst_break(const char *block)
{ {
struct subst *sub; struct subst *sub;
@ -357,6 +363,8 @@ static void recurse_fin(struct subst *sub, const struct parent *parent)
break; break;
case st_end: case st_end:
break; break;
case st_ignore:
break;
case st_break: case st_break:
case st_again: case st_again:
sub->u.jump = resolve_jump(sub->u.tmp, parent); sub->u.jump = resolve_jump(sub->u.tmp, parent);
@ -425,6 +433,9 @@ static void recurse_dump(FILE *file, const struct subst *sub, int level)
case st_end: case st_end:
fprintf(file, "end\n"); fprintf(file, "end\n");
break; break;
case st_ignore:
fprintf(file, "ignore\n");
break;
case st_break: case st_break:
fprintf(file, "break %s\n", sub->u.jump->u.match.src); fprintf(file, "break %s\n", sub->u.jump->u.match.src);
break; break;

View File

@ -37,11 +37,12 @@ struct chunk {
}; };
enum subst_type { enum subst_type {
st_match, st_match, /* try to match a variable */
st_assign, st_assign, /* assign to a variable */
st_end, st_end, /* end the substitutions, accepting the part */
st_break, st_ignore, /* ignore the part */
st_again, st_break, /* jump to an outer block */
st_again, /* repeat an outer block */
}; };
struct subst { struct subst {
@ -73,6 +74,7 @@ struct subst {
struct subst *subst_match(const char *src, const char *re); struct subst *subst_match(const char *src, const char *re);
struct subst *subst_assign(const char *dst, enum relop op, const char *pat); struct subst *subst_assign(const char *dst, enum relop op, const char *pat);
struct subst *subst_end(void); struct subst *subst_end(void);
struct subst *subst_ignore(void);
struct subst *subst_break(const char *block); struct subst *subst_break(const char *block);
struct subst *subst_again(const char *block); struct subst *subst_again(const char *block);