1 /*
2 * This file is part of the Alliance CAD System
3 * Copyright (C) Laboratoire LIP6 - D�partement ASIM
4 * Universite Pierre et Marie Curie
5 *
6 * Home page : http://www-asim.lip6.fr/alliance/
7 * E-mail : mailto:alliance-users@asim.lip6.fr
8 *
9 * This progam is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation; either version 2 of the License, or (at your
12 * option) any later version.
13 *
14 * Alliance VLSI CAD System is distributed in the hope that it will be
15 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
17 * Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with the GNU C Library; see the file COPYING. If not, write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 */
23
24 /****************************************************************************/
25 /* */
26 /* Chaine de CAO & VLSI Alliance */
27 /* */
28 /* Produit : ring router */
29 /* Fichier : deport.c */
30 /* */
31 /* (c) copyright 1992 Laboratoire MASI equipe CAO & VLSI */
32 /* Tous droits reserves */
33 /* Support : e-mail cao-vlsi@masi.ibp.fr */
34 /* */
35 /* Ecrit par : Olivier Van Hautte le : 01/08/92 */
36 /* Modifie par : Franck Wajsburt le : 9/11/94 */
37 /* */
38 /****************************************************************************/
39
40 /*-----------------------------------------------------------------------------------*/
41 /* RING 17 juillet 92 DEPORT.C */
42 /* traitement des deports (y compris alim) */
43 /* et pose des segments pour les deports (hors alim) */
44 /*-----------------------------------------------------------------------------------*/
45
46 #include "deport.h"
47 #include "placement.h"
48 #include "sesame.h"
49
50 /*-----------------------------------------------------------------------------------*/
51 /* Attribution des couronnes d'alimentation de maniere a avoir le moins de fils a */
52 /* tirer pour la couronne inferieure . Exception: si alim ds mauvais layer, on */
53 /* essayre de s'arranger pour mettre ce type d'alim en couronne superieure (on tirera*/
54 /* directement le fil dans le mauvais layer */
55 /*-----------------------------------------------------------------------------------*/
56
attribuer_couronne_alim(LST_EQUIPO lst_equipo,char ** coursup,char ** courinf)57 void attribuer_couronne_alim(LST_EQUIPO lst_equipo, char **coursup, char **courinf)
58 {
59
60 LST_EQUIPO equipo_vdd, equipo_vss;
61 LST_PSEUDO_CON con;
62 ptype_list * ptvdd = NULL , *ptvss = NULL, *ptcour;
63 int hyp1, hyp2, vddequi = 0, vddtotal = 0, vssequi = 0, vsstotal = 0;
64 char *alim;
65
66 recherche_equipo_alim(&equipo_vdd, &equipo_vss, lst_equipo);
67
68 ptvdd = equipo_vdd->lst_visavis;
69 ptvss = equipo_vss->lst_visavis;
70
71 /* -------------------------- */
72 /* trt des visavis equipo vdd */
73 /* -------------------------- */
74
75 ptcour = ptvdd;
76 while (ptcour != NULL) {
77 con = (LST_PSEUDO_CON) ptcour->DATA;
78
79 if (mode_debug)
80 printf("visavis vdd %s\n", con->nom_con);
81
82 if (con->nom_con == eq_vdd) {
83 vddequi++;
84 vddtotal++;
85 } else if (con->nom_con == eq_vss)
86 vddtotal++;
87
88 ptcour = ptcour->NEXT;
89 }
90
91 /* -------------------------- */
92 /* trt des visavis equipo vss */
93 /* -------------------------- */
94
95 ptcour = ptvss;
96 while (ptcour != NULL) {
97 con = (LST_PSEUDO_CON) ptcour->DATA;
98
99 if (mode_debug)
100 printf("visavis vss %s\n", con->nom_con);
101
102 if (con->nom_con == eq_vss) {
103 vssequi++;
104 vsstotal++;
105 } else if (con->nom_con == eq_vdd)
106 vsstotal++;
107
108 ptcour = ptcour->NEXT;
109 }
110
111 hyp1 = vsstotal + vddequi;
112 hyp2 = vddtotal + vssequi;
113
114 if ((alim = existe_unique_deport_alim(equipo_vdd, equipo_vss)) == NULL)
115 if (hyp1 < hyp2) {
116 *courinf = eq_vss;
117 *coursup = eq_vdd;
118 }
119 else {
120 *courinf = eq_vdd;
121 *coursup = eq_vss;
122 }
123 else
124 {
125 if (mode_debug)
126 printf("Unique deport trouve %s\n", alim);
127 if (alim == eq_vss) {
128 *courinf = eq_vdd;
129 *coursup = eq_vss;
130 } else {
131 *courinf = eq_vss;
132 *coursup = eq_vdd;
133 }
134 }
135
136 if (mode_debug)
137 printf("COURSUP %s courinf %s vddtotal %d vsstotal %d vddequi %d vssequi %d\n", *coursup, *courinf, vddtotal,
138 vsstotal, vddequi, vssequi);
139 }
140
141 /*------------------------------------------------------------------------------*/
142 /* Retourne le nom de l'equipo alim ssi unique deport pour les alim */
143 /*------------------------------------------------------------------------------*/
144
existe_unique_deport_alim(LST_EQUIPO equipo_vdd,LST_EQUIPO equipo_vss)145 char* existe_unique_deport_alim(LST_EQUIPO equipo_vdd, LST_EQUIPO equipo_vss)
146 {
147 LST_PSEUDO_CON con;
148 chain_list * ptvdd = NULL , *ptvss = NULL, *ptcour;
149
150 int trouvevdd = 0, trouvevss = 0;
151
152 ptvdd = equipo_vdd->lst_con;
153 ptvss = equipo_vss->lst_con;
154
155 ptcour = ptvdd;
156
157 while (ptcour != NULL) {
158 con = (LST_PSEUDO_CON) ptcour->DATA;
159 if ((con->coeur_plot == PLOT_CON) && (con->deport != NULL))
160 trouvevdd = 1;
161 ptcour = ptcour->NEXT;
162 }
163
164 ptcour = ptvss;
165
166 while (ptcour != NULL) {
167 con = (LST_PSEUDO_CON) ptcour->DATA;
168 if ((con->coeur_plot == PLOT_CON) && (con->deport != NULL))
169 trouvevss = 1;
170 ptcour = ptcour->NEXT;
171 }
172
173 if ((trouvevdd && trouvevss) == 0)
174 if (trouvevdd)
175 return(eq_vdd);
176 else if (trouvevss)
177 return(eq_vss);
178 else
179 return(NULL);
180
181 else
182 return(NULL);
183
184 }
185
186 /*-----------------------------------------------------------------------------------------*/
187 /* trt des deports d'alim: pour le coeur changement layer ds ts les cas, prend une */
188 /* piste, ou plus si largeur du connecteur non standart. */
189 /* pour les plots, si coursup = alim mauvais layer, on ne deporte */
190 /* pas, sinon on deporte quand meme. */
191 /* */
192 /* trt des vis a vis d'alim: si elles se croisent et non equi, on deporte alim coeur */
193 /* (cherche_deport_alim) */
194 /* on occupe les colonnes avoisinantes pour la taille du fil */
195 /* si elles se croisent et equi, et croisement < largfil /2 */
196 /* on deporte aussi. */
197 /*SI DEPORT PLOT ALIM (MAUVAIS LAYER) => ALLOCATION EXCEPTIONNELLE DE FAUX SEGMENTS */
198 /*-----------------------------------------------------------------------------------------*/
199
deport_alim(LST_EQUIPO lst_equipo,BARRE_PLOTS tab_plots[NB_FACES],char * coursup,char * courinf,LST_SEGMENT segx_occ[NB_FACES],LST_SEGMENT segy_occ[NB_FACES])200 void deport_alim(LST_EQUIPO lst_equipo, BARRE_PLOTS tab_plots[NB_FACES],
201 char *coursup, char *courinf, LST_SEGMENT segx_occ[NB_FACES],
202 LST_SEGMENT segy_occ[NB_FACES])
203 {
204 PT_COORDONNEES lst_coor, ptcoor;
205 LST_EQUIPO equipo_vdd, equipo_vss;
206 LST_PSEUDO_CON con;
207 chain_list * ptvdd = NULL , *ptvss = NULL, *ptcour;
208 ptype_list * ptvddvav = NULL , *ptvssvav = NULL, *ptcourvav;
209 long largeurmin = 0;
210 int i, nbcolatrouver, face;
211 long largmetalpiste, largmetalcol, piste;
212 char niveaupiste;
213 LST_SEGMENT * segpiste;
214
215 recherche_equipo_alim(&equipo_vdd, &equipo_vss, lst_equipo);
216
217 ptvdd = equipo_vdd->lst_con;
218 ptvss = equipo_vss->lst_con;
219
220 ptvddvav = equipo_vdd->lst_visavis;
221 ptvssvav = equipo_vss->lst_visavis;
222
223 for (face = 0; face < NB_FACES; face++) {
224 segx_occ[face] = NULL; /* INITIALISATION DES SEGMENTS */
225 segy_occ[face] = NULL;
226 }
227
228 /* ---------------------------- */
229 /* traitement des deports layer */
230 /* ---------------------------- */
231
232 ptcour = ptvdd;
233
234 while (ptcour != NULL) {
235 con = (LST_PSEUDO_CON) ptcour->DATA;
236 if ((con->coeur_plot == PLOT_CON) && (con->deport != NULL)) {
237 if (con->nom_con != coursup)
238
239 /* -------------------------------------- */
240 /* foutu, on est oblige de deporter arghh */
241 /* -------------------------------------- */
242
243 switch (con->face) {
244 case NORD:
245 case SUD :
246 niveaupiste = xmetal;
247 //segcol = segy_occ;
248 segpiste = segx_occ;
249 largmetalpiste = xmetal_width;
250 largmetalcol = ymetal_width;
251
252 if (mode_debug)
253 printf("deport alimplot layer %s\n", con->nom_con);
254 (con->deport)->xabs = (con->coord)->xabs;
255 (con->deport)->piste = (tab_plots[con->face].coord).piste - (con->largeur + pitch)
256 / pitch;
257
258 /* ------------------------------------------------- */
259 /* allocation de faux segments si deport alim plot ! */
260 /* ------------------------------------------------- */
261
262 if (con->largeur > largmetalcol) {
263 for (piste = tab_plots[con->face].coord.piste - 1; piste >= (con->deport->piste -
264 (con->largeur / 2 + pitch) / pitch); piste--)
265 alloue_etchaine_segment(con->coord, con->coord, piste, piste, con->face,
266 SEG_PISTE, segpiste, largmetalpiste, niveaupiste, FAUX_SEG, AVEC_VIA,
267 equipo_vdd);
268 }
269
270 break;
271
272 case EST :
273 case OUEST:
274 niveaupiste = ymetal;
275 //segcol = segx_occ;
276 segpiste = segy_occ;
277 largmetalpiste = ymetal_width;
278 largmetalcol = xmetal_width;
279
280 if (mode_debug)
281 printf("deport alimplot layer %s\n", con->nom_con);
282 (con->deport)->yabs = (con->coord)->yabs;
283 (con->deport)->piste = (tab_plots[con->face].coord).piste - (con->largeur + pitch)
284 / pitch;
285
286 /* ------------------------------------------------- */
287 /* allocation de faux segments si deport alim plot ! */
288 /* ------------------------------------------------- */
289
290 if (con->largeur > largmetalcol) {
291 for (piste = tab_plots[con->face].coord.piste - 1; piste >= (con->deport->piste -
292 (con->largeur / 2 + pitch) / pitch); piste--)
293 alloue_etchaine_segment(con->coord, con->coord, piste, piste, con->face,
294 SEG_PISTE, segpiste, largmetalpiste, niveaupiste, FAUX_SEG, AVEC_VIA,
295 equipo_vdd);
296 }
297
298 break;
299 }
300 } /* fin du if */ else if (con->deport != NULL) /* deport coeur */
301 switch (con->face) {
302 case NORD:
303 case SUD :
304 largeurmin = ymetal_width;
305 if (mode_debug)
306 printf("deport coeuralim layer %s\n", con->nom_con);
307 (con->deport)->xabs = (con->coord)->xabs;
308 if (con->largeur > largeurmin)
309 (con->deport)->piste = (con->largeur + pitch) / pitch;
310 else
311 (con->deport)->piste = 1; /* premiere piste pour deport layer */
312
313 break;
314
315 case EST :
316 case OUEST:
317 largeurmin = xmetal_width;
318 if (mode_debug)
319 printf("deport coeuralim layer %s\n", con->nom_con);
320 (con->deport)->yabs = (con->coord)->yabs;
321 if (con->largeur > largeurmin)
322 (con->deport)->piste = (con->largeur + pitch) / pitch;
323 else
324 (con->deport)->piste = 1; /* premiere piste pour deport layer */
325
326 break;
327 }
328
329 ptcour = ptcour->NEXT;
330 }
331
332 ptcour = ptvss;
333
334 while (ptcour != NULL) {
335 con = (LST_PSEUDO_CON) ptcour->DATA;
336 if ((con->coeur_plot == PLOT_CON) && (con->deport != NULL)) {
337 if (con->nom_con != coursup)
338
339 /* -------------------------------------- */
340 /* foutu, on est oblige de deporter arghh */
341 /* -------------------------------------- */
342
343 switch (con->face) {
344 case NORD:
345 case SUD :
346 niveaupiste = xmetal;
347 //segcol = segy_occ;
348 segpiste = segx_occ;
349 largmetalpiste = xmetal_width;
350 largmetalcol = ymetal_width;
351
352 if (mode_debug)
353 printf("deport alimplot layer %s\n", con->nom_con);
354 (con->deport)->xabs = (con->coord)->xabs;
355 (con->deport)->piste = (tab_plots[con->face].coord).piste - (con->largeur + pitch) / pitch;
356
357 /* ------------------------------------------------- */
358 /* allocation de faux segments si deport alim plot ! */
359 /* ------------------------------------------------- */
360
361 if (con->largeur > largmetalcol) {
362 for (piste = tab_plots[con->face].coord.piste - 1; piste >= (con->deport->piste -
363 (con->largeur / 2 + pitch) / pitch); piste--)
364 alloue_etchaine_segment(con->coord, con->coord, piste, piste, con->face,
365 SEG_PISTE, segpiste, largmetalpiste, niveaupiste, FAUX_SEG, AVEC_VIA,
366 equipo_vss);
367 }
368
369 break;
370
371 case EST :
372 case OUEST:
373 niveaupiste = ymetal;
374 //segcol = segx_occ;
375 segpiste = segy_occ;
376 largmetalpiste = ymetal_width;
377 largmetalcol = xmetal_width;
378
379 if (mode_debug)
380 printf("deport alimplot layer %s\n", con->nom_con);
381 (con->deport)->yabs = (con->coord)->yabs;
382 (con->deport)->piste = (tab_plots[con->face].coord).piste - (con->largeur + pitch)
383 / pitch;
384
385 /* ------------------------------------------------- */
386 /* allocation de faux segments si deport alim plot ! */
387 /* ------------------------------------------------- */
388
389 if (con->largeur > largmetalcol) {
390 for (piste = tab_plots[con->face].coord.piste - 1; piste >= (con->deport->piste -
391 (con->largeur / 2 + pitch) / pitch); piste--)
392 alloue_etchaine_segment(con->coord, con->coord, piste, piste, con->face,
393 SEG_PISTE, segpiste, largmetalpiste, niveaupiste, FAUX_SEG, AVEC_VIA,
394 equipo_vss);
395 }
396
397 break;
398 }
399 } /* fin du if */ else if (con->deport != NULL) /* deport coeur */
400 switch (con->face) {
401 case NORD:
402 case SUD :
403 if (mode_debug)
404 printf("deport coeuralim layer %s\n", con->nom_con);
405 (con->deport)->xabs = (con->coord)->xabs;
406 if (con->largeur > largeurmin)
407 (con->deport)->piste = (con->largeur + pitch) / pitch;
408 else
409 (con->deport)->piste = 1; /* premiere piste pour deport layer */
410
411 break;
412
413 case EST :
414 case OUEST:
415 if (mode_debug)
416 printf("deport coeuralim layer %s\n", con->nom_con);
417 (con->deport)->yabs = (con->coord)->yabs;
418 if (con->largeur > largeurmin)
419 (con->deport)->piste = (con->largeur + pitch) / pitch;
420 else
421 (con->deport)->piste = 1; /* premiere piste pour deport layer */
422
423 break;
424 }
425
426 ptcour = ptcour->NEXT;
427 }
428
429 /*-----------------------------------------------------------------------------------*/
430 /* traitement des vis a vis coeur alim, si alim <> et se croisent on deporte */
431 /* si alim = et croisement < largfil /2 */
432 /*-----------------------------------------------------------------------------------*/
433
434 if (mode_debug)
435 printf("traitement des vis a vis alim\n");
436
437 ptcourvav = ptvddvav;
438
439 while (ptcourvav != NULL) {
440 con = (LST_PSEUDO_CON) ptcourvav->DATA;
441 if ((con->coeur_plot == COEUR_CON) && (con->nom_con == eq_vss) && (courinf == eq_vdd)) {
442
443 /* -------------------------------------- */
444 /* foutu, on est oblige de deporter arghh */
445 /* -------------------------------------- */
446
447 if (mode_debug)
448 printf("\n**** alim visavis coeur vss %s\t", con->con_lo->NAME);
449 ptcoor = cherche_deport_grille(con, ptvdd);
450
451 /* ------------------------------------------------------- */
452 /* Occupation des colonnes necessaires au deport de l'alim */
453 /* ------------------------------------------------------- */
454
455 nbcolatrouver = (con->largeur + pitch) / (2 * pitch);
456 lst_coor = ptcoor->suiv;
457 for (i = 0; i < nbcolatrouver; i++)
458 if ((NULL != lst_coor) && (NULL == lst_coor->proprio)) {
459 if (mode_debug)
460 printf("colonne occupee par deport x %ld y %ld\n", lst_coor->xabs, lst_coor->yabs);
461 lst_coor->proprio = (void * )con;
462 lst_coor = lst_coor->suiv;
463 }
464
465 lst_coor = ptcoor->prec;
466 for (i = 0; i < nbcolatrouver; i++)
467 if ((NULL != lst_coor) && (NULL == lst_coor->proprio)) {
468 if (mode_debug)
469 printf("colonne occupee par deport x %ld y %ld\n", lst_coor->xabs, lst_coor->yabs);
470 lst_coor->proprio = (void * )con;
471 lst_coor = lst_coor->prec;
472 }
473
474 con->deport = ptcoor;
475 ptcoor->proprio = (void * ) con;
476 if (mode_debug)
477 printf("deport alim coeur trouve %ld %ld\n", ptcoor->xabs, ptcoor->yabs);
478
479 }
480
481 if ((con->coeur_plot == COEUR_CON) && (con->nom_con == eq_vdd) && (!croisementok_alimequi(con, ptvdd, SANS_TESTLAYER))) {
482
483 /* -------------------------------------- */
484 /* foutu, on est oblige de deporter arghh */
485 /* -------------------------------------- */
486
487 if (mode_debug)
488 printf("\n**** alim equi visavis coeur vdd %s\t", con->con_lo->NAME);
489 ptcoor = cherche_deport_grille(con, ptvdd);
490
491 /* ------------------------------------------------------- */
492 /* Occupation des colonnes necessaires au deport de l'alim */
493 /* ------------------------------------------------------- */
494
495 nbcolatrouver = (con->largeur + pitch) / (2 * pitch);
496 lst_coor = ptcoor->suiv;
497 for (i = 0; i < nbcolatrouver; i++)
498 if ((NULL != lst_coor) && (NULL == lst_coor->proprio)) {
499 if (mode_debug)
500 printf("colonne occupee par deport x %ld y %ld\n", lst_coor->xabs, lst_coor->yabs);
501 lst_coor->proprio = (void * )con;
502 lst_coor = lst_coor->suiv;
503 }
504
505 lst_coor = ptcoor->prec;
506 for (i = 0; i < nbcolatrouver; i++)
507 if ((NULL != lst_coor) && (NULL == lst_coor->proprio)) {
508 if (mode_debug)
509 printf("colonne occupee par deport x %ld y %ld\n", lst_coor->xabs, lst_coor->yabs);
510 lst_coor->proprio = (void * )con;
511 lst_coor = lst_coor->prec;
512 }
513
514 con->deport = ptcoor;
515 ptcoor->proprio = (void * ) con;
516 if (mode_debug)
517 printf("deport alim coeur trouve %ld %ld\n", ptcoor->xabs, ptcoor->yabs);
518
519 }
520
521 ptcourvav = ptcourvav->NEXT;
522 }
523
524 ptcourvav = ptvssvav;
525
526 while (ptcourvav != NULL) {
527 con = (LST_PSEUDO_CON) ptcourvav->DATA;
528 if ((con->coeur_plot == COEUR_CON) && (con->nom_con == eq_vdd) && (courinf == eq_vss)) {
529
530 /* -------------------------------------- */
531 /* foutu, on est oblige de deporter arghh */
532 /* -------------------------------------- */
533
534 if (mode_debug)
535 printf("\n**** alim visavis coeur vdd %s\t", con->con_lo->NAME);
536 ptcoor = cherche_deport_grille(con, ptvss);
537
538 /* ------------------------------------------------------- */
539 /* Occupation des colonnes necessaires au deport de l'alim */
540 /* ------------------------------------------------------- */
541
542 nbcolatrouver = (con->largeur + pitch) / (2 * pitch);
543 lst_coor = ptcoor->suiv;
544 for (i = 0; i < nbcolatrouver; i++)
545 if ((NULL != lst_coor) && (NULL == lst_coor->proprio)) {
546 if (mode_debug)
547 printf("colonne occupee par deport x %ld y %ld\n", lst_coor->xabs, lst_coor->yabs);
548 lst_coor->proprio = (void * )con;
549 lst_coor = lst_coor->suiv;
550 }
551
552 lst_coor = ptcoor->prec;
553 for (i = 0; i < nbcolatrouver; i++)
554 if ((NULL != lst_coor) && (NULL == lst_coor->proprio)) {
555 if (mode_debug)
556 printf("colonne occupee par deport x %ld y %ld\n", lst_coor->xabs, lst_coor->yabs);
557 lst_coor->proprio = (void * )con;
558 lst_coor = lst_coor->prec;
559 }
560
561 con->deport = ptcoor;
562 ptcoor->proprio = (void * ) con;
563 if (mode_debug)
564 printf("deport alim coeur trouve %ld %ld\n", ptcoor->xabs, ptcoor->yabs);
565
566 }
567
568 if ((con->coeur_plot == COEUR_CON) && (con->nom_con == eq_vss) && (!croisementok_alimequi(con, ptvss, SANS_TESTLAYER))) {
569
570 /* -------------------------------------- */
571 /* foutu, on est oblige de deporter arghh */
572 /* -------------------------------------- */
573
574 if (mode_debug)
575 printf("\n**** alim equi visavis coeur vss %s\t", con->con_lo->NAME);
576 ptcoor = cherche_deport_grille(con, ptvss);
577
578 /* ------------------------------------------------------- */
579 /* Occupation des colonnes necessaires au deport de l'alim */
580 /* ------------------------------------------------------- */
581
582 nbcolatrouver = (con->largeur + pitch) / (2 * pitch);
583 lst_coor = ptcoor->suiv;
584 for (i = 0; i < nbcolatrouver; i++)
585 if ((NULL != lst_coor) && (NULL == lst_coor->proprio)) {
586 if (mode_debug)
587 printf("colonne occupee par deport x %ld y %ld\n", lst_coor->xabs, lst_coor->yabs);
588 lst_coor->proprio = (void * )con;
589 lst_coor = lst_coor->suiv;
590 }
591
592 lst_coor = ptcoor->prec;
593 for (i = 0; i < nbcolatrouver; i++)
594 if ((NULL != lst_coor) && (NULL == lst_coor->proprio)) {
595 if (mode_debug)
596 printf("colonne occupee par deport x %ld y %ld\n", lst_coor->xabs, lst_coor->yabs);
597 lst_coor->proprio = (void * )con;
598 lst_coor = lst_coor->prec;
599 }
600
601 con->deport = ptcoor;
602 ptcoor->proprio = (void * ) con;
603 if (mode_debug)
604 printf("deport alim coeur trouve %ld %ld\n", ptcoor->xabs, ptcoor->yabs);
605
606 }
607
608 ptcourvav = ptcourvav->NEXT;
609 }
610
611 }
612
613 /*------------------------------------------------------------------------------------*/
614 /* Traitement de tous les deports coeur et plot sauf alim (deja fait) */
615 /* on commence par traiter les deports qui sont en face du coeur, */
616 /* puis les deports gauches */
617 /* puis les deports droits */
618 /*------------------------------------------------------------------------------------*/
619
deport_connecteurs(BARRE_PLOTS tab_plots[NB_FACES],LST_PSEUDO_CON tab_coeur[NB_FACES],COEUR lecoeur,GRILLE tab_grilles[NB_FACES])620 void deport_connecteurs(BARRE_PLOTS tab_plots[NB_FACES],
621 LST_PSEUDO_CON tab_coeur[NB_FACES],
622 COEUR lecoeur, GRILLE tab_grilles[NB_FACES])
623 {
624
625 int face, trouve;
626 long /*pistelayercentre, pistelayergauche, pistelayerdroite,*/ piste, pistederniere;
627 long largeurmin;
628
629 LST_PSEUDO_CON liste_coeur, liste_plots, ptcentre, ptdernier;
630 PT_COORDONNEES ptcoor, ptqueue;
631
632 for (face = 0; face < NB_FACES; face++) {
633
634 if (mode_debug)
635 printf("FACE %d\n", face);
636
637 /* --------------------------------------------------- */
638 /* Tous les connecteurs coeur/plot trt layer sauf alim */
639 /* Quand on est dans la croix du coeur trt specialu */
640 /* --------------------------------------------------- */
641
642 liste_plots = tab_plots[face].lst_con;
643 liste_coeur = tab_coeur[face];
644 //pistelayergauche = 0;
645 //pistelayerdroite = 0;
646 //pistelayercentre = 0;
647 ptcentre = NULL;
648 ptdernier = NULL;
649 pistederniere = (tab_plots[face].coord).piste;
650
651 switch (face) {
652 case NORD:
653 case SUD :
654
655 /* ------------------------------------------------------------------------------------------------------------------- */
656 /* ptcentre debut conplots dans la face du coeur, ptdernier dernier conplot normalement en dehors de la croix du coeur */
657 /* ------------------------------------------------------------------------------------------------------------------- */
658
659 largeurmin = ymetal_width;
660
661 while (liste_plots != NULL) {
662 if ((liste_plots->coord)->xabs >= (lecoeur.coord).xabs) {
663 if ((liste_plots->prec == NULL) || (((liste_plots->prec)->coord)->xabs < (lecoeur.coord).xabs))
664 ptcentre = liste_plots;
665 }
666 if (liste_plots->suiv == NULL)
667 ptdernier = liste_plots;
668
669 liste_plots = liste_plots->suiv;
670 }
671
672 /*------------------- TRT DES DEPORTS DES CONPLOTS DU CENTRE ---------------------- */
673
674 while ((ptcentre != NULL) && ((ptcentre->coord)->xabs <= ((lecoeur.coord).xabs + lecoeur.width))) {
675 if ((ptcentre->nom_con != eq_vdd) && (ptcentre->nom_con != eq_vss))
676
677 if (ptcentre->deport != NULL) {
678 ptcentre->situe_deport = DEPORTC;
679
680 if (mode_debug)
681 printf("deport centre con %s %s piste%ld\n", ptcentre->nom_con,
682 ((loins_list *)(ptcentre->con_lo)->ROOT)->INSNAME, (ptcentre->deport)->piste);
683 //pistelayercentre = 1;
684 if ((ptcentre->deport)->piste != 1) /* pas uniquement layer */ {
685
686 /*----------------------------------------------------------------------------*/
687 /* Le deport n'est pas chaine dans la grille , donc on appelle la procedure */
688 /* qui modifie ses pointeurs suiv et prec */
689 /*----------------------------------------------------------------------------*/
690
691 chaine_deportcon_grille(ptcentre->coord, tab_grilles[face].lst_pas,
692 face);
693
694 /* ----------------------------------------- */
695 /* on marque qu'il existe des deports layers */
696 /* ----------------------------------------- */
697
698 //if (ptcentre->layer != ymetal)
699 // pistelayercentre = 1;
700
701 if (((ptcentre->coord)->prec != NULL) && (((ptcentre->coord)->prec)->proprio ==
702 NULL)) /*gauche */ {
703 ptcentre->deport = (ptcentre->coord)->prec;
704 (ptcentre->deport)->proprio = (void * )ptcentre;
705 (ptcentre->deport)->piste = pistederniere - 1; /* 1ere piste */
706 } else if (((ptcentre->coord)->suiv != NULL) && (((ptcentre->coord)->suiv)->proprio ==
707 NULL)) /* droite */ {
708 ptcentre->deport = (ptcentre->coord)->suiv;
709 (ptcentre->deport)->proprio = (void * ) ptcentre;
710 (ptcentre->deport)->piste = pistederniere - 1; /* 1ere piste */
711 } else
712 ringerreur(ERR_ECHECDEPORT, (void * )ptcentre, NULL);
713 } else /* trt layer unique */ {
714 (ptcentre->deport)->xabs = (ptcentre->coord)->xabs;
715 (ptcentre->deport)->piste = pistederniere - 1; /* 1ere piste */
716 }
717
718 } /* fin trt deport */
719 ptcentre = ptcentre->suiv;
720
721 } /* fin trt centre */
722
723 /*-------------- TRT DES DEPORTS GAUCHE EN DEHORS DE FACE COEUR --------------------- */
724
725 liste_plots = tab_plots[face].lst_con;
726 piste = pistederniere - 2; /* on laisse une piste pour les deports */
727
728 while ((liste_plots != NULL) && ((liste_plots->coord)->xabs < (lecoeur.coord).xabs)) {
729 //if (liste_plots->deport->piste == 1)
730 // pistelayergauche = 1;
731
732 /* -------------------- */
733 /* ds ts les cas deport */
734 /* -------------------- */
735
736 liste_plots->situe_deport = DEPORTG;
737
738 if (mode_debug)
739 printf("deport gauche con %s %s\n", liste_plots->nom_con, ((loins_list * )(liste_plots->con_lo)->ROOT)->INSNAME);
740 trouve = 0;
741
742 ptcoor = tab_grilles[face].lst_pas;
743 while (ptcoor != NULL) {
744 trouve = (ptcoor->proprio == NULL);
745 if (trouve)
746 break;
747 ptcoor = ptcoor->suiv;
748 }
749
750 if (trouve) {
751 ptcoor->piste = piste;
752 ptcoor->proprio = (void * ) liste_plots;
753 piste--;
754 liste_plots->deport = ptcoor;
755 } else
756 ringerreur(ERR_ECHECDEPORT, liste_plots, NULL);
757
758 liste_plots = liste_plots->suiv;
759 }
760
761 /*------------- TRT DES DEPORTS DROIT EN DEHORS FACE COEUR --------------------------*/
762
763 ptqueue = tab_grilles[face].lst_pas;
764 while ((ptqueue != NULL) && (ptqueue->suiv != NULL))
765 ptqueue = ptqueue->suiv;
766
767 piste = pistederniere - 2; /* on laisse une piste pour les deports */
768
769 while ((ptdernier != NULL) && ((ptdernier->coord)->xabs > ((lecoeur.coord).xabs + lecoeur.width))) {
770 //if ((ptdernier->deport)->piste == 1)
771 // pistelayerdroite = 1;
772
773 /* -------------------- */
774 /* ds ts les cas deport */
775 /* -------------------- */
776
777 ptdernier->situe_deport = DEPORTD;
778
779 if (mode_debug)
780 printf("deport droite con %s %s\n", ptdernier->nom_con, ((loins_list * )(ptdernier->con_lo)->ROOT)->INSNAME);
781
782 trouve = 0;
783
784 ptcoor = ptqueue;
785 while (ptcoor != NULL) {
786 if (mode_debug)
787 printf("coord x%ld y%ld \n", ptcoor->xabs, ptcoor->yabs);
788
789 trouve = (ptcoor->proprio == NULL);
790 if (trouve)
791 break;
792 ptcoor = ptcoor->prec;
793 }
794
795 if (trouve) {
796 ptcoor->piste = piste;
797 ptcoor->proprio = (void * ) ptdernier;
798 piste--;
799 ptdernier->deport = ptcoor;
800 } else
801 ringerreur(ERR_ECHECDEPORT, ptdernier, NULL);
802
803 ptdernier = ptdernier->prec;
804 }
805
806 /*---------------------- TRT DES CONCOEUR, DEPORT LAYER UNIQUEMENT --------------------*/
807
808 while (liste_coeur != NULL) {
809 if ((liste_coeur->deport != NULL) && (liste_coeur->nom_con != eq_vdd) && (liste_coeur->nom_con !=
810 eq_vss)) /* changement layer */ {
811 liste_coeur->situe_deport = DEPORTC;
812 liste_coeur->deport->xabs = (liste_coeur->coord)->xabs;
813 if (liste_coeur->largeur > largeurmin)
814 (liste_coeur->deport)->piste = (liste_coeur->largeur + pitch) / pitch;
815 else
816 (liste_coeur->deport)->piste = 1; /* premiere piste pour deport layer */
817 if (mode_debug)
818 printf("Deport layer concoeur %s piste %ld largeur %ld\n", liste_coeur->nom_con,
819 liste_coeur->deport->piste, liste_coeur->largeur);
820 }
821 liste_coeur = liste_coeur->suiv;
822 }
823
824 break;
825
826 case EST :
827 case OUEST:
828
829 /* ------------------------------------------------------------------------------------------------------------------- */
830 /* ptcentre debut conplots dans la face du coeur, ptdernier dernier conplot normalement en dehors de la croix du coeur */
831 /* ------------------------------------------------------------------------------------------------------------------- */
832
833 largeurmin = xmetal_width;
834
835 while (liste_plots != NULL) {
836 if ((liste_plots->coord)->yabs >= (lecoeur.coord).yabs) {
837 if ((liste_plots->prec == NULL) || (((liste_plots->prec)->coord)->yabs < (lecoeur.coord).yabs))
838 ptcentre = liste_plots;
839 }
840 if (liste_plots->suiv == NULL)
841 ptdernier = liste_plots;
842
843 liste_plots = liste_plots->suiv;
844 }
845
846 /*------------------ TRT DES DEPORTS DES CONPLOTS DU CENTRE --------------------------*/
847
848 while ((ptcentre != NULL) && ((ptcentre->coord)->yabs <= ((lecoeur.coord).yabs + lecoeur.height))) {
849 if ((ptcentre->nom_con != eq_vdd) && (ptcentre->nom_con != eq_vss))
850
851 if (ptcentre->deport != NULL) {
852 ptcentre->situe_deport = DEPORTC;
853 //pistelayercentre = 1;
854 if ((ptcentre->deport)->piste != 1) /* pas uniquement layer */ {
855 if (mode_debug)
856 printf("deport centre con %s %s piste%ld\n", ptcentre->nom_con,
857 ((loins_list * )(ptcentre->con_lo)->ROOT)->INSNAME, (ptcentre->deport)->piste);
858
859 /* ------------------------------------------------------------------------ */
860 /* Le deport n'est pas chaine dans la grille , donc on appelle la procedure */
861 /* qui modifie ses pointeurs suiv et prec */
862 /* ------------------------------------------------------------------------ */
863
864 chaine_deportcon_grille(ptcentre->coord, tab_grilles[face].lst_pas,
865 face);
866
867 /* ----------------------------------------- */
868 /* on marque qu'il existe des deports layers */
869 /* ----------------------------------------- */
870
871 //if (ptcentre->layer != xmetal)
872 // pistelayercentre = 1;
873
874 if (((ptcentre->coord)->prec != NULL) && (((ptcentre->coord)->prec)->proprio ==
875 NULL)) /*gauche */ {
876 ptcentre->deport = (ptcentre->coord)->prec;
877 (ptcentre->deport)->proprio = (void * )ptcentre;
878 (ptcentre->deport)->piste = pistederniere - 1; /* 1ere piste */
879 } else if (((ptcentre->coord)->suiv != NULL) && (((ptcentre->coord)->suiv)->proprio ==
880 NULL)) /* droite */ {
881 ptcentre->deport = (ptcentre->coord)->suiv;
882 (ptcentre->deport)->proprio = (void * ) ptcentre;
883 (ptcentre->deport)->piste = pistederniere - 1; /* 1ere piste */
884 } else
885 ringerreur(ERR_ECHECDEPORT, ptcentre, NULL);
886 } else /* trt layer unique */ {
887 (ptcentre->deport)->yabs = (ptcentre->coord)->yabs;
888 (ptcentre->deport)->piste = pistederniere - 1; /* 1ere piste */
889 }
890
891 } /* fin trt deport */
892 ptcentre = ptcentre->suiv;
893
894 } /* fin trt centre */
895
896 /*--------------- TRT DES DEPORTS GAUCHE EN DEHORS DE FACE COEUR -------------------- */
897
898 liste_plots = tab_plots[face].lst_con;
899 piste = pistederniere - 2; /* on laisse une piste pour les deports */
900
901 while ((liste_plots != NULL) && ((liste_plots->coord)->yabs < (lecoeur.coord).yabs)) {
902 //if (liste_plots->deport->piste == 1)
903 // pistelayergauche = 1;
904 /* ds ts les cas deport */
905
906 liste_plots->situe_deport = DEPORTG;
907
908 if (mode_debug)
909 printf("deport gauche con %s %s\n", liste_plots->nom_con, ((loins_list * )(liste_plots->con_lo)->ROOT)->INSNAME);
910
911 trouve = 0;
912
913 ptcoor = tab_grilles[face].lst_pas;
914 while (ptcoor != NULL) {
915 trouve = (ptcoor->proprio == NULL);
916 if (trouve)
917 break;
918 ptcoor = ptcoor->suiv;
919 }
920
921 if (trouve) {
922 ptcoor->piste = piste;
923 ptcoor->proprio = (void * ) liste_plots;
924 piste--;
925 liste_plots->deport = ptcoor;
926 } else
927 ringerreur(ERR_ECHECDEPORT, liste_plots, NULL);
928 liste_plots = liste_plots->suiv;
929 }
930
931 /*------------------ TRT DES DEPORTS DROIT EN DEHORS FACE COEUR----------------------- */
932
933 ptqueue = tab_grilles[face].lst_pas;
934 while ((ptqueue != NULL) && (ptqueue->suiv != NULL))
935 ptqueue = ptqueue->suiv;
936
937 piste = pistederniere - 2; /* on laisse une piste pour les deports */
938
939 while ((ptdernier != NULL) && ((ptdernier->coord)->yabs > ((lecoeur.coord).yabs + lecoeur.height))) {
940 //if (ptdernier->deport->piste == 1)
941 // pistelayerdroite = 1;
942
943 /* -------------------- */
944 /* ds ts les cas deport */
945 /* -------------------- */
946
947 ptdernier->situe_deport = DEPORTD;
948
949 if (mode_debug)
950 printf("deport droite con %s %s\n", ptdernier->nom_con, ((loins_list * )(ptdernier->con_lo)->ROOT)->INSNAME);
951
952 trouve = 0;
953
954 ptcoor = ptqueue;
955 while (ptcoor != NULL) {
956 trouve = (ptcoor->proprio == NULL);
957 if (trouve)
958 break;
959 ptcoor = ptcoor->prec;
960 }
961
962 if (trouve) {
963 ptcoor->piste = piste;
964 ptcoor->proprio = (void * ) ptdernier;
965 piste--;
966 ptdernier->deport = ptcoor;
967 } else
968 ringerreur(ERR_ECHECDEPORT, ptdernier, NULL);
969
970 ptdernier = ptdernier->prec;
971 }
972
973 /*----------------------- TRT DES CONCOEUR, DEPORT LAYER UNIQUEMENT ----------------- */
974
975 while (liste_coeur != NULL) {
976 if ((liste_coeur->deport != NULL) && (liste_coeur->nom_con != eq_vdd) && (liste_coeur->nom_con !=
977 eq_vss)) /* changement layer */ {
978 liste_coeur->situe_deport = DEPORTC;
979 liste_coeur->deport->yabs = (liste_coeur->coord)->yabs;
980 if (liste_coeur->largeur > largeurmin)
981 (liste_coeur->deport)->piste = (liste_coeur->largeur + pitch) / pitch;
982 else
983 (liste_coeur->deport)->piste = 1; /* premiere piste pour deport layer */
984 if (mode_debug)
985 printf("Deport layer concoeur %s piste %ld largeur %ld\n", liste_coeur->nom_con,
986 liste_coeur->deport->piste, liste_coeur->largeur);
987 }
988 liste_coeur = liste_coeur->suiv;
989 }
990
991 break;
992 } /* fin du switch , ouf */
993
994 } /* fin du for */
995 }
996
997 /*-------------------------------------------------------------------------------------------------------*/
998 /* Allocation des segments pour les deports. Pour les deports en face du coeur on reste */
999 /* dans le meme metal */
1000 /* bug corrige dans le cas de deport en face du coeur: existe_sig_equipo ajoute */
1001 /* 14 sept 92: nouveau bug corrige: pour les deports en dehors du coeur */
1002 /* les segments pistes ne sont plus tires de la largeur du connecteur,(erreur avec nouv pad12 et pad 15) */
1003 /* mais de la largeur du via si plus grand que le minimum. */
1004 /*-------------------------------------------------------------------------------------------------------*/
1005
pose_segdeport(BARRE_PLOTS tab_plots[NB_FACES],LST_PSEUDO_CON tab_coeur[NB_FACES],COEUR lecoeur,LST_EQUIPO lst_equipo,LST_SEGMENT segx_occ[NB_FACES],LST_SEGMENT segy_occ[NB_FACES])1006 void pose_segdeport(BARRE_PLOTS tab_plots[NB_FACES],
1007 LST_PSEUDO_CON tab_coeur[NB_FACES], COEUR lecoeur, LST_EQUIPO lst_equipo,
1008 LST_SEGMENT segx_occ[NB_FACES], LST_SEGMENT segy_occ[NB_FACES])
1009 {
1010 LST_EQUIPO eq;
1011 LST_PSEUDO_CON lp, lc;
1012 PT_COORDONNEES c1, c2, deb, fin;
1013 long p1 = 0, p2 = 0, largmetalpiste = 0, largmetalcol = 0, largcolvia = 0, largpistevia = 0, piste = 0, largeurseg = 0;
1014 int face;
1015 char niveaucol = 0, niveaupiste = 0;
1016 LST_SEGMENT * segcol = NULL;
1017 LST_SEGMENT * segpiste = NULL;
1018
1019 alloue_coord(0L, 0, &deb); /* coordonnees pour reserver la piste de deport du coeur */
1020 alloue_coord(0L, 0, &fin);
1021 deb->xabs = lecoeur.coord.xabs - 10;
1022 fin->xabs = lecoeur.width + lecoeur.coord.xabs + 10;
1023 deb->yabs = lecoeur.coord.yabs - 10;
1024 fin->yabs = lecoeur.height + lecoeur.coord.yabs + 10;
1025 ;
1026
1027 for (face = 0; face < NB_FACES; face++) {
1028 lp = tab_plots[face].lst_con;
1029 lc = tab_coeur[face];
1030
1031 #ifdef COMMENT
1032 /* ----------------------------------------------------------------- */
1033 /* init mises dans deport alim au lieu d'ici (pour deport plot alim) */
1034 /* ----------------------------------------------------------------- */
1035
1036 segx_occ[face] = NULL; /* INITIALISATION DES SEGMENTS */
1037 segy_occ[face] = NULL;
1038 #endif
1039
1040 switch (face) {
1041 case NORD:
1042 case SUD :
1043 niveaucol = ymetal;
1044 largcolvia = ymetal_wvia;
1045 largmetalcol = ymetal_width;
1046 niveaupiste = xmetal;
1047 largmetalpiste = xmetal_width;
1048 largpistevia = xmetal_wvia;
1049 segcol = segy_occ;
1050 segpiste = segx_occ;
1051 break;
1052 case EST :
1053 case OUEST:
1054 niveaucol = xmetal;
1055 largcolvia = xmetal_wvia;
1056 largmetalcol = xmetal_width;
1057 niveaupiste = ymetal;
1058 largmetalpiste = ymetal_width;
1059 largpistevia = ymetal_wvia;
1060 segcol = segx_occ;
1061 segpiste = segy_occ;
1062 break;
1063 }
1064
1065 while (NULL != lp) {
1066 if ((NULL != lp->deport) && (lp->nom_con != eq_vdd) && (lp->nom_con != eq_vss)) {
1067
1068 /* ------------- */
1069 /* trt du deport */
1070 /* ------------- */
1071
1072 if ((DEPORTG == lp->situe_deport) || (DEPORTD == lp->situe_deport)) { /* DEPORT GAUCHE OU DROIT */
1073
1074 eq = existe_sig_equipo(lst_equipo, ((lp->con_lo)->SIG)->INDEX);
1075 if (NULL == eq)
1076 ringerreur(ERR_INTERNE_EQ, NULL, NULL);
1077
1078 if (lp->layer != niveaucol) { /* deport layer d'abord */
1079 c1 = c2 = lp->coord; /* segment col */
1080 p2 = (tab_plots[face].coord).piste;
1081 p1 = p2 - 1; /* 1 piste pour dep layer */
1082
1083 if (segment_libre(c1, c2, p1, p2, face, SEG_COL, segcol, lp->layer))
1084 alloue_etchaine_segment(c1, c2, p1, p2, face, SEG_COL, segcol, lp->largeur,
1085 lp->layer, VRAI_SEG, AVEC_VIA, eq);
1086 else
1087 ringerreur(ERR_SEGDEPORT, (void * )lp, NULL);
1088
1089 /* ---------------------------- */
1090 /* ensuite seg col ds bon layer */
1091 /* ---------------------------- */
1092
1093 p2 = p1;
1094 p1 = (lp->deport)->piste;
1095
1096 if (lp->largeur > largcolvia)
1097 largeurseg = largcolvia;
1098 else if (lp->largeur < largmetalcol)
1099 largeurseg = largmetalcol;
1100 else
1101 largeurseg = lp->largeur;
1102
1103 if (segment_libre(c1, c2, p1, p2, face, SEG_COL, segcol, niveaucol))
1104 alloue_etchaine_segment(c1, c2, p1, p2, face, SEG_COL, segcol, largeurseg,
1105 niveaucol, VRAI_SEG, AVEC_VIA, eq);
1106 else
1107 ringerreur(ERR_SEGDEPORT, (void * )lp, NULL);
1108 } else
1109 { /* seg col tire */
1110 c1 = c2 = lp->coord; /* segment col */
1111 p2 = (tab_plots[face].coord).piste;
1112 p1 = (lp->deport)->piste;
1113
1114 if (segment_libre(c1, c2, p1, p2, face, SEG_COL, segcol, lp->layer))
1115 alloue_etchaine_segment(c1, c2, p1, p2, face, SEG_COL, segcol, lp->largeur,
1116 lp->layer, VRAI_SEG, AVEC_VIA, eq);
1117 else
1118 ringerreur(ERR_SEGDEPORT, (void * )lp, NULL);
1119 }
1120
1121 /* -------------- */
1122 /* seg piste tire */
1123 /* -------------- */
1124
1125 c1 = lp->coord;
1126 c2 = lp->deport;
1127
1128 p1 = p2 = (lp->deport)->piste;
1129
1130 if (lp->largeur > largpistevia)
1131 largeurseg = largpistevia;
1132 else if (lp->largeur < largmetalpiste)
1133 largeurseg = largmetalpiste;
1134 else
1135 largeurseg = lp->largeur;
1136
1137 if (segment_libre(c1, c2, p1, p2, face, SEG_PISTE, segpiste, niveaupiste))
1138 alloue_etchaine_segment(c1, c2, p1, p2, face, SEG_PISTE, segpiste, largeurseg,
1139 niveaupiste, VRAI_SEG, AVEC_VIA, eq);
1140 else
1141 ringerreur(ERR_SEGDEPORT, (void * )lp, NULL);
1142 } else /* DEPORT DANS EN FACE DU COEUR */ {
1143
1144 eq = existe_sig_equipo(lst_equipo, ((lp->con_lo)->SIG)->INDEX);
1145 if (NULL == eq)
1146 ringerreur(ERR_INTERNE_EQ, NULL, NULL);
1147
1148 /* ------------ */
1149 /* seg col tire */
1150 /* ------------ */
1151
1152 c1 = c2 = lp->coord; /* segment col */
1153 p2 = (tab_plots[face].coord).piste;
1154 p1 = (lp->deport)->piste;
1155
1156 if (segment_libre(c1, c2, p1, p2, face, SEG_COL, segcol, lp->layer))
1157 alloue_etchaine_segment(c1, c2, p1, p2, face, SEG_COL, segcol, lp->largeur,
1158 lp->layer, VRAI_SEG, AVEC_VIA, eq);
1159 else
1160 ringerreur(ERR_SEGDEPORT, (void * )lp, NULL);
1161
1162 /* -------------- */
1163 /* seg piste tire */
1164 /* -------------- */
1165
1166 c1 = lp->coord;
1167 c2 = lp->deport;
1168
1169 p1 = p2 = (lp->deport)->piste;
1170
1171 /* ------------------------------- */
1172 /* LES 2 SEGMENTS DS LE MEME METAL */
1173 /* ------------------------------- */
1174
1175 if (segment_libre(c1, c2, p1, p2, face, SEG_PISTE, segpiste, lp->layer))
1176 alloue_etchaine_segment(c1, c2, p1, p2, face, SEG_PISTE, segpiste, lp->largeur,
1177 lp->layer, VRAI_SEG, AVEC_VIA, eq);
1178 else
1179 ringerreur(ERR_SEGDEPORT, (void * )lp, NULL);
1180 }
1181 } /* fin du if deport */
1182
1183 lp = lp->suiv;
1184 } /* fin du while */
1185
1186 while (NULL != lc) {
1187 if ((NULL != lc->deport) && (lc->nom_con != eq_vdd) && (lc->nom_con != eq_vss)) { /* deport layer uniquement */
1188 eq = existe_sig_equipo(lst_equipo, ((lc->con_lo)->SIG)->INDEX);
1189 if (NULL == eq)
1190 ringerreur(ERR_INTERNE_EQ, NULL, NULL);
1191
1192 c1 = c2 = lc->coord; /* segment col */
1193 p2 = lc->deport->piste; /* piste pour deport coeur */
1194 p1 = 0;
1195
1196 /* ------------------------------------------------------------------ */
1197 /* Allocation d'un faux segment au cas ou il existe des deports coeur */
1198 /* pour empecher de router dans la piste reservee au deport */
1199 /* ------------------------------------------------------------------ */
1200
1201 if (segment_libre(deb, fin, 1L, 1L, face, SEG_PISTE, segpiste, niveaupiste))
1202 alloue_etchaine_segment(deb, fin, 1L, 1L, face, SEG_PISTE, segpiste, lc->largeur,
1203 niveaupiste, FAUX_SEG, AVEC_VIA, eq);
1204
1205 /* ---------------------------------------------------- */
1206 /* Allocations de faux segments si largeur non standard */
1207 /* ---------------------------------------------------- */
1208
1209 if (p2 > 1) {
1210 for (piste = 2; piste <= (p2 + (lc->largeur / 2 + pitch) / pitch); piste++)
1211 alloue_etchaine_segment(c1, c2, piste, piste, face, SEG_PISTE, segpiste,
1212 largmetalpiste, niveaupiste, FAUX_SEG, AVEC_VIA, eq);
1213 }
1214
1215 if (segment_libre(c1, c2, p1, p2, face, SEG_COL, segcol, lc->layer))
1216 alloue_etchaine_segment(c1, c2, p1, p2, face, SEG_COL, segcol, lc->largeur, lc->layer,
1217 VRAI_SEG, AVEC_VIA, eq);
1218 else
1219 ringerreur(ERR_SEGDEPORT, (void * )lc, NULL);
1220 }
1221 lc = lc->suiv;
1222 }
1223 } /* fin du for */
1224 }
1225