Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / yagle / xyagle / XYA_place.c
1 /*------------------------------------------------------------\
2 | |
3 | Tool : XYAG CGV |
4 | |
5 | File : Trace.c |
6 | |
7 | Authors : Miramond Benoit |
8 | Picault Stephane |
9 | Lester Anthony |
10 | |
11 \------------------------------------------------------------*/
12
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <math.h>
16 #include <signal.h>
17 #include <string.h>
18 #include <setjmp.h>
19
20 #include MUT_H
21 #include SLB_H
22 #include MLO_H
23 #include CNS_H
24 #include XSB_H
25 #include CGV_H
26 #include XYA_H
27
28 #include "XYA_place.h"
29 #include "XYA_cgvfig.h"
30
31 #define IsCgvWireHorizontal(Z) ((Z)->DY == (Z)->Y)
32 #define IsCgvWireVertical(Z) ((Z)->DX == (Z)->X)
33
34 /*------------------------------------------------------------\
35 | Trace Con |
36 \------------------------------------------------------------*/
37
38 void
39 trace_con(con_list, X, Y, LayerCon, scale)
40 cgvcon_list *con_list;
41 long X;
42 long Y;
43 long scale;
44 unsigned char LayerCon;
45 {
46 xyagobj_list *Object1;
47 xyagobj_list *Object2;
48 cgvcon_list *CgvCon;
49 locon_list *LoCon;
50 cgvbox_list *Box;
51 // cone_list *CnsCone;
52 int ObjectType;
53 long X_trace;
54 long Y_trace;
55 long Y_con;
56 long X_con;
57 long DeltaX;
58 int ray;
59
60 ray=scale * XYAG_UNIT / 2;
61 if (ray==0) ray=1;
62 for (CgvCon = con_list; CgvCon; CgvCon = CgvCon->NEXT) {
63 X_con = (CgvCon->X_REL * XYAG_UNIT);
64 Y_con = (CgvCon->Y_REL * XYAG_UNIT) - scale * XYAG_UNIT;
65
66 if (IsCgvConOut(CgvCon)) {
67 X_con -= scale * (XYAG_UNIT * 2);
68 }
69
70 if (IsCgvConExternal(CgvCon)) {
71 if (IsCgvConIn(CgvCon)) {
72 ObjectType = XYAG_OBJECT_TEXT_LEFT;
73 }
74 else {
75 ObjectType = XYAG_OBJECT_TEXT_RIGHT;
76 }
77 }
78 else {
79 if (IsCgvConIn(CgvCon)) {
80 ObjectType = XYAG_OBJECT_TEXT_RIGHT;
81 }
82 else {
83 ObjectType = XYAG_OBJECT_TEXT_LEFT;
84 }
85 }
86
87 if (ObjectType == XYAG_OBJECT_TEXT_LEFT) {
88 DeltaX = -XYAG_UNIT;
89 }
90 else {
91 DeltaX = 3 * XYAG_UNIT;
92 }
93
94 X_trace = X_con + X;
95 Y_trace = Y_con + Y;
96
97 if (!IsCgvConFake(CgvCon)) {
98 if (IsCgvConExternal(CgvCon))
99 Object1 = XyagAddHexagon(X_trace, Y_trace, scale * XYAG_UNIT * 2, scale * XYAG_UNIT * 2, LayerCon);
100 else
101 {
102 if (!IsCgvConIn(CgvCon)) {
103 Object1 = XyagAddRectangle(X_trace+scale*3*XYAG_UNIT/2, Y_trace+scale*XYAG_UNIT/2, scale*XYAG_UNIT , scale*XYAG_UNIT , LayerCon);
104 DeltaX+=scale*3*XYAG_UNIT/2;
105 }
106 else {
107 Object1 = XyagAddRectangle(X_trace-scale*XYAG_UNIT/2, Y_trace+scale*XYAG_UNIT/2, scale*XYAG_UNIT , scale*XYAG_UNIT , LayerCon);
108 }
109 }
110
111 }
112 else {
113 if (!IsCgvConIn(CgvCon)) {
114 Object1 = XyagAddCircle(X_trace + scale*XYAG_UNIT * 1 / 2, Y_trace + scale*XYAG_UNIT, ray, LayerCon);
115
116 }
117 else {
118 Object1 = XyagAddCircle(X_trace + scale*XYAG_UNIT * 3 / 2, Y_trace + scale*XYAG_UNIT, ray, LayerCon);
119 }
120 }
121
122 Object2 = XyagAddText(X_trace + DeltaX, Y_trace + XYAG_UNIT, ObjectType, CgvCon->NAME, LayerCon,scale);
123 Object1->LINK = Object2;
124 Object2->LINK = Object1;
125
126 Object1->USER = (void *) CgvCon;
127 Object2->USER = (void *) CgvCon;
128
129 SetXyagCgvCon(Object1);
130 SetXyagCgvCon(Object2);
131
132 Box=(cgvbox_list *)CgvCon->ROOT;
133 // printf("%s\n",Box->NAME);
134 /* if (!IsCgvConExternal(CgvCon))
135 Box->USER=Object1;*/
136 CgvCon->USER=Object1;
137 /* ((cgvbox_list *)CgvCon->ROOT)->USER=Object1;
138 if (CgvCon->SOURCE_TYPE == CGV_SOURCE_CNSCONE) {
139 CnsCone = (cone_list *) CgvCon->SOURCE;
140 CnsCone->USER = addptype(CnsCone->USER, XYAG_USER_OBJECT_CGV, (void *) Object1);
141 }
142 */
143 if (CgvCon->SOURCE_TYPE == CGV_SOURCE_LOCON) {
144 LoCon = (locon_list *) CgvCon->SOURCE;
145 LoCon->USER = addptype(LoCon->USER, XYAG_USER_OBJECT_CGV, (void *) Object1);
146 }
147 }
148 }
149
150 /*------------------------------------------------------------\
151 | XyagTrace |
152 \------------------------------------------------------------*/
153
154 void
155 XyagTraceFigure(CgvFig)
156 cgvfig_list *CgvFig;
157 {
158 cgvbox_list *CgvBox;
159 cgvnet_list *CgvNet;
160 cgvwir_list *CgvWir;
161 cgvwir_list *ScanWir;
162 xyagobj_list *Object;
163 xyagobj_list *FirstObj;
164 xyagobj_list *PrevObj;
165 long X_trace;
166 long X_fig;
167 long X_box;
168 long X_wir;
169 long Dx;
170 long DX_wir;
171 long MaxY_wire;
172 long MinY_wire;
173 long Y_trace;
174 long Y_fig;
175 long Y_box;
176 long Y_wir;
177 long Dy;
178 long DY_wir;
179 int cptmax_wire = 0;
180 int cptmin_wire = 0;
181 unsigned char Layer;
182 long scale;
183
184 /* Fig */
185
186 X_fig = 0;
187 Y_fig = 0;
188
189 /* box */
190 if (CgvFig->SCALE == 0)
191 scale = 1;
192 else
193 scale = CgvFig->SCALE;
194
195
196 for (CgvBox = CgvFig->BOX; CgvBox; CgvBox = CgvBox->NEXT) {
197 if (IsCgvBoxTransparence(CgvBox) || IsCgvBoxCluster(CgvBox)) {
198 Layer = XYAG_CONSTRUCTION_LAYER;
199 }
200 else {
201 Layer = XYAG_CGVBOX_LAYER;
202 }
203
204 X_box = CgvBox->X * XYAG_UNIT;
205 Y_box = CgvBox->Y * XYAG_UNIT;
206 Dx = CgvBox->DX * XYAG_UNIT;
207 Dy = CgvBox->DY * XYAG_UNIT;
208
209 X_trace = X_box + X_fig;
210 Y_trace = Y_box + Y_fig;
211
212 if( CgvBox->SYMBOL == NULL) {
213 if (CgvBox->SOURCE_TYPE == CGV_SOURCE_CNSCONE) {
214 Object = XyagAddTriangle(X_trace, Y_trace, Dx, Dy, Layer);
215 }
216 else if (CgvBox->SOURCE_TYPE == CGV_SOURCE_CNSCELL) {
217 Object = XyagAddCell(X_trace, Y_trace, Dx, Dy, Layer);
218 }
219 else {
220 Object = XyagAddRectangle(X_trace, Y_trace, Dx, Dy, Layer);
221 }
222 }
223 else {
224 Object = XyagAddUserDefined(CgvBox->SYMBOL,X_trace, Y_trace, Dx, Dy, Layer);
225 }
226 Object->LINK = XyagAddText(X_trace + (Dx >> 1), Y_trace + (Dy >> 1), XYAG_OBJECT_TEXT_CENTER, CgvBox->NAME, Layer,scale);
227 Object->LINK->LINK = Object;
228 Object->USER = (void *) CgvBox;
229 Object->LINK->USER = (void *) CgvBox;
230
231 SetXyagCgvBox(Object);
232 SetXyagCgvBox(Object->LINK);
233 CgvBox->USER=Object;
234
235 if (CgvBox->SOURCE_TYPE == CGV_SOURCE_CNSCONE) {
236 // CgvBox->USER=Object;
237 /*
238 CnsCone = (cone_list *) CgvBox->SOURCE;
239 CnsCone->USER = addptype(CnsCone->USER, XYAG_USER_OBJECT_CGV, (void *) Object);
240 */
241 }
242 else if (CgvBox->SOURCE_TYPE == CGV_SOURCE_CNSCELL) {
243 // CgvBox->USER=Object;
244 /* CnsCell = (cell_list *) CgvBox->SOURCE;
245 CnsCell->USER = addptype(CnsCell->USER, XYAG_USER_OBJECT_CGV, (void *) Object);*/
246 }
247 else
248 {
249 /* Cons des box */
250 if (CgvBox->SYMBOL==NULL)
251 {
252 cgvcon_list *CgvCon;
253 xyagobj_list *tmp, *tmp0;
254 trace_con(CgvBox->CON_IN, X_trace, Y_trace, Layer, CgvFig->SCALE);
255 trace_con(CgvBox->CON_OUT, X_trace, Y_trace, Layer, CgvFig->SCALE);
256
257 for (CgvCon=CgvBox->CON_IN; CgvCon!=NULL; CgvCon=CgvCon->NEXT)
258 {
259 tmp=(xyagobj_list *)CgvCon->USER;
260 tmp0=Object->LINK;
261 Object->LINK=tmp->LINK;
262 tmp->LINK=tmp0;
263 }
264 for (CgvCon=CgvBox->CON_OUT; CgvCon!=NULL; CgvCon=CgvCon->NEXT)
265 {
266 tmp=(xyagobj_list *)CgvCon->USER;
267 tmp0=Object->LINK;
268 Object->LINK=tmp->LINK;
269 tmp->LINK=tmp0;
270 }
271
272 }
273 }
274 }
275
276 /* Con externes */
277
278 trace_con(CgvFig->CON_IN, X_fig, Y_fig, XYAG_CGVCONIN_LAYER, CgvFig->SCALE);
279 trace_con(CgvFig->CON_OUT, X_fig, Y_fig, XYAG_CGVCONOUT_LAYER, CgvFig->SCALE);
280
281 /* Nets */
282
283 for (CgvNet = CgvFig->NET; CgvNet; CgvNet = CgvNet->NEXT) {
284 FirstObj = NULL;
285 PrevObj = NULL;
286
287 for (CgvWir = CgvNet->WIRE; CgvWir; CgvWir = CgvWir->NEXT) {
288 X_wir = CgvWir->X * XYAG_UNIT;
289 Y_wir = CgvWir->Y * XYAG_UNIT;
290 DX_wir = CgvWir->DX * XYAG_UNIT;
291 DY_wir = CgvWir->DY * XYAG_UNIT;
292
293 X_trace = X_fig + X_wir;
294 Y_trace = Y_fig + Y_wir;
295
296 Object = XyagAddLine(X_trace, Y_trace, DX_wir + X_fig, DY_wir + Y_fig, XYAG_CGVNET_LAYER, XYAG_CGVNET_LAYER);
297
298 if (FirstObj == NULL) {
299 FirstObj = Object;
300 CgvNet->USER=Object;
301 }
302
303 Object->USER = (void *) CgvNet;
304 SetXyagCgvNet(Object);
305 Object->LINK = Object;
306
307 if (PrevObj != NULL) {
308 PrevObj->LINK = Object;
309 }
310
311 PrevObj = Object;
312
313 if (IsCgvWireVertical(CgvWir)) {
314 cptmax_wire = 0;
315 cptmin_wire = 0;
316
317 if (CgvWir->Y < CgvWir->DY) {
318 MaxY_wire = CgvWir->DY;
319 MinY_wire = CgvWir->Y;
320 }
321 else {
322 MaxY_wire = CgvWir->Y;
323 MinY_wire = CgvWir->DY;
324 }
325
326 for (ScanWir = CgvNet->WIRE; ScanWir; ScanWir = ScanWir->NEXT) {
327 if (IsCgvWireHorizontal(ScanWir)) {
328 if ((ScanWir->DX == CgvWir->X) || (ScanWir->X == CgvWir->X)) {
329 if ((MinY_wire < ScanWir->Y) && (ScanWir->Y < MaxY_wire)) {
330 Object = XyagAddCircle(X_trace, Y_fig + (ScanWir->DY * XYAG_UNIT), CgvFig->SCALE * XYAG_UNIT / 4, XYAG_CGVNET_LAYER);
331 Object->USER = (void *) CgvNet;
332 SetXyagCgvNet(Object);
333 PrevObj->LINK = Object;
334 PrevObj = Object;
335 }
336
337 if (MaxY_wire != MinY_wire) {
338 if (MaxY_wire == ScanWir->Y) {
339 cptmax_wire++;
340 }
341 if (MinY_wire == ScanWir->Y) {
342 cptmin_wire++;
343 }
344 }
345 }
346 }
347 }
348 if (cptmax_wire >= 2) {
349 Object = XyagAddCircle(X_trace, Y_fig + MaxY_wire * XYAG_UNIT, CgvFig->SCALE * XYAG_UNIT / 4, XYAG_CGVNET_LAYER);
350 Object->USER = (void *) CgvNet;
351 SetXyagCgvNet(Object);
352 PrevObj->LINK = Object;
353 PrevObj = Object;
354 }
355
356 if (cptmin_wire >= 2) {
357 Object = XyagAddCircle(X_trace, Y_fig + MinY_wire * XYAG_UNIT, CgvFig->SCALE * XYAG_UNIT / 4, XYAG_CGVNET_LAYER);
358 Object->USER = (void *) CgvNet;
359 SetXyagCgvNet(Object);
360 PrevObj->LINK = Object;
361 PrevObj = Object;
362 }
363 }
364 }
365 if (PrevObj != NULL)
366 {
367 PrevObj->LINK = FirstObj;
368 }
369 #if 0
370 if (PrevObj != NULL) {
371 PrevObj->LINK = FirstObj;
372 Object = NULL;
373 if (CgvNet->SOURCE_TYPE == CGV_SOURCE_CNSCONE) {
374 CnsCone = (cone_list *) CgvNet->SOURCE;
375 if (CnsCone != NULL) {
376 Object = (xyagobj_list *) getptype(CnsCone->USER, XYAG_USER_OBJECT_CGV)->DATA;
377 }
378 }
379
380 if (CgvNet->SOURCE_TYPE == CGV_SOURCE_CNSCELL) {
381 CnsCell = (cell_list *) CgvNet->SOURCE;
382 if (CnsCell != NULL) {
383 Object = (xyagobj_list *) getptype(CnsCell->USER, XYAG_USER_OBJECT_CGV)->DATA;
384 }
385 }
386
387 if (CgvNet->SOURCE_TYPE == CGV_SOURCE_LOCON) {
388 LoCon = (locon_list *) CgvNet->SOURCE;
389 if (LoCon != NULL) {
390 Object = (xyagobj_list *) getptype(LoCon->USER, XYAG_USER_OBJECT_CGV)->DATA;
391 }
392 }
393
394 if (Object != NULL) {
395 ScanObject = Object;
396 while (ScanObject->LINK != Object) {
397 ScanObject = ScanObject->LINK;
398 }
399 PrevObj->LINK = Object;
400 ScanObject->LINK = FirstObj;
401 }
402 }
403 #endif
404 }
405 }