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