1
0
mirror of git://projects.qi-hardware.com/fped.git synced 2024-11-26 05:19:41 +02:00

- added pad type (for non-solder and solder-paste-only pads) to FPD language

(GUI is still missing)



git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5554 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
werner 2009-08-27 09:45:57 +00:00
parent c37648e2a5
commit 8d94993c45
6 changed files with 88 additions and 12 deletions

14
README
View File

@ -208,7 +208,7 @@ Pads
Pads are similar to rectangles, but they also have a name. Pads are similar to rectangles, but they also have a name.
pad "<name>" <point-a> <point-b> pad "<name>" <point-a> <point-b> [<type>]
Variables can be expanded in a pad's name by prefixing their name with Variables can be expanded in a pad's name by prefixing their name with
a dollar sign. The ${name} syntax is also available. a dollar sign. The ${name} syntax is also available.
@ -218,6 +218,16 @@ Example:
vec @(1mm, 1mm) vec @(1mm, 1mm)
pad "1" @ . pad "1" @ .
Pads normally affect the surface copper layer, the solder mask layer,
and the solder paste layer. This can be modified with the optional
type argument:
Type Layers
--------- -------------------------------------
(default) copper, solder mask, and solder paste
bare copper and solder mask
paste solder paste
Rounded pads Rounded pads
- - - - - - - - - - - -
@ -226,7 +236,7 @@ Rounded pads are like rectangular pads except that they end with a
semi-circle at each of the smaller sides of the enclosing rectangle. semi-circle at each of the smaller sides of the enclosing rectangle.
If enclosed in a square, rounded pads form a circle. If enclosed in a square, rounded pads form a circle.
rpad "<name>" <point-a> <point-b> rpad "<name>" <point-a> <point-b> [<type>]
Measurements Measurements

18
dump.c
View File

@ -318,8 +318,22 @@ char *print_obj(const struct obj *obj, const struct vec *prev)
break; break;
case ot_pad: case ot_pad:
s1 = obj_base_name(obj->u.pad.other, prev); s1 = obj_base_name(obj->u.pad.other, prev);
s = stralloc_printf("%spad \"%s\" %s %s", switch (obj->u.pad.type) {
obj->u.pad.rounded ? "r" : "", obj->u.pad.name, base, s1); case pt_normal:
s2 = "";
break;
case pt_bare:
s2 = " bare";
break;
case pt_paste:
s2 = " paste";
break;
default:
abort();
}
s = stralloc_printf("%spad \"%s\" %s %s%s",
obj->u.pad.rounded ? "r" : "",
obj->u.pad.name, base, s1, s2);
free(s1); free(s1);
break; break;
case ot_arc: case ot_arc:

21
fpd.y
View File

@ -13,6 +13,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "util.h" #include "util.h"
#include "error.h" #include "error.h"
@ -146,6 +147,7 @@ static struct obj *new_obj(enum obj_type type)
struct value *value; struct value *value;
struct vec *vec; struct vec *vec;
struct obj *obj; struct obj *obj;
enum pad_type pt;
enum meas_type mt; enum meas_type mt;
struct { struct {
int inverted; int inverted;
@ -172,6 +174,7 @@ static struct obj *new_obj(enum obj_type type)
%type <obj> obj meas %type <obj> obj meas
%type <expr> expr opt_expr add_expr mult_expr unary_expr primary_expr %type <expr> expr opt_expr add_expr mult_expr unary_expr primary_expr
%type <str> opt_string %type <str> opt_string
%type <pt> pad_type
%type <mt> meas_type %type <mt> meas_type
%type <mo> meas_op %type <mo> meas_op
@ -441,21 +444,23 @@ base:
; ;
obj: obj:
TOK_PAD STRING base base TOK_PAD STRING base base pad_type
{ {
$$ = new_obj(ot_pad); $$ = new_obj(ot_pad);
$$->base = $3; $$->base = $3;
$$->u.pad.name = $2; $$->u.pad.name = $2;
$$->u.pad.other = $4; $$->u.pad.other = $4;
$$->u.pad.rounded = 0; $$->u.pad.rounded = 0;
$$->u.pad.type = $5;
} }
| TOK_RPAD STRING base base | TOK_RPAD STRING base base pad_type
{ {
$$ = new_obj(ot_pad); $$ = new_obj(ot_pad);
$$->base = $3; $$->base = $3;
$$->u.pad.name = $2; $$->u.pad.name = $2;
$$->u.pad.other = $4; $$->u.pad.other = $4;
$$->u.pad.rounded = 1; $$->u.pad.rounded = 1;
$$->u.pad.type = $5;
} }
| TOK_RECT base base opt_expr | TOK_RECT base base opt_expr
{ {
@ -506,6 +511,18 @@ obj:
} }
; ;
pad_type:
ID
{
if (!strcmp($1, "bare"))
$$ = pt_bare;
else if (!strcmp($1, "paste"))
$$ = pt_paste;
else
$$ = pt_normal;
}
;
measurements: measurements:
| measurements meas | measurements meas
{ {

20
kicad.c
View File

@ -56,6 +56,7 @@ static void kicad_pad(FILE *file, const struct inst *inst)
{ {
struct coord min, max; struct coord min, max;
unit_type tmp; unit_type tmp;
int layers;
min.x = units_to_kicad(inst->base.x); min.x = units_to_kicad(inst->base.x);
min.y = units_to_kicad(inst->base.y); min.y = units_to_kicad(inst->base.y);
@ -85,10 +86,21 @@ static void kicad_pad(FILE *file, const struct inst *inst)
/* /*
* Attributes: pad type, N, layer mask * Attributes: pad type, N, layer mask
*/ */
fprintf(file, "At SMD N %8.8X\n", layers = 0;
(1 << layer_top) | switch (inst->obj->u.pad.type) {
(1 << layer_paste_top) | case pt_normal:
(1 << layer_mask_top)); layers = 1 << layer_paste_top;
/* fall through */
case pt_bare:
layers |= (1 << layer_top) | (1 << layer_mask_top);
break;
case pt_paste:
layers = 1 << layer_paste_top;
break;
default:
abort();
}
fprintf(file, "At SMD N %8.8X\n", layers);
/* /*
* Position: Xpos, Ypos * Position: Xpos, Ypos

7
obj.h
View File

@ -139,6 +139,12 @@ enum obj_type {
ot_meas, ot_meas,
}; };
enum pad_type {
pt_normal, /* copper and solder mask */
pt_bare, /* only copper (and finish) */
pt_paste, /* only solder paste */
};
struct frame_ref { struct frame_ref {
struct frame *ref; struct frame *ref;
int lineno; int lineno;
@ -153,6 +159,7 @@ struct pad {
char *name; char *name;
struct vec *other; /* NULL if frame origin */ struct vec *other; /* NULL if frame origin */
int rounded; int rounded;
enum pad_type type;
}; };
struct arc { struct arc {

View File

@ -172,6 +172,20 @@ static void ps_pad_name(FILE *file, const struct inst *inst)
inst->u.pad.name, PS_FONT_OUTLINE); inst->u.pad.name, PS_FONT_OUTLINE);
} }
static const char *hatch(enum pad_type type)
{
switch (type) {
case pt_normal:
return "crosspath";
case pt_bare:
return "hatchpath";
case pt_paste:
return "backhatchpath";
default:
abort();
}
}
static void ps_pad(FILE *file, const struct inst *inst, int show_name) static void ps_pad(FILE *file, const struct inst *inst, int show_name)
{ {
@ -183,7 +197,8 @@ static void ps_pad(FILE *file, const struct inst *inst, int show_name)
fprintf(file, " %d %d lineto\n", b.x, a.y); fprintf(file, " %d %d lineto\n", b.x, a.y);
fprintf(file, " %d %d lineto\n", b.x, b.y); fprintf(file, " %d %d lineto\n", b.x, b.y);
fprintf(file, " %d %d lineto\n", a.x, b.y); fprintf(file, " %d %d lineto\n", a.x, b.y);
fprintf(file, " closepath gsave crosspath grestore stroke\n"); fprintf(file, " closepath gsave %s grestore stroke\n",
hatch(inst->obj->u.pad.type));
if (show_name) if (show_name)
ps_pad_name(file, inst); ps_pad_name(file, inst);
@ -213,7 +228,8 @@ static void ps_rpad(FILE *file, const struct inst *inst, int show_name)
fprintf(file, " %d %d lineto\n", a.x+r, b.y); fprintf(file, " %d %d lineto\n", a.x+r, b.y);
fprintf(file, " %d %d %d 90 270 arc\n", a.x+r, a.y+r, r); fprintf(file, " %d %d %d 90 270 arc\n", a.x+r, a.y+r, r);
} }
fprintf(file, " closepath gsave hatchpath grestore stroke\n"); fprintf(file, " closepath gsave %s grestore stroke\n",
hatch(inst->obj->u.pad.type));
if (show_name) if (show_name)
ps_pad_name(file, inst); ps_pad_name(file, inst);