1 /* -*- tab-width: 4 -*-
2 *
3 * Electric(tm) VLSI Design System
4 *
5 * File: teccmosdodn.c
6 * dodcmosn technology description
7 * Generated automatically from a library
8 *
9 * Copyright (c) 2000 Static Free Software.
10 *
11 * Electric(tm) is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * Electric(tm) is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with Electric(tm); see the file COPYING. If not, write to
23 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
24 * Boston, Mass 02111-1307, USA.
25 *
26 * Static Free Software
27 * 4119 Alpine Road
28 * Portola Valley, California 94028
29 * info@staticfreesoft.com
30 */
31
32 #include "config.h"
33 #include "global.h"
34 #include "egraphics.h"
35 #include "tech.h"
36 #include "teccmosdodn.h"
37 #include "efunction.h"
38
39 static void dodcmosn_intshapenodepoly(NODEINST *ni, INTBIG box, POLYGON *poly, POLYLOOP *pl);
40
41 /******************** LAYERS ********************/
42
43 #define MAXLAYERS 22
44 #define LM 0 /* Metal_1 */
45 #define LM0 1 /* Metal_2 */
46 #define LV 2 /* Via */
47 #define LP 3 /* Passivation */
48 #define LT 4 /* Transistor */
49 #define LPM 5 /* Pseudo_Metal_1 */
50 #define LPM0 6 /* Pseudo_Metal_2 */
51 #define LPSA 7 /* Pseudo_S_Active */
52 #define LPF 8 /* Pad_Frame */
53 #define LP0 9 /* Poly1 */
54 #define LPI 10 /* P+Implant */
55 #define LNI 11 /* N+Implant */
56 #define LP1 12 /* PWell */
57 #define LN 13 /* NWell */
58 #define LC 14 /* Contact */
59 #define LPP 15 /* Pseudo_Poly1 */
60 #define LPA 16 /* Pseudo_Active */
61 #define LPPI 17 /* Pseudo_P+Implant */
62 #define LPNI 18 /* Pseudo_N+Implant */
63 #define LPP0 19 /* Pseudo_PWell */
64 #define LPN 20 /* Pseudo_NWell */
65 #define LA 21 /* Active */
66
67 static GRAPHICS dodcmosn_M_lay = {LAYERT1, COLORT1, SOLIDC, PATTERNED,
68 {0x2222, /* X X X X */
69 0x0000, /* */
70 0x8888, /* X X X X */
71 0x0000, /* */
72 0x2222, /* X X X X */
73 0x0000, /* */
74 0x8888, /* X X X X */
75 0x0000, /* */
76 0x2222, /* X X X X */
77 0x0000, /* */
78 0x8888, /* X X X X */
79 0x0000, /* */
80 0x2222, /* X X X X */
81 0x0000, /* */
82 0x8888, /* X X X X */
83 0x0000}, /* */
84 NOVARIABLE, 0};
85 static GRAPHICS dodcmosn_M0_lay = {LAYERT4, COLORT4, SOLIDC, PATTERNED,
86 {0x1010, /* X X */
87 0x2020, /* X X */
88 0x4040, /* X X */
89 0x8080, /* X X */
90 0x0101, /* X X */
91 0x0202, /* X X */
92 0x0404, /* X X */
93 0x0808, /* X X */
94 0x1010, /* X X */
95 0x2020, /* X X */
96 0x4040, /* X X */
97 0x8080, /* X X */
98 0x0101, /* X X */
99 0x0202, /* X X */
100 0x0404, /* X X */
101 0x0808}, /* X X */
102 NOVARIABLE, 0};
103 static GRAPHICS dodcmosn_V_lay = {LAYERO, WHITE, SOLIDC, PATTERNED,
104 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NOVARIABLE, 0};
105 static GRAPHICS dodcmosn_P_lay = {LAYERO, DGRAY, PATTERNED, PATTERNED,
106 {0x1c1c, /* XXX XXX */
107 0x3e3e, /* XXXXX XXXXX */
108 0x3636, /* XX XX XX XX */
109 0x3e3e, /* XXXXX XXXXX */
110 0x1c1c, /* XXX XXX */
111 0x0000, /* */
112 0x0000, /* */
113 0x0000, /* */
114 0x1c1c, /* XXX XXX */
115 0x3e3e, /* XXXXX XXXXX */
116 0x3636, /* XX XX XX XX */
117 0x3e3e, /* XXXXX XXXXX */
118 0x1c1c, /* XXX XXX */
119 0x0000, /* */
120 0x0000, /* */
121 0x0000}, /* */
122 NOVARIABLE, 0};
123 static GRAPHICS dodcmosn_T_lay = {LAYERO, ALLOFF, SOLIDC, PATTERNED,
124 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NOVARIABLE, 0};
125 static GRAPHICS dodcmosn_PM_lay = {LAYERT1, COLORT1, SOLIDC, PATTERNED,
126 {0x2222, /* X X X X */
127 0x0000, /* */
128 0x8888, /* X X X X */
129 0x0000, /* */
130 0x2222, /* X X X X */
131 0x0000, /* */
132 0x8888, /* X X X X */
133 0x0000, /* */
134 0x2222, /* X X X X */
135 0x0000, /* */
136 0x8888, /* X X X X */
137 0x0000, /* */
138 0x2222, /* X X X X */
139 0x0000, /* */
140 0x8888, /* X X X X */
141 0x0000}, /* */
142 NOVARIABLE, 0};
143 static GRAPHICS dodcmosn_PM0_lay = {LAYERT4, COLORT4, SOLIDC, PATTERNED,
144 {0x1010, /* X X */
145 0x2020, /* X X */
146 0x4040, /* X X */
147 0x8080, /* X X */
148 0x0101, /* X X */
149 0x0202, /* X X */
150 0x0404, /* X X */
151 0x0808, /* X X */
152 0x1010, /* X X */
153 0x2020, /* X X */
154 0x4040, /* X X */
155 0x8080, /* X X */
156 0x0101, /* X X */
157 0x0202, /* X X */
158 0x0404, /* X X */
159 0x0808}, /* X X */
160 NOVARIABLE, 0};
161 static GRAPHICS dodcmosn_PSA_lay = {LAYERT3, COLORT3, SOLIDC, PATTERNED,
162 {0x0000, /* */
163 0x0303, /* XX XX */
164 0x4848, /* X X X X */
165 0x0303, /* XX XX */
166 0x0000, /* */
167 0x3030, /* XX XX */
168 0x8484, /* X X X X */
169 0x3030, /* XX XX */
170 0x0000, /* */
171 0x0303, /* XX XX */
172 0x4848, /* X X X X */
173 0x0303, /* XX XX */
174 0x0000, /* */
175 0x3030, /* XX XX */
176 0x8484, /* X X X X */
177 0x3030}, /* XX XX */
178 NOVARIABLE, 0};
179 static GRAPHICS dodcmosn_PF_lay = {LAYERO, RED, SOLIDC, PATTERNED,
180 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NOVARIABLE, 0};
181 static GRAPHICS dodcmosn_P0_lay = {LAYERT2, COLORT2, SOLIDC, PATTERNED,
182 {0x0808, /* X X */
183 0x0404, /* X X */
184 0x0202, /* X X */
185 0x0101, /* X X */
186 0x8080, /* X X */
187 0x4040, /* X X */
188 0x2020, /* X X */
189 0x1010, /* X X */
190 0x0808, /* X X */
191 0x0404, /* X X */
192 0x0202, /* X X */
193 0x0101, /* X X */
194 0x8080, /* X X */
195 0x4040, /* X X */
196 0x2020, /* X X */
197 0x1010}, /* X X */
198 NOVARIABLE, 0};
199 static GRAPHICS dodcmosn_PI_lay = {LAYERO, YELLOW, PATTERNED, PATTERNED,
200 {0x1010, /* X X */
201 0x2020, /* X X */
202 0x4040, /* X X */
203 0x8080, /* X X */
204 0x0101, /* X X */
205 0x0202, /* X X */
206 0x0404, /* X X */
207 0x0808, /* X X */
208 0x1010, /* X X */
209 0x2020, /* X X */
210 0x4040, /* X X */
211 0x8080, /* X X */
212 0x0101, /* X X */
213 0x0202, /* X X */
214 0x0404, /* X X */
215 0x0808}, /* X X */
216 NOVARIABLE, 0};
217 static GRAPHICS dodcmosn_NI_lay = {LAYERO, PURPLE, PATTERNED, PATTERNED,
218 {0x1010, /* X X */
219 0x2020, /* X X */
220 0x4040, /* X X */
221 0x8080, /* X X */
222 0x0101, /* X X */
223 0x0202, /* X X */
224 0x0404, /* X X */
225 0x0808, /* X X */
226 0x1010, /* X X */
227 0x2020, /* X X */
228 0x4040, /* X X */
229 0x8080, /* X X */
230 0x0101, /* X X */
231 0x0202, /* X X */
232 0x0404, /* X X */
233 0x0808}, /* X X */
234 NOVARIABLE, 0};
235 static GRAPHICS dodcmosn_P1_lay = {LAYERO, YELLOW, SOLIDC, PATTERNED,
236 {0x1000, /* X */
237 0x0020, /* X */
238 0x0000, /* */
239 0x0000, /* */
240 0x0001, /* X */
241 0x0200, /* X */
242 0x0000, /* */
243 0x0000, /* */
244 0x1000, /* X */
245 0x0020, /* X */
246 0x0000, /* */
247 0x0000, /* */
248 0x0001, /* X */
249 0x0200, /* X */
250 0x0000, /* */
251 0x0000}, /* */
252 NOVARIABLE, 0};
253 static GRAPHICS dodcmosn_N_lay = {LAYERO, PURPLE, SOLIDC, PATTERNED,
254 {0x1000, /* X */
255 0x0020, /* X */
256 0x0000, /* */
257 0x0000, /* */
258 0x0001, /* X */
259 0x0200, /* X */
260 0x0000, /* */
261 0x0000, /* */
262 0x1000, /* X */
263 0x0020, /* X */
264 0x0000, /* */
265 0x0000, /* */
266 0x0001, /* X */
267 0x0200, /* X */
268 0x0000, /* */
269 0x0000}, /* */
270 NOVARIABLE, 0};
271 static GRAPHICS dodcmosn_C_lay = {LAYERO, BLACK, SOLIDC, PATTERNED,
272 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, NOVARIABLE, 0};
273 static GRAPHICS dodcmosn_PP_lay = {LAYERT2, COLORT2, SOLIDC, PATTERNED,
274 {0x0808, /* X X */
275 0x0404, /* X X */
276 0x0202, /* X X */
277 0x0101, /* X X */
278 0x8080, /* X X */
279 0x4040, /* X X */
280 0x2020, /* X X */
281 0x1010, /* X X */
282 0x0808, /* X X */
283 0x0404, /* X X */
284 0x0202, /* X X */
285 0x0101, /* X X */
286 0x8080, /* X X */
287 0x4040, /* X X */
288 0x2020, /* X X */
289 0x1010}, /* X X */
290 NOVARIABLE, 0};
291 static GRAPHICS dodcmosn_PA_lay = {LAYERT3, COLORT3, SOLIDC, PATTERNED,
292 {0x0000, /* */
293 0x0303, /* XX XX */
294 0x4848, /* X X X X */
295 0x0303, /* XX XX */
296 0x0000, /* */
297 0x3030, /* XX XX */
298 0x8484, /* X X X X */
299 0x3030, /* XX XX */
300 0x0000, /* */
301 0x0303, /* XX XX */
302 0x4848, /* X X X X */
303 0x0303, /* XX XX */
304 0x0000, /* */
305 0x3030, /* XX XX */
306 0x8484, /* X X X X */
307 0x3030}, /* XX XX */
308 NOVARIABLE, 0};
309 static GRAPHICS dodcmosn_PPI_lay = {LAYERO, YELLOW, PATTERNED, PATTERNED,
310 {0x1010, /* X X */
311 0x2020, /* X X */
312 0x4040, /* X X */
313 0x8080, /* X X */
314 0x0101, /* X X */
315 0x0202, /* X X */
316 0x0404, /* X X */
317 0x0808, /* X X */
318 0x1010, /* X X */
319 0x2020, /* X X */
320 0x4040, /* X X */
321 0x8080, /* X X */
322 0x0101, /* X X */
323 0x0202, /* X X */
324 0x0404, /* X X */
325 0x0808}, /* X X */
326 NOVARIABLE, 0};
327 static GRAPHICS dodcmosn_PNI_lay = {LAYERO, YELLOW, PATTERNED, PATTERNED,
328 {0x1010, /* X X */
329 0x2020, /* X X */
330 0x4040, /* X X */
331 0x8080, /* X X */
332 0x0101, /* X X */
333 0x0202, /* X X */
334 0x0404, /* X X */
335 0x0808, /* X X */
336 0x1010, /* X X */
337 0x2020, /* X X */
338 0x4040, /* X X */
339 0x8080, /* X X */
340 0x0101, /* X X */
341 0x0202, /* X X */
342 0x0404, /* X X */
343 0x0808}, /* X X */
344 NOVARIABLE, 0};
345 static GRAPHICS dodcmosn_PP0_lay = {LAYERO, YELLOW, SOLIDC, PATTERNED,
346 {0x1000, /* X */
347 0x0020, /* X */
348 0x0000, /* */
349 0x0000, /* */
350 0x0001, /* X */
351 0x0200, /* X */
352 0x0000, /* */
353 0x0000, /* */
354 0x1000, /* X */
355 0x0020, /* X */
356 0x0000, /* */
357 0x0000, /* */
358 0x0001, /* X */
359 0x0200, /* X */
360 0x0000, /* */
361 0x0000}, /* */
362 NOVARIABLE, 0};
363 static GRAPHICS dodcmosn_PN_lay = {LAYERT5, COLORT5, SOLIDC, PATTERNED,
364 {0x1000, /* X */
365 0x0020, /* X */
366 0x0000, /* */
367 0x0000, /* */
368 0x0001, /* X */
369 0x0200, /* X */
370 0x0000, /* */
371 0x0000, /* */
372 0x1000, /* X */
373 0x0020, /* X */
374 0x0000, /* */
375 0x0000, /* */
376 0x0001, /* X */
377 0x0200, /* X */
378 0x0000, /* */
379 0x0000}, /* */
380 NOVARIABLE, 0};
381 static GRAPHICS dodcmosn_A_lay = {LAYERT3, COLORT3, SOLIDC, PATTERNED,
382 {0x9249, /* X X X X X X */
383 0x0000, /* */
384 0x4924, /* X X X X X */
385 0x0000, /* */
386 0x2492, /* X X X X X */
387 0x0000, /* */
388 0x9249, /* X X X X X X */
389 0x0000, /* */
390 0x9249, /* X X X X X X */
391 0x0000, /* */
392 0x4924, /* X X X X X */
393 0x0000, /* */
394 0x2492, /* X X X X X */
395 0x0000, /* */
396 0x9249, /* X X X X X X */
397 0x0000}, /* */
398 NOVARIABLE, 0};
399
400 GRAPHICS *dodcmosn_layers[MAXLAYERS+1] = {&dodcmosn_M_lay,
401 &dodcmosn_M0_lay, &dodcmosn_V_lay, &dodcmosn_P_lay,
402 &dodcmosn_T_lay, &dodcmosn_PM_lay, &dodcmosn_PM0_lay,
403 &dodcmosn_PSA_lay, &dodcmosn_PF_lay, &dodcmosn_P0_lay,
404 &dodcmosn_PI_lay, &dodcmosn_NI_lay, &dodcmosn_P1_lay,
405 &dodcmosn_N_lay, &dodcmosn_C_lay, &dodcmosn_PP_lay,
406 &dodcmosn_PA_lay, &dodcmosn_PPI_lay, &dodcmosn_PNI_lay,
407 &dodcmosn_PP0_lay, &dodcmosn_PN_lay, &dodcmosn_A_lay, NOGRAPHICS};
408 static CHAR *dodcmosn_layer_names[MAXLAYERS] = {x_("Metal_1"), x_("Metal_2"), x_("Via"),
409 x_("Passivation"), x_("Transistor"), x_("Pseudo_Metal_1"), x_("Pseudo_Metal_2"),
410 x_("Pseudo_S_Active"), x_("Pad_Frame"), x_("Poly1"), x_("P+Implant"), x_("N+Implant"), x_("PWell"),
411 x_("NWell"), x_("Contact"), x_("Pseudo_Poly1"), x_("Pseudo_Active"), x_("Pseudo_P+Implant"),
412 x_("Pseudo_N+Implant"), x_("Pseudo_PWell"), x_("Pseudo_NWell"), x_("Active")};
413 static CHAR *dodcmosn_cif_layers[MAXLAYERS] = {x_("NMF"), x_("NMS"), x_("NVA"), x_("NOG"), x_(""), x_(""), x_(""), x_(""), x_("CX"), x_("NFP"), x_("NPI"), x_("NNI"), x_("NPW"), x_("NNW"), x_("NCC"), x_(""), x_(""), x_(""), x_(""), x_(""), x_(""), x_("NAA")};
414 static CHAR *dodcmosn_gds_layers[MAXLAYERS] = {x_("10"), x_("12"), x_("11"), x_("13"), x_("0"), x_("0"), x_("0"), x_("0"), x_("0"), x_("4"), x_("8"), x_("7"), x_("2"), x_("1"), x_("9"), x_("0"), x_("0"), x_("0"), x_("0"), x_("0"), x_("0"), x_("3")};
415 static INTBIG dodcmosn_layer_function[MAXLAYERS] = {LFMETAL1|LFTRANS1,
416 LFMETAL2|LFTRANS4, LFCONTACT2, LFOVERGLASS, LFTRANSISTOR|LFPSEUDO,
417 LFMETAL1|LFPSEUDO|LFTRANS1, LFMETAL2|LFPSEUDO|LFTRANS4,
418 LFDIFF|LFPTYPE|LFPSEUDO|LFTRANS3, LFART, LFPOLY1|LFTRANS2, LFIMPLANT|LFPTYPE,
419 LFIMPLANT|LFNTYPE, LFWELL|LFPTYPE, LFWELL|LFNTYPE, LFCONTACT1,
420 LFPOLY1|LFPSEUDO|LFTRANS2, LFDIFF|LFNTYPE|LFPSEUDO|LFTRANS3,
421 LFIMPLANT|LFPTYPE|LFPSEUDO, LFIMPLANT|LFNTYPE|LFPSEUDO,
422 LFWELL|LFPTYPE|LFPSEUDO, LFWELL|LFNTYPE|LFPSEUDO|LFTRANS5, LFDIFF|LFTRANS3};
423 static CHAR *dodcmosn_layer_letters[MAXLAYERS] = {x_("m"), x_("h"), x_("v"), x_("o"), x_("t"), x_("M"), x_("H"), x_("S"), x_("b"), x_("p"), x_("e"), x_("f"), x_("w"), x_("n"), x_("c"), x_("P"), x_("D"), x_("E"), x_("F"), x_("W"), x_("N"), x_("x")};
424
425 static TECH_COLORMAP dodcmosn_colmap[32] =
426 {
427 {200,200,200}, /* 0: + + + + */
428 { 96,209,255}, /* 1: Metal_1+ + + + */
429 {255,155,192}, /* 2: +Poly1+ + + */
430 { 96,127,192}, /* 3: Metal_1+Poly1+ + + */
431 {107,226, 96}, /* 4: + +Pseudo_S_Active+ + */
432 { 40,186, 96}, /* 5: Metal_1+ +Pseudo_S_Active+ + */
433 {107,137, 72}, /* 6: +Poly1+Pseudo_S_Active+ + */
434 { 40,113, 72}, /* 7: Metal_1+Poly1+Pseudo_S_Active+ + */
435 {224, 95,255}, /* 8: + + +Metal_2+ */
436 { 85, 78,255}, /* 9: Metal_1+ + +Metal_2+ */
437 {224, 57,192}, /* 10: +Poly1+ +Metal_2+ */
438 { 85, 47,192}, /* 11: Metal_1+Poly1+ +Metal_2+ */
439 { 94, 84, 96}, /* 12: + +Pseudo_S_Active+Metal_2+ */
440 { 36, 69, 96}, /* 13: Metal_1+ +Pseudo_S_Active+Metal_2+ */
441 { 94, 51, 72}, /* 14: +Poly1+Pseudo_S_Active+Metal_2+ */
442 { 36, 42, 72}, /* 15: Metal_1+Poly1+Pseudo_S_Active+Metal_2+ */
443 {240,221,181}, /* 16: + + + +Pseudo_NWell */
444 { 91,182,181}, /* 17: Metal_1+ + + +Pseudo_NWell */
445 {240,134,136}, /* 18: +Poly1+ + +Pseudo_NWell */
446 { 91,111,136}, /* 19: Metal_1+Poly1+ + +Pseudo_NWell */
447 {101,196, 68}, /* 20: + +Pseudo_S_Active+ +Pseudo_NWell */
448 { 38,161, 68}, /* 21: Metal_1+ +Pseudo_S_Active+ +Pseudo_NWell */
449 {101,119, 51}, /* 22: +Poly1+Pseudo_S_Active+ +Pseudo_NWell */
450 { 38, 98, 51}, /* 23: Metal_1+Poly1+Pseudo_S_Active+ +Pseudo_NWell */
451 {211, 82,181}, /* 24: + + +Metal_2+Pseudo_NWell */
452 { 80, 68,181}, /* 25: Metal_1+ + +Metal_2+Pseudo_NWell */
453 {211, 50,136}, /* 26: +Poly1+ +Metal_2+Pseudo_NWell */
454 { 80, 41,136}, /* 27: Metal_1+Poly1+ +Metal_2+Pseudo_NWell */
455 { 89, 73, 68}, /* 28: + +Pseudo_S_Active+Metal_2+Pseudo_NWell */
456 { 33, 60, 68}, /* 29: Metal_1+ +Pseudo_S_Active+Metal_2+Pseudo_NWell */
457 { 89, 44, 51}, /* 30: +Poly1+Pseudo_S_Active+Metal_2+Pseudo_NWell */
458 { 33, 36, 51}, /* 31: Metal_1+Poly1+Pseudo_S_Active+Metal_2+Pseudo_NWell */
459 };
460
461 /******************** DESIGN RULES ********************/
462
463 static INTBIG dodcmosn_unconnectedtable[] = {
464 /* M M V P T P P P P P P N P N C P P P P P P A */
465 /* 0 M M S F 0 I I 1 P A P N P N */
466 /* 0 A I I 0 */
467 /* */
468 /* */
469 /* */
470 /* M */ K3,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
471 /* M0 */ K3,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
472 /* V */ K4,XX,XX,XX,XX,XX,XX,K2,XX,XX,XX,XX,K3,XX,XX,XX,XX,XX,XX,K2,
473 /* P */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
474 /* T */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
475 /* PM */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
476 /* PM0 */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
477 /* PSA */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
478 /* PF */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
479 /* P0 */ K3,XX,XX,XX,XX,K3,XX,XX,XX,XX,XX,XX,K2,
480 /* PI */ K4,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
481 /* NI */ K4,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
482 /* P1 */ K14,K1,XX,XX,XX,XX,XX,XX,XX,XX,
483 /* N */ K14,XX,XX,XX,XX,XX,XX,XX,XX,
484 /* C */ K3,XX,XX,XX,XX,XX,XX,XX,
485 /* PP */ XX,XX,XX,XX,XX,XX,XX,
486 /* PA */ XX,XX,XX,XX,XX,XX,
487 /* PPI */ XX,XX,XX,XX,XX,
488 /* PNI */ XX,XX,XX,XX,
489 /* PP0 */ XX,XX,XX,
490 /* PN */ XX,XX,
491 /* A */ K4
492 };
493
494 static INTBIG dodcmosn_connectedtable[] = {
495 /* M M V P T P P P P P P N P N C P P P P P P A */
496 /* 0 M M S F 0 I I 1 P A P N P N */
497 /* 0 A I I 0 */
498 /* */
499 /* */
500 /* */
501 /* M */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
502 /* M0 */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
503 /* V */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,K3,XX,XX,XX,XX,XX,XX,XX,
504 /* P */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
505 /* T */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
506 /* PM */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
507 /* PM0 */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
508 /* PSA */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
509 /* PF */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
510 /* P0 */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
511 /* PI */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
512 /* NI */ XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,XX,
513 /* P1 */ K6,XX,XX,XX,XX,XX,XX,XX,XX,XX,
514 /* N */ K6,XX,XX,XX,XX,XX,XX,XX,XX,
515 /* C */ XX,XX,XX,XX,XX,XX,XX,XX,
516 /* PP */ XX,XX,XX,XX,XX,XX,XX,
517 /* PA */ XX,XX,XX,XX,XX,XX,
518 /* PPI */ XX,XX,XX,XX,XX,
519 /* PNI */ XX,XX,XX,XX,
520 /* PP0 */ XX,XX,XX,
521 /* PN */ XX,XX,
522 /* A */ XX
523 };
524
525 /******************** ARCS ********************/
526
527 #define ARCPROTOCOUNT 5
528 #define AMETAL_1 0 /* Metal_1 */
529 #define AMETAL_2 1 /* Metal_2 */
530 #define APOLY1 2 /* Poly1 */
531 #define AP_ACTIVE 3 /* P+Active */
532 #define AN_ACTIVE 4 /* N+Active */
533
534 static TECH_ARCLAY dodcmosn_al_0[] = {{LM,0,FILLED}};
535 static TECH_ARCS dodcmosn_a_0 = {
536 x_("Metal_1"), K3, AMETAL_1, NOARCPROTO,
537 1, dodcmosn_al_0,
538 (APMETAL1<<AFUNCTIONSH)|WANTFIXANG|CANWIPE|(90<<AANGLEINCSH)};
539
540 static TECH_ARCLAY dodcmosn_al_1[] = {{LM0,0,FILLED}};
541 static TECH_ARCS dodcmosn_a_1 = {
542 x_("Metal_2"), K4, AMETAL_2, NOARCPROTO,
543 1, dodcmosn_al_1,
544 (APMETAL2<<AFUNCTIONSH)|WANTFIXANG|CANWIPE|(90<<AANGLEINCSH)};
545
546 static TECH_ARCLAY dodcmosn_al_2[] = {{LP0,0,FILLED}};
547 static TECH_ARCS dodcmosn_a_2 = {
548 x_("Poly1"), K2, APOLY1, NOARCPROTO,
549 1, dodcmosn_al_2,
550 (APPOLY1<<AFUNCTIONSH)|WANTFIXANG|CANWIPE|(90<<AANGLEINCSH)};
551
552 static TECH_ARCLAY dodcmosn_al_3[] = {{LA,K12,FILLED}, {LPI,K8,FILLED}, {LN,0,CLOSED}};
553 static TECH_ARCS dodcmosn_a_3 = {
554 x_("P+Active"), K18, AP_ACTIVE, NOARCPROTO,
555 3, dodcmosn_al_3,
556 (APDIFFP<<AFUNCTIONSH)|WANTFIXANG|CANWIPE|WANTNOEXTEND|(90<<AANGLEINCSH)};
557
558 static TECH_ARCLAY dodcmosn_al_4[] = {{LA,K12,FILLED}, {LNI,K8,FILLED}, {LP1,0,CLOSED}};
559 static TECH_ARCS dodcmosn_a_4 = {
560 x_("N+Active"), K18, AN_ACTIVE, NOARCPROTO,
561 3, dodcmosn_al_4,
562 (APDIFFN<<AFUNCTIONSH)|WANTFIXANG|CANWIPE|WANTNOEXTEND|(90<<AANGLEINCSH)};
563
564 TECH_ARCS *dodcmosn_arcprotos[ARCPROTOCOUNT+1] = {
565 &dodcmosn_a_0, &dodcmosn_a_1, &dodcmosn_a_2, &dodcmosn_a_3, &dodcmosn_a_4,
566 ((TECH_ARCS *)-1)};
567
568 static INTBIG dodcmosn_arc_widoff[ARCPROTOCOUNT] = {0, 0, 0, K12, K12};
569
570 /******************** PORT CONNECTIONS ********************/
571
572 static INTBIG dodcmosn_pc_1[] = {-1, ALLGEN, -1};
573 static INTBIG dodcmosn_pc_2[] = {-1, AN_ACTIVE, ALLGEN, -1};
574 static INTBIG dodcmosn_pc_3[] = {-1, AMETAL_1, AMETAL_2, ALLGEN, -1};
575 static INTBIG dodcmosn_pc_4[] = {-1, AP_ACTIVE, ALLGEN, -1};
576 static INTBIG dodcmosn_pc_5[] = {-1, APOLY1, AMETAL_1, ALLGEN, -1};
577 static INTBIG dodcmosn_pc_6[] = {-1, AN_ACTIVE, AMETAL_1, ALLGEN, -1};
578 static INTBIG dodcmosn_pc_7[] = {-1, AMETAL_1, AP_ACTIVE, ALLGEN, -1};
579 static INTBIG dodcmosn_pc_8[] = {-1, AP_ACTIVE, AN_ACTIVE, ALLGEN, -1};
580 static INTBIG dodcmosn_pc_9[] = {-1, APOLY1, ALLGEN, -1};
581 static INTBIG dodcmosn_pc_10[] = {-1, AMETAL_2, ALLGEN, -1};
582 static INTBIG dodcmosn_pc_11[] = {-1, AMETAL_1, ALLGEN, -1};
583
584 /******************** RECTANGLE DESCRIPTIONS ********************/
585
586 static INTBIG dodcmosn_box1[16] = {LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE, CENTERL1, CENTERD1, CENTERR1, CENTERU1};
587 static INTBIG dodcmosn_box2[16] = {LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE, CENTERL2, CENTERD2, CENTERR2, CENTERU2};
588 static INTBIG dodcmosn_box3[16] = {LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE, CENTERL1H, CENTERD1H, CENTERR1H, CENTERU1H};
589 static INTBIG dodcmosn_box4[8] = {LEFTIN4, BOTIN6, RIGHTIN4, TOPIN6};
590 static INTBIG dodcmosn_box5[16] = {LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE, CENTERL3H, CENTERD3H, CENTERR3H, CENTERU3H};
591 static INTBIG dodcmosn_box6[8] = {LEFTIN6, BOTIN2, RIGHTIN6, BOTIN6};
592 static INTBIG dodcmosn_box7[8] = {LEFTIN6, TOPIN6, RIGHTIN6, TOPIN2};
593 static INTBIG dodcmosn_box8[8] = {LEFTIN6, BOTIN2, RIGHTIN6, TOPIN2};
594 static INTBIG dodcmosn_box9[8] = {LEFTEDGE, BOTIN3, RIGHTEDGE, TOPIN3};
595 static INTBIG dodcmosn_box10[8] = {LEFTIN4, BOTEDGE, RIGHTIN4, TOPEDGE};
596 static INTBIG dodcmosn_box11[16] = {LEFTIN4, BOTIN6, RIGHTIN4, TOPIN6, CENTERL5, CENTERD1, CENTERR5, CENTERU1};
597 static INTBIG dodcmosn_box12[16] = {LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE, CENTERL3, CENTERD3, CENTERR3, CENTERU3};
598 static INTBIG dodcmosn_box13[8] = {LEFTIN4, BOTIN4, RIGHTIN4, TOPIN4};
599 static INTBIG dodcmosn_box14[8] = {LEFTIN6, BOTIN6, RIGHTIN6, TOPIN6};
600 static INTBIG dodcmosn_box15[8] = {LEFTIN1, BOTIN1, LEFTIN3, BOTIN3};
601 static INTBIG dodcmosn_box16[16] = {LEFTIN6, BOTIN6, RIGHTIN6, TOPIN6, CENTERL3, CENTERD3, CENTERR3, CENTERU3};
602 static INTBIG dodcmosn_box17[16] = {LEFTIN4, BOTIN4, RIGHTIN4, TOPIN4, CENTERL5, CENTERD5, CENTERR5, CENTERU5};
603 static INTBIG dodcmosn_box18[8] = {LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE};
604
605 /******************** NODES ********************/
606
607 #define NODEPROTOCOUNT 24
608 #define NPM 1 /* PIN_Metal1 */
609 #define NPM0 2 /* PIN_Metal2 */
610 #define NPP 3 /* PIN_Poly1 */
611 #define NPA 4 /* PIN_Active */
612 #define NCMTP 5 /* Contact_M1_to_P+ */
613 #define NCMTN 6 /* Contact_M1_to_N+ */
614 #define NCMTP0 7 /* Contact_M1_to_Poly1 */
615 #define NTP 8 /* Tran_P+ */
616 #define NCMTM 9 /* Contact_M1_to_M2 */
617 #define NCMTN0 10 /* Contact_M1_to_NWell */
618 #define NCMTP1 11 /* Contact_M1_to_PWell */
619 #define NTN 12 /* Tran_N+ */
620 #define NPM1 13 /* PLN_Metal1 */
621 #define NPM2 14 /* PLN_Metal2 */
622 #define NPP0 15 /* PLN_Poly1 */
623 #define NPA0 16 /* PLN_Active */
624 #define NPPI 17 /* PLN_P+Implant */
625 #define NPCC 18 /* PLN_Contact_Cut */
626 #define NPV 19 /* PLN_Via */
627 #define NPP1 20 /* PLN_Pwell */
628 #define NPP2 21 /* PLN_Passivation */
629 #define NPPF 22 /* PLN_Pad_Frame */
630 #define NPN 23 /* PLN_NWell */
631 #define NPNI 24 /* PLN_N+Implant */
632
633 /* PIN_Metal1 */
634 static TECH_PORTS dodcmosn_pm_p[] = {
635 {dodcmosn_pc_11, x_("metal-1"), NOPORTPROTO, (180<<PORTARANGESH),
636 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
637 static TECH_POLYGON dodcmosn_pm_l[] = {
638 {LPM, 0, 4, CROSSED, BOX, dodcmosn_box18}};
639 static TECH_NODES dodcmosn_pm = {
640 x_("PIN_Metal1"), NPM, NONODEPROTO,
641 K3, K3,
642 1, dodcmosn_pm_p,
643 1, dodcmosn_pm_l,
644 (NPPIN<<NFUNCTIONSH)|ARCSWIPE|ARCSHRINK,
645 0,0,0,0,0,0,0,0,0};
646
647 /* PIN_Metal2 */
648 static TECH_PORTS dodcmosn_pm0_p[] = {
649 {dodcmosn_pc_10, x_("metal-2"), NOPORTPROTO, (180<<PORTARANGESH),
650 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
651 static TECH_POLYGON dodcmosn_pm0_l[] = {
652 {LPM0, 0, 4, CROSSED, BOX, dodcmosn_box18}};
653 static TECH_NODES dodcmosn_pm0 = {
654 x_("PIN_Metal2"), NPM0, NONODEPROTO,
655 K4, K4,
656 1, dodcmosn_pm0_p,
657 1, dodcmosn_pm0_l,
658 (NPPIN<<NFUNCTIONSH)|ARCSWIPE|ARCSHRINK,
659 0,0,0,0,0,0,0,0,0};
660
661 /* PIN_Poly1 */
662 static TECH_PORTS dodcmosn_pp_p[] = {
663 {dodcmosn_pc_9, x_("poly1"), NOPORTPROTO, (180<<PORTARANGESH),
664 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
665 static TECH_POLYGON dodcmosn_pp_l[] = {
666 {LPP, 0, 4, CROSSED, BOX, dodcmosn_box18}};
667 static TECH_NODES dodcmosn_pp = {
668 x_("PIN_Poly1"), NPP, NONODEPROTO,
669 K2, K2,
670 1, dodcmosn_pp_p,
671 1, dodcmosn_pp_l,
672 (NPPIN<<NFUNCTIONSH)|ARCSWIPE|ARCSHRINK,
673 0,0,0,0,0,0,0,0,0};
674
675 /* PIN_Active */
676 static TECH_PORTS dodcmosn_pa_p[] = {
677 {dodcmosn_pc_8, x_("active"), NOPORTPROTO, (180<<PORTARANGESH),
678 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
679 static TECH_POLYGON dodcmosn_pa_l[] = {
680 {LPA, 0, 4, CROSSED, BOX, dodcmosn_box18}};
681 static TECH_NODES dodcmosn_pa = {
682 x_("PIN_Active"), NPA, NONODEPROTO,
683 K2, K2,
684 1, dodcmosn_pa_p,
685 1, dodcmosn_pa_l,
686 (NPPIN<<NFUNCTIONSH)|ARCSWIPE|ARCSHRINK,
687 0,0,0,0,0,0,0,0,0};
688
689 /* Contact_M1_to_P+ */
690 static TECH_PORTS dodcmosn_cmtp_p[] = {
691 {dodcmosn_pc_7, x_("metal-1-s-act"), NOPORTPROTO, (180<<PORTARANGESH),
692 LEFTIN7, BOTIN7, RIGHTIN7, TOPIN7}};
693 static TECH_POLYGON dodcmosn_cmtp_l[] = {
694 {LM, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box16},
695 {LA, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box16},
696 {LPI, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box17},
697 {LN, 0, 4, CLOSEDRECT, BOX, dodcmosn_box18},
698 {LC, 0, 4, FILLEDRECT, BOX, dodcmosn_box15}};
699 static TECH_NODES dodcmosn_cmtp = {
700 x_("Contact_M1_to_P+"), NCMTP, NONODEPROTO,
701 K18, K18,
702 1, dodcmosn_cmtp_p,
703 5, dodcmosn_cmtp_l,
704 (NPCONTACT<<NFUNCTIONSH),
705 MULTICUT,K2,K2,K2,K3,0,0,0,0};
706
707 /* Contact_M1_to_N+ */
708 static TECH_PORTS dodcmosn_cmtn_p[] = {
709 {dodcmosn_pc_6, x_("metal-1-d-act"), NOPORTPROTO, (180<<PORTARANGESH),
710 LEFTIN7, BOTIN7, RIGHTIN7, TOPIN7}};
711 static TECH_POLYGON dodcmosn_cmtn_l[] = {
712 {LM, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box16},
713 {LA, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box16},
714 {LNI, 0, 4, FILLEDRECT, BOX, dodcmosn_box13},
715 {LP1, 0, 4, CLOSEDRECT, BOX, dodcmosn_box18},
716 {LC, 0, 4, FILLEDRECT, BOX, dodcmosn_box15}};
717 static TECH_NODES dodcmosn_cmtn = {
718 x_("Contact_M1_to_N+"), NCMTN, NONODEPROTO,
719 K18, K18,
720 1, dodcmosn_cmtn_p,
721 5, dodcmosn_cmtn_l,
722 (NPCONTACT<<NFUNCTIONSH),
723 MULTICUT,K2,K2,K2,K3,0,0,0,0};
724
725 /* Contact_M1_to_Poly1 */
726 static TECH_PORTS dodcmosn_cmtp0_p[] = {
727 {dodcmosn_pc_5, x_("metal-1-polysilicon"), NOPORTPROTO, (180<<PORTARANGESH),
728 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
729 static TECH_POLYGON dodcmosn_cmtp0_l[] = {
730 {LM, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box12},
731 {LP0, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box12},
732 {LC, 0, 4, FILLEDRECT, BOX, dodcmosn_box15}};
733 static TECH_NODES dodcmosn_cmtp0 = {
734 x_("Contact_M1_to_Poly1"), NCMTP0, NONODEPROTO,
735 K6, K6,
736 1, dodcmosn_cmtp0_p,
737 3, dodcmosn_cmtp0_l,
738 (NPCONTACT<<NFUNCTIONSH),
739 MULTICUT,K2,K2,K2,K3,0,0,0,0};
740
741 /* Tran_P+ */
742 static TECH_PORTS dodcmosn_tp_p[] = {
743 {dodcmosn_pc_9, x_("s-trans-poly-left"), NOPORTPROTO, (45<<PORTARANGESH)|(180<<PORTANGLESH)|(1<<PORTNETSH),
744 LEFTIN4, BOTIN7, LEFTIN4, TOPIN7},
745 {dodcmosn_pc_4, x_("s-trans-diff-top"), NOPORTPROTO, (45<<PORTARANGESH)|(90<<PORTANGLESH),
746 LEFTIN9, TOPIN3, RIGHTIN9, TOPIN3},
747 {dodcmosn_pc_9, x_("s-trans-poly-right"), NOPORTPROTO, (45<<PORTARANGESH)|(1<<PORTNETSH),
748 RIGHTIN4, BOTIN7, RIGHTIN4, TOPIN7},
749 {dodcmosn_pc_4, x_("s-trans-diff-bottom"), NOPORTPROTO, (45<<PORTARANGESH)|(270<<PORTANGLESH)|(3<<PORTNETSH),
750 LEFTIN9, BOTIN3, RIGHTIN9, BOTIN3}};
751 static TECH_SERPENT dodcmosn_tp_l[] = {
752 {{LP0, 0, 4, FILLEDRECT, POINTS, dodcmosn_box11}, K1, K1, K2, K2},
753 {{LA, 0, 4, FILLEDRECT, BOX, dodcmosn_box8}, K5, K5, K0, K0},
754 {{LPI,-1, 4, FILLEDRECT, BOX, dodcmosn_box10}, K7, K7, K2, K2},
755 {{LN, -1, 4, CLOSEDRECT, BOX, dodcmosn_box9}, K4, K4, K6, K6}};
756 static TECH_SERPENT dodcmosn_tpE_l[] = {
757 {{LP0, 0, 4, FILLEDRECT, POINTS, dodcmosn_box11}, K1, K1, K2, K2},
758 {{LA, 1, 4, FILLEDRECT, BOX, dodcmosn_box7}, K5, 0, K0, K0},
759 {{LA, 3, 4, FILLEDRECT, BOX, dodcmosn_box6}, 0, K5, K0, K0},
760 {{LPI,-1, 4, FILLEDRECT, BOX, dodcmosn_box10}, K7, K7, K2, K2},
761 {{LN, -1, 4, CLOSEDRECT, BOX, dodcmosn_box9}, K4, K4, K6, K6}};
762 static TECH_NODES dodcmosn_tp = {
763 x_("Tran_P+"), NTP, NONODEPROTO,
764 K18, K14,
765 4, dodcmosn_tp_p,
766 4, (TECH_POLYGON *)0,
767 (NPTRAPMOS<<NFUNCTIONSH)|HOLDSTRACE|NODESHRINK,
768 SERPTRANS,5,K3,K3,K2,K1,K2,dodcmosn_tp_l,dodcmosn_tpE_l};
769
770 /* Contact_M1_to_M2 */
771 static TECH_PORTS dodcmosn_cmtm_p[] = {
772 {dodcmosn_pc_3, x_("metal-1-metal-2"), NOPORTPROTO, (180<<PORTARANGESH),
773 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
774 static TECH_POLYGON dodcmosn_cmtm_l[] = {
775 {LM0, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box5},
776 {LM, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box5},
777 {LV, 0, 4, FILLEDRECT, BOX, dodcmosn_box15}};
778 static TECH_NODES dodcmosn_cmtm = {
779 x_("Contact_M1_to_M2"), NCMTM, NONODEPROTO,
780 K7, K7,
781 1, dodcmosn_cmtm_p,
782 3, dodcmosn_cmtm_l,
783 (NPCONTACT<<NFUNCTIONSH),
784 MULTICUT,K3,K3,K2,K4,0,0,0,0};
785
786 /* Contact_M1_to_NWell */
787 static TECH_PORTS dodcmosn_cmtn0_p[] = {
788 {dodcmosn_pc_6, x_("M1NWell"), NOPORTPROTO, (180<<PORTARANGESH),
789 LEFTIN6, BOTIN6, RIGHTIN6, TOPIN6}};
790 static TECH_POLYGON dodcmosn_cmtn0_l[] = {
791 {LA, 0, 4, FILLEDRECT, BOX, dodcmosn_box14},
792 {LM, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box16},
793 {LNI, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box17},
794 {LN, 0, 4, CLOSEDRECT, BOX, dodcmosn_box18},
795 {LC, 0, 4, FILLEDRECT, BOX, dodcmosn_box15}};
796 static TECH_NODES dodcmosn_cmtn0 = {
797 x_("Contact_M1_to_NWell"), NCMTN0, NONODEPROTO,
798 K18, K18,
799 1, dodcmosn_cmtn0_p,
800 5, dodcmosn_cmtn0_l,
801 (NPWELL<<NFUNCTIONSH),
802 MULTICUT,K2,K2,K2,K3,0,0,0,0};
803
804 /* Contact_M1_to_PWell */
805 static TECH_PORTS dodcmosn_cmtp1_p[] = {
806 {dodcmosn_pc_7, x_("metal-1-substrate"), NOPORTPROTO, (180<<PORTARANGESH),
807 LEFTIN6, BOTIN6, RIGHTIN6, TOPIN6}};
808 static TECH_POLYGON dodcmosn_cmtp1_l[] = {
809 {LM, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box16},
810 {LA, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box16},
811 {LPI, 0, 4, FILLEDRECT, BOX, dodcmosn_box13},
812 {LP1, 0, 4, CLOSEDRECT, BOX, dodcmosn_box18},
813 {LC, 0, 4, FILLEDRECT, BOX, dodcmosn_box15}};
814 static TECH_NODES dodcmosn_cmtp1 = {
815 x_("Contact_M1_to_PWell"), NCMTP1, NONODEPROTO,
816 K18, K18,
817 1, dodcmosn_cmtp1_p,
818 5, dodcmosn_cmtp1_l,
819 (NPSUBSTRATE<<NFUNCTIONSH),
820 MULTICUT,K2,K2,K2,K3,0,0,0,0};
821
822 /* Tran_N+ */
823 static TECH_PORTS dodcmosn_tn_p[] = {
824 {dodcmosn_pc_9, x_("d-trans-poly-right"), NOPORTPROTO, (45<<PORTARANGESH),
825 RIGHTIN4, BOTIN7, RIGHTIN4, TOPIN7},
826 {dodcmosn_pc_2, x_("d-trans-diff-bottom"), NOPORTPROTO, (45<<PORTARANGESH)|(270<<PORTANGLESH)|(1<<PORTNETSH),
827 LEFTIN9, BOTIN3, RIGHTIN9, BOTIN3},
828 {dodcmosn_pc_9, x_("d-trans-poly-left"), NOPORTPROTO, (45<<PORTARANGESH)|(180<<PORTANGLESH),
829 LEFTIN4, BOTIN7, LEFTIN4, TOPIN7},
830 {dodcmosn_pc_2, x_("d-trans-diff-top"), NOPORTPROTO, (45<<PORTARANGESH)|(90<<PORTANGLESH)|(3<<PORTNETSH),
831 LEFTIN9, TOPIN3, RIGHTIN9, TOPIN3}};
832 static TECH_SERPENT dodcmosn_tn_l[] = {
833 {{LA, 0, 4, FILLEDRECT, BOX, dodcmosn_box8}, K5, K5, K0, K0},
834 {{LP0, 0, 4, FILLEDRECT, BOX, dodcmosn_box4}, K1, K1, K2, K2},
835 {{LNI,-1, 4, FILLEDRECT, BOX, dodcmosn_box10}, K7, K7, K2, K2},
836 {{LP1,-1, 4, CLOSEDRECT, BOX, dodcmosn_box9}, K4, K4, K6, K6}};
837 static TECH_SERPENT dodcmosn_tnE_l[] = {
838 {{LA, 3, 4, FILLEDRECT, BOX, dodcmosn_box7}, K5, 0, K0, K0},
839 {{LA, 1, 4, FILLEDRECT, BOX, dodcmosn_box6}, 0, K5, K0, K0},
840 {{LP0, 0, 4, FILLEDRECT, BOX, dodcmosn_box4}, K1, K1, K2, K2},
841 {{LNI,-1, 4, FILLEDRECT, BOX, dodcmosn_box10}, K7, K7, K2, K2},
842 {{LP1,-1, 4, CLOSEDRECT, BOX, dodcmosn_box9}, K4, K4, K6, K6}};
843 static TECH_NODES dodcmosn_tn = {
844 x_("Tran_N+"), NTN, NONODEPROTO,
845 K18, K14,
846 4, dodcmosn_tn_p,
847 4, (TECH_POLYGON *)0,
848 (NPTRANMOS<<NFUNCTIONSH)|HOLDSTRACE|NODESHRINK,
849 SERPTRANS,5,K3,K3,K2,K1,K2,dodcmosn_tn_l,dodcmosn_tnE_l};
850
851 /* PLN_Metal1 */
852 static TECH_PORTS dodcmosn_pm1_p[] = {
853 {dodcmosn_pc_11, x_("metal-1"), NOPORTPROTO, (180<<PORTARANGESH),
854 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
855 static TECH_POLYGON dodcmosn_pm1_l[] = {
856 {LM, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box3}};
857 static TECH_NODES dodcmosn_pm1 = {
858 x_("PLN_Metal1"), NPM1, NONODEPROTO,
859 K3, K3,
860 1, dodcmosn_pm1_p,
861 1, dodcmosn_pm1_l,
862 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
863 POLYGONAL,0,0,0,0,0,0,0,0};
864
865 /* PLN_Metal2 */
866 static TECH_PORTS dodcmosn_pm2_p[] = {
867 {dodcmosn_pc_10, x_("metal-2"), NOPORTPROTO, (180<<PORTARANGESH),
868 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
869 static TECH_POLYGON dodcmosn_pm2_l[] = {
870 {LM0, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box2}};
871 static TECH_NODES dodcmosn_pm2 = {
872 x_("PLN_Metal2"), NPM2, NONODEPROTO,
873 K4, K4,
874 1, dodcmosn_pm2_p,
875 1, dodcmosn_pm2_l,
876 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
877 POLYGONAL,0,0,0,0,0,0,0,0};
878
879 /* PLN_Poly1 */
880 static TECH_PORTS dodcmosn_pp0_p[] = {
881 {dodcmosn_pc_9, x_("polysilicon"), NOPORTPROTO, (180<<PORTARANGESH),
882 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
883 static TECH_POLYGON dodcmosn_pp0_l[] = {
884 {LP0, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box1}};
885 static TECH_NODES dodcmosn_pp0 = {
886 x_("PLN_Poly1"), NPP0, NONODEPROTO,
887 K2, K2,
888 1, dodcmosn_pp0_p,
889 1, dodcmosn_pp0_l,
890 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
891 POLYGONAL,0,0,0,0,0,0,0,0};
892
893 /* PLN_Active */
894 static TECH_PORTS dodcmosn_pa0_p[] = {
895 {dodcmosn_pc_8, x_("active"), NOPORTPROTO, (180<<PORTARANGESH),
896 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
897 static TECH_POLYGON dodcmosn_pa0_l[] = {
898 {LA, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box12}};
899 static TECH_NODES dodcmosn_pa0 = {
900 x_("PLN_Active"), NPA0, NONODEPROTO,
901 K6, K6,
902 1, dodcmosn_pa0_p,
903 1, dodcmosn_pa0_l,
904 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
905 POLYGONAL,0,0,0,0,0,0,0,0};
906
907 /* PLN_P+Implant */
908 static TECH_PORTS dodcmosn_ppi_p[] = {
909 {dodcmosn_pc_1, x_("select"), NOPORTPROTO, (180<<PORTARANGESH),
910 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
911 static TECH_POLYGON dodcmosn_ppi_l[] = {
912 {LPI, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box2}};
913 static TECH_NODES dodcmosn_ppi = {
914 x_("PLN_P+Implant"), NPPI, NONODEPROTO,
915 K4, K4,
916 1, dodcmosn_ppi_p,
917 1, dodcmosn_ppi_l,
918 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
919 POLYGONAL,0,0,0,0,0,0,0,0};
920
921 /* PLN_Contact_Cut */
922 static TECH_PORTS dodcmosn_pcc_p[] = {
923 {dodcmosn_pc_1, x_("cut"), NOPORTPROTO, (180<<PORTARANGESH),
924 LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE}};
925 static TECH_POLYGON dodcmosn_pcc_l[] = {
926 {LC, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box1}};
927 static TECH_NODES dodcmosn_pcc = {
928 x_("PLN_Contact_Cut"), NPCC, NONODEPROTO,
929 K2, K2,
930 1, dodcmosn_pcc_p,
931 1, dodcmosn_pcc_l,
932 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
933 POLYGONAL,0,0,0,0,0,0,0,0};
934
935 /* PLN_Via */
936 static TECH_PORTS dodcmosn_pv_p[] = {
937 {dodcmosn_pc_1, x_("via"), NOPORTPROTO, (180<<PORTARANGESH),
938 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
939 static TECH_POLYGON dodcmosn_pv_l[] = {
940 {LV, 0, 4, CLOSEDRECT, MINBOX, dodcmosn_box3}};
941 static TECH_NODES dodcmosn_pv = {
942 x_("PLN_Via"), NPV, NONODEPROTO,
943 K3, K3,
944 1, dodcmosn_pv_p,
945 1, dodcmosn_pv_l,
946 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
947 POLYGONAL,0,0,0,0,0,0,0,0};
948
949 /* PLN_Pwell */
950 static TECH_PORTS dodcmosn_pp1_p[] = {
951 {dodcmosn_pc_4, x_("well"), NOPORTPROTO, (180<<PORTARANGESH),
952 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
953 static TECH_POLYGON dodcmosn_pp1_l[] = {
954 {LP1, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box12}};
955 static TECH_NODES dodcmosn_pp1 = {
956 x_("PLN_Pwell"), NPP1, NONODEPROTO,
957 K6, K6,
958 1, dodcmosn_pp1_p,
959 1, dodcmosn_pp1_l,
960 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
961 POLYGONAL,0,0,0,0,0,0,0,0};
962
963 /* PLN_Passivation */
964 static TECH_PORTS dodcmosn_pp2_p[] = {
965 {dodcmosn_pc_1, x_("passivation"), NOPORTPROTO, (180<<PORTARANGESH),
966 LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE}};
967 static TECH_POLYGON dodcmosn_pp2_l[] = {
968 {LP, 0, 4, FILLEDRECT, BOX, dodcmosn_box18}};
969 static TECH_NODES dodcmosn_pp2 = {
970 x_("PLN_Passivation"), NPP2, NONODEPROTO,
971 K8, K8,
972 1, dodcmosn_pp2_p,
973 1, dodcmosn_pp2_l,
974 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
975 POLYGONAL,0,0,0,0,0,0,0,0};
976
977 /* PLN_Pad_Frame */
978 static TECH_PORTS dodcmosn_ppf_p[] = {
979 {dodcmosn_pc_1, x_("pad-frame"), NOPORTPROTO, (180<<PORTARANGESH),
980 LEFTEDGE, BOTEDGE, RIGHTEDGE, TOPEDGE}};
981 static TECH_POLYGON dodcmosn_ppf_l[] = {
982 {LPF, 0, 4, CLOSEDRECT, BOX, dodcmosn_box18}};
983 static TECH_NODES dodcmosn_ppf = {
984 x_("PLN_Pad_Frame"), NPPF, NONODEPROTO,
985 K8, K8,
986 1, dodcmosn_ppf_p,
987 1, dodcmosn_ppf_l,
988 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
989 POLYGONAL,0,0,0,0,0,0,0,0};
990
991 /* PLN_NWell */
992 static TECH_PORTS dodcmosn_pn_p[] = {
993 {dodcmosn_pc_1, x_("NWell"), NOPORTPROTO, (180<<PORTARANGESH),
994 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
995 static TECH_POLYGON dodcmosn_pn_l[] = {
996 {LN, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box12}};
997 static TECH_NODES dodcmosn_pn = {
998 x_("PLN_NWell"), NPN, NONODEPROTO,
999 K6, K6,
1000 1, dodcmosn_pn_p,
1001 1, dodcmosn_pn_l,
1002 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
1003 POLYGONAL,0,0,0,0,0,0,0,0};
1004
1005 /* PLN_N+Implant */
1006 static TECH_PORTS dodcmosn_pni_p[] = {
1007 {dodcmosn_pc_1, x_("N+Imp"), NOPORTPROTO, (180<<PORTARANGESH),
1008 LEFTIN1, BOTIN1, RIGHTIN1, TOPIN1}};
1009 static TECH_POLYGON dodcmosn_pni_l[] = {
1010 {LNI, 0, 4, FILLEDRECT, MINBOX, dodcmosn_box2}};
1011 static TECH_NODES dodcmosn_pni = {
1012 x_("PLN_N+Implant"), NPNI, NONODEPROTO,
1013 K4, K4,
1014 1, dodcmosn_pni_p,
1015 1, dodcmosn_pni_l,
1016 (NPNODE<<NFUNCTIONSH)|HOLDSTRACE,
1017 POLYGONAL,0,0,0,0,0,0,0,0};
1018
1019 TECH_NODES *dodcmosn_nodeprotos[NODEPROTOCOUNT+1] = {
1020 &dodcmosn_pm, &dodcmosn_pm0, &dodcmosn_pp, &dodcmosn_pa,
1021 &dodcmosn_cmtp, &dodcmosn_cmtn, &dodcmosn_cmtp0,
1022 &dodcmosn_tp, &dodcmosn_cmtm, &dodcmosn_cmtn0,
1023 &dodcmosn_cmtp1, &dodcmosn_tn, &dodcmosn_pm1, &dodcmosn_pm2,
1024 &dodcmosn_pp0, &dodcmosn_pa0, &dodcmosn_ppi, &dodcmosn_pcc,
1025 &dodcmosn_pv, &dodcmosn_pp1, &dodcmosn_pp2, &dodcmosn_ppf,
1026 &dodcmosn_pn, &dodcmosn_pni, ((TECH_NODES *)-1)};
1027
1028 static INTBIG dodcmosn_node_widoff[NODEPROTOCOUNT*4] = {
1029 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, K6,K6,K6,K6, K6,K6,K6,K6, 0,0,0,0,
1030 K6,K6,K6,K6, 0,0,0,0, K6,K6,K6,K6, K6,K6,K6,K6, K6,K6,K6,K6, 0,0,0,0, 0,0,0,0, 0,0,0,0,
1031 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
1032
1033 /******************** VARIABLE AGGREGATION ********************/
1034
1035 TECH_VARIABLES dodcmosn_variables[] =
1036 {
1037 {x_("TECH_layer_names"), (CHAR *)dodcmosn_layer_names, 0.0,
1038 VSTRING|VDONTSAVE|VISARRAY|(MAXLAYERS<<VLENGTHSH)},
1039 {x_("TECH_layer_function"), (CHAR *)dodcmosn_layer_function, 0.0,
1040 VINTEGER|VDONTSAVE|VISARRAY|(MAXLAYERS<<VLENGTHSH)},
1041 {x_("TECH_node_width_offset"), (CHAR *)dodcmosn_node_widoff, 0.0,
1042 VFRACT|VDONTSAVE|VISARRAY|((NODEPROTOCOUNT*4)<<VLENGTHSH)},
1043 {x_("TECH_arc_width_offset"), (CHAR *)dodcmosn_arc_widoff, 0.0,
1044 VFRACT|VDONTSAVE|VISARRAY|(ARCPROTOCOUNT<<VLENGTHSH)},
1045 {x_("USER_layer_letters"), (CHAR *)dodcmosn_layer_letters, 0.0,
1046 VSTRING|VDONTSAVE|VISARRAY|(MAXLAYERS<<VLENGTHSH)},
1047 {x_("USER_color_map"), (CHAR *)dodcmosn_colmap, 0.0,
1048 VCHAR|VDONTSAVE|VISARRAY|((sizeof dodcmosn_colmap)<<VLENGTHSH)},
1049 {x_("IO_cif_layer_names"), (CHAR *)dodcmosn_cif_layers, 0.0,
1050 VSTRING|VDONTSAVE|VISARRAY|(MAXLAYERS<<VLENGTHSH)},
1051 {x_("IO_gds_layer_numbers"), (CHAR *)dodcmosn_gds_layers, 0.0,
1052 VSTRING|VDONTSAVE|VISARRAY|(MAXLAYERS<<VLENGTHSH)},
1053 {x_("DRC_min_unconnected_distances"), (CHAR *)dodcmosn_unconnectedtable, 0.0,
1054 VFRACT|VDONTSAVE|VISARRAY|
1055 (((sizeof dodcmosn_unconnectedtable)/SIZEOFINTBIG)<<VLENGTHSH)},
1056 {x_("DRC_min_connected_distances"), (CHAR *)dodcmosn_connectedtable, 0.0,
1057 VFRACT|VDONTSAVE|VISARRAY|
1058 (((sizeof dodcmosn_connectedtable)/SIZEOFINTBIG)<<VLENGTHSH)},
1059 {NULL, NULL, 0.0, 0}
1060 };
1061
1062 /******************** ROUTINES ********************/
1063
dodcmosn_initprocess(TECHNOLOGY * tech,INTBIG pass)1064 BOOLEAN dodcmosn_initprocess(TECHNOLOGY *tech, INTBIG pass)
1065 {
1066 Q_UNUSED( tech );
1067 Q_UNUSED( pass );
1068 return(FALSE);
1069 }
1070
dodcmosn_shapenodepoly(NODEINST * ni,INTBIG box,POLYGON * poly)1071 void dodcmosn_shapenodepoly(NODEINST *ni, INTBIG box, POLYGON *poly)
1072 {
1073 dodcmosn_intshapenodepoly(ni, box, poly, &tech_oneprocpolyloop);
1074 }
1075
dodcmosn_intshapenodepoly(NODEINST * ni,INTBIG box,POLYGON * poly,POLYLOOP * pl)1076 void dodcmosn_intshapenodepoly(NODEINST *ni, INTBIG box, POLYGON *poly, POLYLOOP *pl)
1077 {
1078 REGISTER TECH_NODES *thistn, *othistn;
1079 REGISTER INTBIG lambda, sea;
1080 INTBIG lx, hx, ly, hy, olx, ohx, oly, ohy, clx, chx, cly, chy, cex, cey, ocex, ocey;
1081 REGISTER TECH_PORTS *p;
1082 REGISTER GEOM *geom;
1083 REGISTER NODEINST *oni;
1084 TECH_POLYGON *lay, *olay, *clay;
1085 REGISTER INTBIG pindex, count, i, olayer;
1086 static POLYGON *opoly = NOPOLYGON, *cpoly = NOPOLYGON;
1087
1088 /* handle displayable variables */
1089 if (box >= pl->realpolys)
1090 {
1091 (void)tech_filldisplayablenvar(ni, poly, pl->curwindowpart, 0, pl);
1092 return;
1093 }
1094
1095 pindex = ni->proto->primindex;
1096 thistn = dodcmosn_nodeprotos[pindex-1];
1097 lambda = lambdaofnode(ni);
1098 switch (thistn->special)
1099 {
1100 case SERPTRANS:
1101 if (box > 1 || (ni->userbits&NSHORT) == 0) p = (TECH_PORTS *)0; else
1102 p = thistn->portlist;
1103 tech_filltrans(poly, &lay, thistn->gra, ni, lambda, box, p, pl);
1104 break;
1105
1106 case MULTICUT:
1107 count = thistn->layercount - 1;
1108 if (box >= count)
1109 {
1110 /* code cannot be called by multiple procesors: uses globals */
1111 NOT_REENTRANT;
1112
1113 lay = &thistn->layerlist[count];
1114 tech_moscutpoly(ni, box-count, lay->points, pl);
1115 tech_fillpoly(poly, lay, ni, lambda, FILLED);
1116 break;
1117 }
1118
1119 default:
1120 lay = &thistn->layerlist[box];
1121 tech_fillpoly(poly, lay, ni, lambda, FILLED);
1122 break;
1123 }
1124 poly->desc = dodcmosn_layers[poly->layer];
1125
1126 /* now the special trimming code */
1127 if ((poly->layer == LPI || poly->layer == LNI) && ni->parent != NONODEPROTO)
1128 {
1129 /* get bounding box of this node, it must be manhattan */
1130 if (!isbox(poly, &lx, &hx, &ly, &hy)) return;
1131 if (poly->layer == LPI) olayer = LNI; else olayer = LPI;
1132 sea = initsearch(lx, hx, ly, hy, ni->parent);
1133 if (sea == -1) return;
1134 for(;;)
1135 {
1136 geom = nextobject(sea);
1137 if (geom == NOGEOM) break;
1138 if (geom->entryisnode)
1139 {
1140 oni = geom->entryaddr.ni;
1141 if (oni->proto->primindex == 0) continue;
1142 if (oni->proto->tech != ni->proto->tech) continue;
1143 if (poly->layer == LPI)
1144 {
1145 /* layer LPI interacts with only some nodes */
1146 if (oni->proto->primindex != NCMTN && oni->proto->primindex != NCMTN0 &&
1147 oni->proto->primindex != NTN) continue;
1148 } else
1149 {
1150 /* layer LNI interacts with only some nodes */
1151 if (oni->proto->primindex != NCMTP && oni->proto->primindex != NCMTP1 &&
1152 oni->proto->primindex != NTP) continue;
1153 }
1154
1155 /* find polygon for opposite layer on node "oni" */
1156 othistn = dodcmosn_nodeprotos[oni->proto->primindex-1];
1157 if (othistn->special == SERPTRANS)
1158 {
1159 for(i=0; i<othistn->layercount; i++)
1160 if (othistn->gra[i].basics.layernum == olayer) break;
1161 if (i >= othistn->layercount) continue;
1162 olay = &othistn->gra[i].basics;
1163 } else
1164 {
1165 for(i=0; i<othistn->layercount; i++)
1166 if (othistn->layerlist[i].layernum == olayer) break;
1167 if (i >= othistn->layercount) continue;
1168 olay = &othistn->layerlist[i];
1169 }
1170 (void)needstaticpolygon(&opoly, 4, db_cluster);
1171 tech_fillpoly(opoly, olay, oni, lambda, FILLED);
1172 if (!isbox(opoly, &olx, &ohx, &oly, &ohy)) continue;
1173
1174 /* if the boxes don't intersect, all is fine */
1175 if (ohx < lx || olx > hx || ohy < ly || oly > hy) continue;
1176
1177 /* find the polygon for the Active layer on this node */
1178 if (thistn->special == SERPTRANS)
1179 {
1180 for(i=0; i<thistn->layercount; i++)
1181 if (thistn->gra[i].basics.layernum == LA) break;
1182 if (i >= thistn->layercount) continue;
1183 clay = &thistn->gra[i].basics;
1184 } else
1185 {
1186 for(i=0; i<thistn->layercount; i++)
1187 if (thistn->layerlist[i].layernum == LA) break;
1188 if (i >= thistn->layercount) continue;
1189 clay = &thistn->layerlist[i];
1190 }
1191 (void)needstaticpolygon(&cpoly, 4, db_cluster);
1192 tech_fillpoly(cpoly, clay, ni, lambda, FILLED);
1193 if (!isbox(cpoly, &clx, &chx, &cly, &chy)) continue;
1194
1195 /* get center of the two nodes */
1196 cex = (lx + hx) / 2; cey = (ly + hy) / 2;
1197 ocex = (olx + ohx) / 2; ocey = (oly + ohy) / 2;
1198
1199 /* now see if clipping to the Active layer makes the implants not intersect */
1200 if (hy > oly && ly < ohy)
1201 {
1202 if (cex > ocex && lx < ohx) lx = clx;
1203 if (ocex > cex && hx > olx) hx = chx;
1204 }
1205 if (hx > olx && lx < ohx)
1206 {
1207 if (cey > ocey && ly < ohy) ly = cly;
1208 if (ocey > cey && hy > oly) hy = chy;
1209 }
1210 if (poly->style == FILLEDRECT || poly->style == CLOSEDRECT)
1211 maketruerectpoly(lx, hx, ly, hy, poly); else
1212 makerectpoly(lx, hx, ly, hy, poly);
1213 }
1214 }
1215 }
1216 }
1217
dodcmosn_allnodepolys(NODEINST * ni,POLYLIST * plist,WINDOWPART * win,BOOLEAN onlyreasonable)1218 INTBIG dodcmosn_allnodepolys(NODEINST *ni, POLYLIST *plist, WINDOWPART *win, BOOLEAN onlyreasonable)
1219 {
1220 REGISTER INTBIG tot, j;
1221 INTBIG reasonable;
1222 REGISTER NODEPROTO *np;
1223 REGISTER POLYGON *poly;
1224 POLYLOOP mypl;
1225
1226 np = ni->proto;
1227 mypl.curwindowpart = win;
1228 tot = tech_nodepolys(ni, &reasonable, win, &mypl);
1229 if (onlyreasonable) tot = reasonable;
1230 if (mypl.realpolys < tot) tot = mypl.realpolys;
1231 if (ensurepolylist(plist, tot, db_cluster)) return(-1);
1232 for(j = 0; j < tot; j++)
1233 {
1234 poly = plist->polygons[j];
1235 poly->tech = np->tech;
1236 dodcmosn_intshapenodepoly(ni, j, poly, &mypl);
1237 }
1238 return(tot);
1239 }
1240