20#include <footag/footag.h>
26 #define UNUSED(i) (void) (sizeof (i))
30 #define NELEM(a) ((sizeof a) / (sizeof (a[0])))
55 .type = FOOTAG_DATA_NONE, \
58#define ITEM_BOOL(_val) { \
59 .type = FOOTAG_DATA_BOOL, \
65#define ITEM_INTEGER(_val, _step, _min, _max) { \
66 .type = FOOTAG_DATA_INTEGER, \
77#define ITEM_FLOAT(_val) { \
78 .type = FOOTAG_DATA_FLOAT, \
84#define ITEM_LENGTH(_val) { \
85 .type = FOOTAG_DATA_LENGTH, \
92#define ITEM_TOL_PM(_nom, _pm) { \
93 .type = FOOTAG_DATA_TOL, \
97 .min = (_nom - _pm), \
98 .max = (_nom + _pm), \
104#define ITEM_TOL_MM(_min, _max) { \
105 .type = FOOTAG_DATA_TOL, \
108 .nom = ((_min + _max) / 2.0), \
115#define ITEM_TOL_DATA(a, b) { \
116 .nom = (a) <= (b) ? ((a + b) / 2.0) : (a), \
117 .min = (a) <= (b) ? (a) : (a - b), \
118 .max = (a) <= (b) ? (b) : (a + b), \
121#define ITEM_TOL(_a, _b) { \
122 .type = FOOTAG_DATA_TOL, \
124 .t = ITEM_TOL_DATA(_a, _b), \
128#define ITEM_ENUM(_val, _num, ...) { \
129 .type = FOOTAG_DATA_ENUM, \
134 .strs = (const char *const []) { __VA_ARGS__ }, \
139#define ITEM_BITMASK(_val, _num, ...) { \
140 .type = FOOTAG_DATA_BITMASK, \
145 .strs = (const char *const []) { __VA_ARGS__ }, \
150#define PARAM_HEADER(_id, _name, _abbr) \
151 .id = PARAM_ ## _id, \
155#define PARAM_TERM { \
156 PARAM_HEADER(DONE, "done", "done"), \
160#define PARAM_TOPIC(_name) { \
167#define PARAM_B(_id, _name, _abbr, _val) { \
168 PARAM_HEADER(_id, _name, _abbr), \
169 .item = ITEM_BOOL(_val), \
172#define PARAM_I(_id, _name, _abbr, _val, _step, _min, _max) { \
173 PARAM_HEADER(_id, _name, _abbr), \
174 .item = ITEM_INTEGER(_val, _step, _min, _max), \
177#define PARAM_F(_id, _name, _abbr, _val) { \
178 PARAM_HEADER(_id, _name, _abbr), \
179 .item = ITEM_FLOAT(_val), \
182#define PARAM_L(_id, _name, _abbr, _val) { \
183 PARAM_HEADER(_id, _name, _abbr), \
184 .item = ITEM_LENGTH(_val), \
187#define PARAM_TPM(_id, _name, _abbr, _nom, _pm) { \
188 PARAM_HEADER(_id, _name, _abbr), \
189 .item = ITEM_TOL_PM(_nom, _pm), \
192#define PARAM_TMM(_id, _name, _abbr, _min, _max) { \
193 PARAM_HEADER(_id, _name, _abbr), \
194 .item = ITEM_TOL_MM(_min, _max), \
202#define PARAM_T(_id, _name, _abbr, _a, _b) { \
203 PARAM_HEADER(_id, _name, _abbr), \
204 .item = ITEM_TOL(_a, _b), \
207#define PARAM_E(_id, _name, _abbr, _val, _num, ...) { \
208 PARAM_HEADER(_id, _name, _abbr), \
209 .item = ITEM_ENUM(_val, _num, __VA_ARGS__), \
212#define PARAM_M(_id, _name, _abbr, _val, _num, ...) { \
213 PARAM_HEADER(_id, _name, _abbr), \
214 .item = ITEM_BITMASK(_val, _num, __VA_ARGS__), \
217#define PARAM_CALC_IPC7351B \
218 PARAM_TOPIC("Calc"), \
219 PARAM_E(CALC_D, "Density", "-", FOOTAG_LEVEL_N, FOOTAG_LEVEL_NUM, \
220 "Most", "Nominal", "Least" \
222 PARAM_L(CALC_F, "Fabrication", "-", 0.10), \
223 PARAM_L(CALC_P, "Placement", "-", 0.10), \
224 PARAM_TOPIC("Generate"), \
225 PARAM_E(CALC_ROUND, "Round-off", "-", 3, 4, \
226 "None", "0.01 mm", "0.02 mm", "0.05 mm" \
229#define PARAM_CALC_IPC7351B_HIRES \
230 PARAM_TOPIC("Calc"), \
231 PARAM_E(CALC_D, "Density", "-", FOOTAG_LEVEL_N, FOOTAG_LEVEL_NUM, \
232 "Most", "Nominal", "Least" \
234 PARAM_L(CALC_F, "Fabrication", "-", 0.05), \
235 PARAM_L(CALC_P, "Placement", "-", 0.05), \
236 PARAM_TOPIC("Generate"), \
237 PARAM_E(CALC_ROUND, "Round-off", "-", 1, 4, \
238 "None", "0.01 mm", "0.02 mm", "0.05 mm" \
241#define PARAM_CALC_IPC7251DRAFT1 \
242 PARAM_TOPIC("Calc"), \
243 PARAM_E(CALC_D, "Level", "-", FOOTAG_LEVEL_N, FOOTAG_LEVEL_NUM, \
244 "A (Maximum)", "B (Nominal)", "C (Least)" \
246 PARAM_TOPIC("Generate"), \
247 PARAM_E(CALC_ROUND, "Round-off", "-", 3, 4, \
248 "None", "0.01 mm", "0.02 mm", "0.05 mm" \
251#define PARAM_PADSTACK_SMD_RECTS \
252 PARAM_E(CALC_STACK, "Padstack", "-", 1, 2, \
253 "Rectangular", "Rounded rectangular" \
256int footag_init_from_template(
261int footag_init_default(
265int footag_init_twopin(
269int footag_fini_default(
284#define GETID(_ctx, _id) footag_data_by_id(_ctx, PARAM_ ## _id)
287 PARAM_DONE = FOOTAG_PARAM_DONE,
288 PARAM_IGNORE = FOOTAG_PARAM_IGNORE,
289 PARAM_TOPIC = FOOTAG_PARAM_TOPIC,
327static inline int footag_get_density(
337static const double ROUNDOFF_TO_GRID[4] = {
345static inline double snap(
double v,
double grid)
347 if (!grid) {
return v; }
348 return round(v / grid) * grid;
362void footag_setcourtyard(
367static inline double footag_padypos(
double pitch,
int rows,
int row)
370 y = - 1 * ((rows / 2.0) - 1.0 / 2);
376void footag_gridnames(
392 double addx,
double addy,
401void footag_gentworow(
407 enum footag_padstack stack
413 double wrow,
double hrow,
415 double wcol,
double hcol,
418 enum footag_padstack stack
426 int prows,
int pcols,
427 enum footag_padstack stack
436 enum footag_padstack stack
445 enum footag_padstack stack
448void footag_gentwopin(
452 enum footag_padstack stack
455void footag_ipc7351b_setrrectpad(
459void footag_ipc7351b_setrrectpads(
463int footag_realloc_pads(
468static inline int intmin(
int a,
int b) {
return a < b ? a : b; }
469static inline int intmax(
int a,
int b) {
return a < b ? b : a; }
484const char *footag_hint_ipc7251draft1(
490void footag_setref_ipc7351b(
496void footag_setref_ipc7251draft1(
Definition ipc7251draft1.h:52
Definition ipc7351b.h:111