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