+ public typedef struct {
+ real x; /* center of pin */
+ real y;
+ real drill; /* diameter of drill hole */
+
+ real ring; /* width of annular ring around hole */
+ real spacing; /* space between pin and other traces */
+ real soldermask; /* space between pin and solder mask */
+
+ string name; /* pin name */
+ string number; /* pin number */
+ string options; /* pin options */
+
+ /* normally computed, but can be provided */
+ real thickness; /* thickness of pin "line" */
+ real clearance; /* twice the spacing between pin and other traces */
+ real mask; /* thickness of pin and solder mask */
+ } pin_t;
+
+ pin_t fill_pin(pin_t pin) {
+
+ /* Fill in process rules if unset */
+ if (is_uninit(&pin.spacing))
+ pin.spacing = process_space;
+ if (is_uninit(&pin.ring))
+ pin.ring = process_ring;
+ if (is_uninit(&pin.soldermask))
+ pin.soldermask = process_soldermask;
+
+ if (is_uninit(&pin.number))
+ pin.number = pin.name;
+ if (is_uninit(&pin.options))
+ pin.options = pin_options;
+
+ if (is_uninit(&pin.thickness))
+ pin.thickness = pin.drill + pin.ring * 2;
+
+ if (is_uninit(&pin.mask))
+ pin.mask = pin.thickness + pin.soldermask * 2;
+
+ if (is_uninit(&pin.clearance))
+ pin.clearance = pin.spacing * 2;
+
+ return pin;
+ }
+
+ public void pin(pin_t pin)
+ {
+ pin = fill_pin(pin);
+
+ check("pin drill", process_drill, pin.drill, false);
+ check("pin ring", process_ring, (pin.thickness - pin.drill) / 2, true);
+ check("pin space", process_space, pin.clearance / 2, true);
+ if (String::index(pin.options, "via") < 0)
+ check("pin mask", process_soldermask, (pin.mask - pin.thickness) / 2, true);
+
+ fprintf(out, " Pin[");
+ fprintf(out, " %6d %6d",
+ mm2mils100(pin.x),
+ mm2mils100(pin.y));
+ fprintf(out, " %6d %6d %6d",
+ mm2mils100(pin.thickness),
+ mm2mils100(pin.clearance),
+ mm2mils100(pin.mask));
+ fprintf(out," %6d",
+ mm2mils100(pin.drill));
+ fprintf(out, " \"%s\" \"%s\" \"%s\"]\n",
+ pin.name, pin.number, pin.options);
+ }
+
+ public void pin_mm_space_mask_options(real x, real y,
+ real drill, real copper, real spacing, real soldermask,
+ string name, string number, string options)
+ {
+ pin ((pin_t) {
+ .x = x,
+ .y = y,
+ .drill = drill,
+ .ring = copper,
+ .spacing = spacing,
+ .soldermask = soldermask,
+ .name = name,
+ .number = number,
+ .options = options });
+ }
+
+ public void pin_mm_space_options(real x, real y, real drill, real copper, real spacing,