1 /*------------------------------------------------------------\
7 | Authors : Miramond Benoit |
11 \------------------------------------------------------------*/
28 #include "XYA_place.h"
29 #include "XYA_cgvfig.h"
31 #define IsCgvWireHorizontal(Z) ((Z)->DY == (Z)->Y)
32 #define IsCgvWireVertical(Z) ((Z)->DX == (Z)->X)
34 /*------------------------------------------------------------\
36 \------------------------------------------------------------*/
39 trace_con(con_list
, X
, Y
, LayerCon
, scale
)
40 cgvcon_list
*con_list
;
44 unsigned char LayerCon
;
46 xyagobj_list
*Object1
;
47 xyagobj_list
*Object2
;
51 // cone_list *CnsCone;
60 ray
=scale
* XYAG_UNIT
/ 2;
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
;
66 if (IsCgvConOut(CgvCon
)) {
67 X_con
-= scale
* (XYAG_UNIT
* 2);
70 if (IsCgvConExternal(CgvCon
)) {
71 if (IsCgvConIn(CgvCon
)) {
72 ObjectType
= XYAG_OBJECT_TEXT_LEFT
;
75 ObjectType
= XYAG_OBJECT_TEXT_RIGHT
;
79 if (IsCgvConIn(CgvCon
)) {
80 ObjectType
= XYAG_OBJECT_TEXT_RIGHT
;
83 ObjectType
= XYAG_OBJECT_TEXT_LEFT
;
87 if (ObjectType
== XYAG_OBJECT_TEXT_LEFT
) {
91 DeltaX
= 3 * XYAG_UNIT
;
97 if (!IsCgvConFake(CgvCon
)) {
98 if (IsCgvConExternal(CgvCon
))
99 Object1
= XyagAddHexagon(X_trace
, Y_trace
, scale
* XYAG_UNIT
* 2, scale
* XYAG_UNIT
* 2, LayerCon
);
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;
107 Object1
= XyagAddRectangle(X_trace
-scale
*XYAG_UNIT
/2, Y_trace
+scale
*XYAG_UNIT
/2, scale
*XYAG_UNIT
, scale
*XYAG_UNIT
, LayerCon
);
113 if (!IsCgvConIn(CgvCon
)) {
114 Object1
= XyagAddCircle(X_trace
+ scale
*XYAG_UNIT
* 1 / 2, Y_trace
+ scale
*XYAG_UNIT
, ray
, LayerCon
);
118 Object1
= XyagAddCircle(X_trace
+ scale
*XYAG_UNIT
* 3 / 2, Y_trace
+ scale
*XYAG_UNIT
, ray
, LayerCon
);
122 Object2
= XyagAddText(X_trace
+ DeltaX
, Y_trace
+ XYAG_UNIT
, ObjectType
, CgvCon
->NAME
, LayerCon
,scale
);
123 Object1
->LINK
= Object2
;
124 Object2
->LINK
= Object1
;
126 Object1
->USER
= (void *) CgvCon
;
127 Object2
->USER
= (void *) CgvCon
;
129 SetXyagCgvCon(Object1
);
130 SetXyagCgvCon(Object2
);
132 Box
=(cgvbox_list
*)CgvCon
->ROOT
;
133 // printf("%s\n",Box->NAME);
134 /* if (!IsCgvConExternal(CgvCon))
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);
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
);
150 /*------------------------------------------------------------\
152 \------------------------------------------------------------*/
155 XyagTraceFigure(CgvFig
)
161 cgvwir_list
*ScanWir
;
162 xyagobj_list
*Object
;
163 xyagobj_list
*FirstObj
;
164 xyagobj_list
*PrevObj
;
190 if (CgvFig
->SCALE
== 0)
193 scale
= CgvFig
->SCALE
;
196 for (CgvBox
= CgvFig
->BOX
; CgvBox
; CgvBox
= CgvBox
->NEXT
) {
197 if (IsCgvBoxTransparence(CgvBox
) || IsCgvBoxCluster(CgvBox
)) {
198 Layer
= XYAG_CONSTRUCTION_LAYER
;
201 Layer
= XYAG_CGVBOX_LAYER
;
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
;
209 X_trace
= X_box
+ X_fig
;
210 Y_trace
= Y_box
+ Y_fig
;
212 if( CgvBox
->SYMBOL
== NULL
) {
213 if (CgvBox
->SOURCE_TYPE
== CGV_SOURCE_CNSCONE
) {
214 Object
= XyagAddTriangle(X_trace
, Y_trace
, Dx
, Dy
, Layer
);
216 else if (CgvBox
->SOURCE_TYPE
== CGV_SOURCE_CNSCELL
) {
217 Object
= XyagAddCell(X_trace
, Y_trace
, Dx
, Dy
, Layer
);
220 Object
= XyagAddRectangle(X_trace
, Y_trace
, Dx
, Dy
, Layer
);
224 Object
= XyagAddUserDefined(CgvBox
->SYMBOL
,X_trace
, Y_trace
, Dx
, Dy
, Layer
);
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
;
231 SetXyagCgvBox(Object
);
232 SetXyagCgvBox(Object
->LINK
);
235 if (CgvBox
->SOURCE_TYPE
== CGV_SOURCE_CNSCONE
) {
236 // CgvBox->USER=Object;
238 CnsCone = (cone_list *) CgvBox->SOURCE;
239 CnsCone->USER = addptype(CnsCone->USER, XYAG_USER_OBJECT_CGV, (void *) Object);
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);*/
250 if (CgvBox
->SYMBOL
==NULL
)
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
);
257 for (CgvCon
=CgvBox
->CON_IN
; CgvCon
!=NULL
; CgvCon
=CgvCon
->NEXT
)
259 tmp
=(xyagobj_list
*)CgvCon
->USER
;
261 Object
->LINK
=tmp
->LINK
;
264 for (CgvCon
=CgvBox
->CON_OUT
; CgvCon
!=NULL
; CgvCon
=CgvCon
->NEXT
)
266 tmp
=(xyagobj_list
*)CgvCon
->USER
;
268 Object
->LINK
=tmp
->LINK
;
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
);
283 for (CgvNet
= CgvFig
->NET
; CgvNet
; CgvNet
= CgvNet
->NEXT
) {
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
;
293 X_trace
= X_fig
+ X_wir
;
294 Y_trace
= Y_fig
+ Y_wir
;
296 Object
= XyagAddLine(X_trace
, Y_trace
, DX_wir
+ X_fig
, DY_wir
+ Y_fig
, XYAG_CGVNET_LAYER
, XYAG_CGVNET_LAYER
);
298 if (FirstObj
== NULL
) {
303 Object
->USER
= (void *) CgvNet
;
304 SetXyagCgvNet(Object
);
305 Object
->LINK
= Object
;
307 if (PrevObj
!= NULL
) {
308 PrevObj
->LINK
= Object
;
313 if (IsCgvWireVertical(CgvWir
)) {
317 if (CgvWir
->Y
< CgvWir
->DY
) {
318 MaxY_wire
= CgvWir
->DY
;
319 MinY_wire
= CgvWir
->Y
;
322 MaxY_wire
= CgvWir
->Y
;
323 MinY_wire
= CgvWir
->DY
;
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
;
337 if (MaxY_wire
!= MinY_wire
) {
338 if (MaxY_wire
== ScanWir
->Y
) {
341 if (MinY_wire
== ScanWir
->Y
) {
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
;
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
;
367 PrevObj
->LINK
= FirstObj
;
370 if (PrevObj
!= NULL
) {
371 PrevObj
->LINK
= FirstObj
;
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
;
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
;
387 if (CgvNet
->SOURCE_TYPE
== CGV_SOURCE_LOCON
) {
388 LoCon
= (locon_list
*) CgvNet
->SOURCE
;
390 Object
= (xyagobj_list
*) getptype(LoCon
->USER
, XYAG_USER_OBJECT_CGV
)->DATA
;
394 if (Object
!= NULL
) {
396 while (ScanObject
->LINK
!= Object
) {
397 ScanObject
= ScanObject
->LINK
;
399 PrevObj
->LINK
= Object
;
400 ScanObject
->LINK
= FirstObj
;