New ripup/reroute loop, bug-kill (CALU&TALU).
This commit is contained in:
parent
c154225d5d
commit
ec62302295
|
@ -4,8 +4,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/15 14:37:14 $
|
$Date: 2002/04/25 13:41:27 $
|
||||||
$Log: ocrAstar.h,v $
|
$Log: ocrAstar.h,v $
|
||||||
|
Revision 1.2 2002/04/25 13:41:27 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.1 2002/03/15 14:37:14 hcl
|
Revision 1.1 2002/03/15 14:37:14 hcl
|
||||||
Ca roule.
|
Ca roule.
|
||||||
|
|
||||||
|
@ -21,6 +24,9 @@
|
||||||
#define AS_K_SEG 0
|
#define AS_K_SEG 0
|
||||||
#define AS_K_EQUI 1
|
#define AS_K_EQUI 1
|
||||||
|
|
||||||
|
void init_Astar (ocrRoutingDataBase *db);
|
||||||
|
ocrNaturalInt dig_around ();
|
||||||
|
|
||||||
ocrNaturalInt find_path_astar (ocrRoutingParameters * p_param,
|
ocrNaturalInt find_path_astar (ocrRoutingParameters * p_param,
|
||||||
ocrWRoutingGrid * p_grid,
|
ocrWRoutingGrid * p_grid,
|
||||||
ocrNaturalInt xsource,
|
ocrNaturalInt xsource,
|
||||||
|
|
|
@ -4,8 +4,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/15 14:37:14 $
|
$Date: 2002/04/25 13:41:27 $
|
||||||
$Log: ocrConnectorUtil.h,v $
|
$Log: ocrConnectorUtil.h,v $
|
||||||
|
Revision 1.2 2002/04/25 13:41:27 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.1 2002/03/15 14:37:14 hcl
|
Revision 1.1 2002/03/15 14:37:14 hcl
|
||||||
Ca roule.
|
Ca roule.
|
||||||
|
|
||||||
|
@ -70,4 +73,20 @@ deleteConVirInConVirList (ocrVirtualConnector ** io_VirConList,
|
||||||
ocrNaturalInt
|
ocrNaturalInt
|
||||||
isCriticalConnector (ocrWRoutingGrid * i_pGrid,
|
isCriticalConnector (ocrWRoutingGrid * i_pGrid,
|
||||||
ocrConnector * i_pCon);
|
ocrConnector * i_pCon);
|
||||||
|
|
||||||
|
void
|
||||||
|
markSegmentAsFree(ocrRoutingDataBase * i_pDataBase, ocrSignal * i_pSignal,
|
||||||
|
ocrNaturalInt INDEX);
|
||||||
|
|
||||||
|
void
|
||||||
|
unMarkSegmentAsFree(ocrRoutingDataBase * i_pDataBase,
|
||||||
|
ocrSignal * i_pSignal, ocrNaturalInt INDEX);
|
||||||
|
|
||||||
|
void
|
||||||
|
protectVC(ocrRoutingDataBase * i_pDataBase,
|
||||||
|
ocrVirtualConnector * i_pVirCon);
|
||||||
|
void
|
||||||
|
unProtectVC(ocrRoutingDataBase * i_pDataBase,
|
||||||
|
ocrVirtualConnector * i_pVirCon);
|
||||||
|
void countFreeVC(ocrRoutingDataBase * i_pDataBase);
|
||||||
#endif /* _OCRCONNECTORUTIL_H_ */
|
#endif /* _OCRCONNECTORUTIL_H_ */
|
||||||
|
|
|
@ -4,8 +4,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/15 14:37:16 $
|
$Date: 2002/04/25 13:41:27 $
|
||||||
$Log: ocrWRoutingDataBase.h,v $
|
$Log: ocrWRoutingDataBase.h,v $
|
||||||
|
Revision 1.2 2002/04/25 13:41:27 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.1 2002/03/15 14:37:16 hcl
|
Revision 1.1 2002/03/15 14:37:16 hcl
|
||||||
Ca roule.
|
Ca roule.
|
||||||
|
|
||||||
|
@ -102,7 +105,7 @@ typedef struct ocrWSegment
|
||||||
/* list of pointer used for backtracking */
|
/* list of pointer used for backtracking */
|
||||||
struct ocrWSegment *ROOT;
|
struct ocrWSegment *ROOT;
|
||||||
/* temporarily chaining */
|
/* temporarily chaining */
|
||||||
struct ocrWSegment *AUX;
|
//struct ocrWSegment *AUX;
|
||||||
|
|
||||||
/* Pointer used for chaining equi */
|
/* Pointer used for chaining equi */
|
||||||
struct ocrWSegment *NEXT;
|
struct ocrWSegment *NEXT;
|
||||||
|
@ -189,9 +192,10 @@ typedef struct ocrSignal
|
||||||
ocrVirtualConnector *VIA;
|
ocrVirtualConnector *VIA;
|
||||||
ocrVirtualConnector *GLOBAL;
|
ocrVirtualConnector *GLOBAL;
|
||||||
|
|
||||||
ocrNaturalShort WIN;
|
|
||||||
ocrNaturalInt NB_CON;
|
ocrNaturalInt NB_CON;
|
||||||
ocrNaturalInt TYPE;
|
ocrNaturalInt TYPE;
|
||||||
|
ocrNaturalShort WIN;
|
||||||
|
ocrNaturalShort HARD;
|
||||||
ocrNaturalShort PRIORITY;
|
ocrNaturalShort PRIORITY;
|
||||||
ocrNaturalShort INTEXT;
|
ocrNaturalShort INTEXT;
|
||||||
ocrConnector *CON_LIST;
|
ocrConnector *CON_LIST;
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/20 13:25:50 $
|
$Date: 2002/04/25 13:41:31 $
|
||||||
$Log: findNPointsPath.c,v $
|
$Log: findNPointsPath.c,v $
|
||||||
|
Revision 1.3 2002/04/25 13:41:31 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.2 2002/03/20 13:25:50 hcl
|
Revision 1.2 2002/03/20 13:25:50 hcl
|
||||||
SymX bug.
|
SymX bug.
|
||||||
|
|
||||||
|
@ -86,7 +89,7 @@
|
||||||
#include "ocrAstar.h"
|
#include "ocrAstar.h"
|
||||||
|
|
||||||
static char *res_id =
|
static char *res_id =
|
||||||
"$Id: findNPointsPath.c,v 1.2 2002/03/20 13:25:50 hcl Exp $";
|
"$Id: findNPointsPath.c,v 1.3 2002/04/25 13:41:31 hcl Exp $";
|
||||||
|
|
||||||
#define MAX_HT 500
|
#define MAX_HT 500
|
||||||
|
|
||||||
|
@ -717,7 +720,7 @@ ocrNaturalInt biroute (ocrRoutingParameters *i_pParam,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
display (LEVEL, DEBUG, "\no Launching A*\n");
|
/*display (LEVEL, DEBUG, "\no Launching A*\n");*/
|
||||||
if (l_pCon2) {
|
if (l_pCon2) {
|
||||||
l_uLength = find_path_astar(i_pParam, i_pGrid,
|
l_uLength = find_path_astar(i_pParam, i_pGrid,
|
||||||
l_pCon1->CON->X,
|
l_pCon1->CON->X,
|
||||||
|
@ -817,8 +820,8 @@ findPathNPoints(ocrRoutingParameters * i_pParam,
|
||||||
l_bOk = chooseInternalConnector(i_pGrid, con1, con2, 0);
|
l_bOk = chooseInternalConnector(i_pGrid, con1, con2, 0);
|
||||||
|
|
||||||
if (l_bOk != OCR_OK) {
|
if (l_bOk != OCR_OK) {
|
||||||
display(LEVEL, DEBUG, "%s\n%s%ld\n",
|
display(LEVEL, DEBUG, "%s\n%s%s\n",
|
||||||
"o No more connectors :", " unable to route ", i_pSignal->INDEX);
|
"o No more connectors :", " unable to route ", i_pSignal->NAME);
|
||||||
return OCRNATURALINT_MAX;
|
return OCRNATURALINT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,39 +1,47 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/04/10 12:56:54 $
|
$Date: 2002/04/25 13:41:32 $
|
||||||
|
|
||||||
$Log: ocrAstar.cpp,v $
|
$Log: ocrAstar.cpp,v $
|
||||||
Revision 1.2 2002/04/10 12:56:54 hcl
|
Revision 1.3 2002/04/25 13:41:32 hcl
|
||||||
bouh
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
|
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "mut.h"
|
#include "mut.h"
|
||||||
#include "mlo.h"
|
#include "mlo.h"
|
||||||
#include "mlu.h"
|
#include "mlu.h"
|
||||||
#include "mph.h"
|
#include "mph.h"
|
||||||
#include "mpu.h"
|
#include "mpu.h"
|
||||||
#include "ocr.h"
|
#include "ocr.h"
|
||||||
#include "ocrUtil.h"
|
#include "ocrUtil.h"
|
||||||
#include "ocrWRoutingDataBase.h"
|
#include "ocrWRoutingDataBase.h"
|
||||||
#include "ocrWindow.h"
|
#include "ocrWindow.h"
|
||||||
#include "mbk_tree.h"
|
#include "mbk_tree.h"
|
||||||
#include "ocrWRoutingUtil.h"
|
#include "ocrWRoutingUtil.h"
|
||||||
#include "ocrWRouting.h"
|
#include "ocrWRouting.h"
|
||||||
#include "ocrNpoints.h"
|
#include "ocrNpoints.h"
|
||||||
#include "display.h"
|
#include "ocrConnectorUtil.h"
|
||||||
#include "ocrAstar.h"
|
#include "display.h"
|
||||||
|
#include "ocrAstar.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
ocrNaturalInt reRoute (
|
||||||
|
ocrRoutingDataBase * i_pDataBase,
|
||||||
|
ocrRoutingParameters * i_pParam,
|
||||||
|
ocrSignal * i_pSignal
|
||||||
|
)
|
||||||
|
;
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
extern ocrOption *g_pOption;
|
extern ocrOption *g_pOption;
|
||||||
|
@ -67,6 +75,8 @@ struct is_a_better_seg {
|
||||||
typedef set<ocrWSegment*, is_a_better_seg> ocrSegmentKeySet;
|
typedef set<ocrWSegment*, is_a_better_seg> ocrSegmentKeySet;
|
||||||
typedef set<ocrWSegment *> ocrSegmentAdrSet;
|
typedef set<ocrWSegment *> ocrSegmentAdrSet;
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
#define FINDNPATH findPathNPoints
|
||||||
|
|
||||||
#define TAG_UNDEF 0
|
#define TAG_UNDEF 0
|
||||||
#define TAG_KEEP 1
|
#define TAG_KEEP 1
|
||||||
#define TAG_CLEAN 2
|
#define TAG_CLEAN 2
|
||||||
|
@ -90,6 +100,8 @@ ocrNaturalInt CUR_SIG_INDEX = 0;
|
||||||
ocrWSegment *ze_best = NULL;
|
ocrWSegment *ze_best = NULL;
|
||||||
ocrWSegment *ze_target = NULL;
|
ocrWSegment *ze_target = NULL;
|
||||||
|
|
||||||
|
ocrNaturalInt ripup = 1;
|
||||||
|
|
||||||
//ocrNaturalInt (*kost)(ocrWSegment *, ocrWSegment *);
|
//ocrNaturalInt (*kost)(ocrWSegment *, ocrWSegment *);
|
||||||
|
|
||||||
/*********************************************************************/
|
/*********************************************************************/
|
||||||
|
@ -387,13 +399,14 @@ ocrWSegment *explore_equi (ocrWSegment *segment_source, ocrWSegment *segment_tar
|
||||||
|
|
||||||
assert (segment_source != segment_target);
|
assert (segment_source != segment_target);
|
||||||
/*display (LEVEL, DEBUG, "d starting exploration\n");*/
|
/*display (LEVEL, DEBUG, "d starting exploration\n");*/
|
||||||
|
debut:
|
||||||
|
|
||||||
segment_source->COST = 0;
|
segment_source->COST = 0;
|
||||||
segment_source->H = eval_equi (segment_source, segment_target);
|
segment_source->H = eval_equi (segment_source, segment_target);
|
||||||
segment_source->HCOST = segment_source->H + 1000000;
|
segment_source->HCOST = segment_source->H + 1000000;
|
||||||
segment_source->TAG = TAG_TERRA;
|
segment_source->TAG = TAG_TERRA;
|
||||||
segment_source->ROOT = NULL;
|
segment_source->ROOT = NULL;
|
||||||
segment_source->AUX = NULL;
|
//segment_source->AUX = NULL;
|
||||||
ze_best = segment_source;
|
ze_best = segment_source;
|
||||||
|
|
||||||
terra_incognita.insert(segment_source);
|
terra_incognita.insert(segment_source);
|
||||||
|
@ -484,8 +497,15 @@ ocrWSegment *explore_equi (ocrWSegment *segment_source, ocrWSegment *segment_tar
|
||||||
} /* while */
|
} /* while */
|
||||||
|
|
||||||
/* Failed */
|
/* Failed */
|
||||||
|
|
||||||
|
/* dig the path to the target */
|
||||||
clean_tag ();
|
clean_tag ();
|
||||||
|
|
||||||
|
if (dig_around ()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
clean_tag ();
|
||||||
|
goto debut;
|
||||||
/*display (LEVEL, DEBUG, "d exploration failed\n");*/
|
/*display (LEVEL, DEBUG, "d exploration failed\n");*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -517,14 +537,17 @@ ocrSignal *findSignal(ocrNaturalInt i_uIndex)
|
||||||
&& \
|
&& \
|
||||||
(suspect->TAG != TAG_TERRA) \
|
(suspect->TAG != TAG_TERRA) \
|
||||||
) \
|
) \
|
||||||
|
{ \
|
||||||
|
if (((findSignal (suspect->SIGNAL_INDEX))->HARD) < 2) \
|
||||||
{ \
|
{ \
|
||||||
suspect->TAG = TAG_TERRA; \
|
suspect->TAG = TAG_TERRA; \
|
||||||
suspect->COST = ze_best->COST + kost (ze_best, suspect); \
|
suspect->COST = ze_best->COST + kost (ze_best, suspect); \
|
||||||
suspect->H = eval_equi (suspect, ze_target); \
|
suspect->H = eval_equi (suspect, ze_target); \
|
||||||
suspects.insert (suspect); \
|
suspects.insert (suspect); \
|
||||||
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
void dig_around () {
|
ocrNaturalInt dig_around () {
|
||||||
ocrWSegment *suspect;
|
ocrWSegment *suspect;
|
||||||
ocrSignal *victime;
|
ocrSignal *victime;
|
||||||
|
|
||||||
|
@ -578,6 +601,7 @@ void dig_around () {
|
||||||
} /* end for i */
|
} /* end for i */
|
||||||
|
|
||||||
if (suspects.empty()) {
|
if (suspects.empty()) {
|
||||||
|
return 1;
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -585,17 +609,18 @@ void dig_around () {
|
||||||
victime = findSignal((*suspects.begin())->SIGNAL_INDEX);
|
victime = findSignal((*suspects.begin())->SIGNAL_INDEX);
|
||||||
suspects.erase (suspects.begin());
|
suspects.erase (suspects.begin());
|
||||||
|
|
||||||
deleteEquipotentielle(param, grid, victime);
|
|
||||||
|
|
||||||
if (victime) {
|
if (victime) {
|
||||||
|
deleteEquipotentielle(param, grid, victime);
|
||||||
ocr_db->RIPUP = addchain (ocr_db->RIPUP, (void *) victime);
|
ocr_db->RIPUP = addchain (ocr_db->RIPUP, (void *) victime);
|
||||||
deleteEquipotentielle(param, grid, victime);
|
deleteEquipotentielle(param, grid, victime);
|
||||||
victime->SEGMENT = NULL;
|
victime->SEGMENT = NULL;
|
||||||
victime->ROUTED = 0;
|
victime->ROUTED = 0;
|
||||||
ocr_db->NB_ROUTED--;
|
ocr_db->NB_ROUTED--;
|
||||||
//unMarkSegmentAsFree(ocr_db, victime, victime->INDEX);
|
unMarkSegmentAsFree(ocr_db, victime, victime->INDEX);
|
||||||
|
display (LEVEL, VVERB, "\no rip up signal %s", victime->NAME);
|
||||||
|
countFreeVC (ocr_db);
|
||||||
|
goto fin;
|
||||||
}
|
}
|
||||||
//countFreeVC (ocr_db);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
detruire equipotentielle victime
|
detruire equipotentielle victime
|
||||||
|
@ -604,9 +629,11 @@ void dig_around () {
|
||||||
*/
|
*/
|
||||||
} while ( !(suspects.empty()) );
|
} while ( !(suspects.empty()) );
|
||||||
|
|
||||||
|
fin:
|
||||||
|
|
||||||
clean_tag_set (suspects);
|
clean_tag_set (suspects);
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -747,6 +774,61 @@ ocrNaturalInt check_path (ocrSignal *i_pSignal) {
|
||||||
return dist;
|
return dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* reroutage */
|
||||||
|
ocrNaturalInt re_route () {
|
||||||
|
ocrSignal *l_pSignal;
|
||||||
|
ocrNaturalInt l_uLength;
|
||||||
|
ocrNaturalInt l_uReturnValue = 1;
|
||||||
|
chain_list *l_pSignalList;
|
||||||
|
ocrConnector *l_pCon;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ripup = 0;
|
||||||
|
|
||||||
|
// tant qu'il reste des signaux à re router
|
||||||
|
l_pSignalList = ocr_db->RIPUP;
|
||||||
|
while (l_pSignalList) {
|
||||||
|
|
||||||
|
l_pSignal = (ocrSignal *) l_pSignalList->DATA;
|
||||||
|
|
||||||
|
// fprintf (stdout, "reRoute : Routage du signal %ld \n",
|
||||||
|
// l_pSignal->INDEX);
|
||||||
|
markSegmentAsFree(ocr_db, l_pSignal, l_pSignal->INDEX);
|
||||||
|
for (l_pCon = l_pSignal->CON_LIST; l_pCon; l_pCon = l_pCon->NEXT) {
|
||||||
|
if (l_pCon->critVC) {
|
||||||
|
unProtectVC(ocr_db, l_pCon->critVC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l_uLength = FINDNPATH(param, ocr_db->GRID,
|
||||||
|
l_pSignal,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (l_uLength == OCRNATURALINT_MAX) {
|
||||||
|
l_uReturnValue = 0;
|
||||||
|
display(LEVEL, VVERB, "o Echec reRoute %ld\n", l_pSignal->INDEX);
|
||||||
|
l_pSignal->ROUTED = 2;
|
||||||
|
|
||||||
|
deleteEquipotentielle(param, ocr_db->GRID, l_pSignal);
|
||||||
|
|
||||||
|
l_pSignal->SEGMENT = NULL;
|
||||||
|
|
||||||
|
ocr_db->NB_UNROUTED++;
|
||||||
|
l_pSignal->PRIORITY = ocr_db->NB_IT+1;
|
||||||
|
} else {
|
||||||
|
ocr_db->NB_ROUTED++;
|
||||||
|
l_pSignal->ROUTED = 1;
|
||||||
|
}
|
||||||
|
unMarkSegmentAsFree(ocr_db, l_pSignal, l_pSignal->INDEX);
|
||||||
|
|
||||||
|
l_pSignalList = l_pSignalList->NEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
freechain(ocr_db->RIPUP);
|
||||||
|
ocr_db->RIPUP = NULL;
|
||||||
|
ripup = 1;
|
||||||
|
return l_uReturnValue;
|
||||||
|
}
|
||||||
|
|
||||||
ocrNaturalInt find_path_astar (ocrRoutingParameters * p_param,
|
ocrNaturalInt find_path_astar (ocrRoutingParameters * p_param,
|
||||||
ocrWRoutingGrid * p_grid,
|
ocrWRoutingGrid * p_grid,
|
||||||
|
@ -809,6 +891,9 @@ ocrNaturalInt find_path_astar (ocrRoutingParameters * p_param,
|
||||||
if ((segment_source != segment_dest) && (!isObstructed(segment_source))) {
|
if ((segment_source != segment_dest) && (!isObstructed(segment_source))) {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case AS_K_SEG: //path = explore (segment_source, segment_dest);
|
case AS_K_SEG: //path = explore (segment_source, segment_dest);
|
||||||
|
segment_dest->SIGNAL_INDEX = CUR_SIG_INDEX;
|
||||||
|
path = explore_equi (segment_source, segment_dest);
|
||||||
|
segment_dest->SIGNAL_INDEX = WSEGMENT_FREE;
|
||||||
break;
|
break;
|
||||||
case AS_K_EQUI: assert (i_pSignal->SEGMENT);
|
case AS_K_EQUI: assert (i_pSignal->SEGMENT);
|
||||||
//ze_best = NULL;
|
//ze_best = NULL;
|
||||||
|
@ -850,6 +935,9 @@ ocrNaturalInt find_path_astar (ocrRoutingParameters * p_param,
|
||||||
i_pSignal
|
i_pSignal
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//unMarkSegmentAsFree(ocr_db, i_pSignal, i_pSignal->INDEX);
|
||||||
|
|
||||||
|
//re_route ();
|
||||||
|
|
||||||
/*assert (((check_dist = check_path (i_pSignal)), dist == check_dist));*/
|
/*assert (((check_dist = check_path (i_pSignal)), dist == check_dist));*/
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/04/10 12:56:55 $
|
$Date: 2002/04/25 13:41:32 $
|
||||||
$Log: ocrRouter.c,v $
|
$Log: ocrRouter.c,v $
|
||||||
Revision 1.5 2002/04/10 12:56:55 hcl
|
Revision 1.6 2002/04/25 13:41:32 hcl
|
||||||
bouh
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.4 2002/04/03 09:52:19 hcl
|
Revision 1.4 2002/04/03 09:52:19 hcl
|
||||||
A little bit of C++.
|
A little bit of C++.
|
||||||
|
@ -191,116 +191,6 @@ ocrSignal *findSignal(ocrRoutingDataBase * i_pDataBase,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* protection des connecteurs isoles */
|
|
||||||
void
|
|
||||||
protectVC(ocrRoutingDataBase * i_pDataBase,
|
|
||||||
ocrVirtualConnector * i_pVirCon)
|
|
||||||
{
|
|
||||||
ocrWSegment *l_pSeg;
|
|
||||||
ocrWRoutingGrid *l_pGrid = i_pDataBase->GRID;
|
|
||||||
int z = 0;
|
|
||||||
|
|
||||||
//if (i_pVirCon->Z > 0)
|
|
||||||
// z = i_pVirCon->Z - 1;
|
|
||||||
z = i_pVirCon->Z;
|
|
||||||
|
|
||||||
//l_pSeg = getWSegmentCV (l_pGrid, i_pVirCon);
|
|
||||||
|
|
||||||
//for (z = i_pVirCon->Z ; z <= i_pDataBase->NB_OF_LAYERS ; z++) {
|
|
||||||
|
|
||||||
l_pSeg = getWSegment(l_pGrid, i_pVirCon->X, i_pVirCon->Y, z);
|
|
||||||
if (l_pSeg->SIGNAL_INDEX != WSEGMENT_FREE)
|
|
||||||
return;
|
|
||||||
if (getWSegDirection(i_pDataBase->PARAM, l_pSeg) == ocrHorizontal)
|
|
||||||
l_pSeg =
|
|
||||||
splitWSegment(i_pDataBase->PARAM, l_pGrid, l_pSeg,
|
|
||||||
i_pVirCon->X, i_pVirCon->X, WSEGMENT_OBSTACLE);
|
|
||||||
else
|
|
||||||
l_pSeg =
|
|
||||||
splitWSegment(i_pDataBase->PARAM, l_pGrid, l_pSeg,
|
|
||||||
i_pVirCon->Y, i_pVirCon->Y, WSEGMENT_OBSTACLE);
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
unProtectVC(ocrRoutingDataBase * i_pDataBase,
|
|
||||||
ocrVirtualConnector * i_pVirCon)
|
|
||||||
{
|
|
||||||
ocrWSegment *l_pSeg, *seg1, *seg2;
|
|
||||||
ocrWRoutingGrid *l_pGrid = i_pDataBase->GRID;
|
|
||||||
int z = 0, i;
|
|
||||||
|
|
||||||
//if (i_pVirCon->Z > 0)
|
|
||||||
// z = i_pVirCon->Z - 1;
|
|
||||||
z = i_pVirCon->Z;
|
|
||||||
|
|
||||||
//for (z = i_pVirCon->Z ; z <= i_pDataBase->NB_OF_LAYERS ; z++) {
|
|
||||||
//l_pSeg = getWSegmentCV (l_pGrid, i_pVirCon);
|
|
||||||
l_pSeg = getWSegment(l_pGrid, i_pVirCon->X, i_pVirCon->Y, z);
|
|
||||||
|
|
||||||
|
|
||||||
if (l_pSeg->SIGNAL_INDEX == WSEGMENT_OBSTACLE) {
|
|
||||||
//deleteSegment (i_pDataBase->PARAM, l_pGrid, l_pSeg);
|
|
||||||
l_pSeg->SIGNAL_INDEX = WSEGMENT_FREE;
|
|
||||||
|
|
||||||
// Fusion des segments libres
|
|
||||||
//mergeWSegment (i_pDataBase, l_pGrid, l_pSeg);
|
|
||||||
//return;
|
|
||||||
if (getWSegDirection(i_pDataBase->PARAM, l_pSeg) == ocrHorizontal) {
|
|
||||||
//printf("deprotect (%ld,%ld,%d):", 5 * i_pVirCon->X, 5 * i_pVirCon->Y, z);
|
|
||||||
seg1 = getWSegment(l_pGrid, i_pVirCon->X - 1, i_pVirCon->Y, z);
|
|
||||||
if (seg1->SIGNAL_INDEX == WSEGMENT_FREE) {
|
|
||||||
l_pSeg->P_MIN = seg1->P_MIN;
|
|
||||||
//printf ("G%ld;", seg1->P_MIN * 5);
|
|
||||||
//mbkfree (seg1);
|
|
||||||
//freeWSegment (seg1);
|
|
||||||
}
|
|
||||||
|
|
||||||
seg2 = getWSegment(l_pGrid, i_pVirCon->X + 1, i_pVirCon->Y, z);
|
|
||||||
if (seg2->SIGNAL_INDEX == WSEGMENT_FREE) {
|
|
||||||
l_pSeg->P_MAX = seg2->P_MAX;
|
|
||||||
//printf ("D%ld.", seg2->P_MAX * 5);
|
|
||||||
//freeWSegment (seg2);
|
|
||||||
//freeWSegment (seg2);
|
|
||||||
//mbkfree (seg2);
|
|
||||||
}
|
|
||||||
for (i = l_pSeg->P_MIN; i <= l_pSeg->P_MAX; i++)
|
|
||||||
setWGrid(l_pGrid, l_pSeg, i, i_pVirCon->Y, z);
|
|
||||||
//printf ("\n");
|
|
||||||
} else {
|
|
||||||
seg1 = getWSegment(l_pGrid, i_pVirCon->X, i_pVirCon->Y - 1, z);
|
|
||||||
if (seg1->SIGNAL_INDEX == WSEGMENT_FREE) {
|
|
||||||
l_pSeg->P_MIN = seg1->P_MIN;
|
|
||||||
//mbkfree (seg1);
|
|
||||||
//freeWSegment (seg1);
|
|
||||||
}
|
|
||||||
|
|
||||||
seg2 = getWSegment(l_pGrid, i_pVirCon->X, i_pVirCon->Y + 1, z);
|
|
||||||
if (seg2->SIGNAL_INDEX == WSEGMENT_FREE) {
|
|
||||||
l_pSeg->P_MAX = seg2->P_MAX;
|
|
||||||
//freeWSegment (seg2);
|
|
||||||
//mbkfree (seg2);
|
|
||||||
}
|
|
||||||
for (i = l_pSeg->P_MIN; i <= l_pSeg->P_MAX; i++)
|
|
||||||
setWGrid(l_pGrid, l_pSeg, i_pVirCon->X, i, z);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//printf ("non - de - protection !\n");
|
|
||||||
}
|
|
||||||
//}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void noCritVC(ocrRoutingDataBase * i_pDataBase)
|
void noCritVC(ocrRoutingDataBase * i_pDataBase)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -323,61 +213,6 @@ void noCritVC(ocrRoutingDataBase * i_pDataBase)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void countFreeVC(ocrRoutingDataBase * i_pDataBase)
|
|
||||||
{
|
|
||||||
|
|
||||||
ocrNaturalInt i;
|
|
||||||
ocrWRoutingGrid *l_pGrid = i_pDataBase->GRID;
|
|
||||||
|
|
||||||
// tous les sigs
|
|
||||||
for (i = 0; i < i_pDataBase->NB_SIGNAL; i++) {
|
|
||||||
ocrConnector *l_pCon;
|
|
||||||
|
|
||||||
if (i_pDataBase->SIGNAL[i]->ROUTED
|
|
||||||
|| i_pDataBase->SIGNAL[i]->NICHT_ZU_ROUTIEREN)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// tous les cons
|
|
||||||
for (l_pCon = i_pDataBase->SIGNAL[i]->CON_LIST; l_pCon;
|
|
||||||
l_pCon = l_pCon->NEXT) {
|
|
||||||
ocrVirtualConnector *l_pVirCon;
|
|
||||||
ocrWSegment *l_pSeg;
|
|
||||||
if (l_pCon->critVC) {
|
|
||||||
protectVC(i_pDataBase, l_pCon->critVC);
|
|
||||||
//continue;
|
|
||||||
goto fin_lpcon;
|
|
||||||
}
|
|
||||||
// tous les vircons
|
|
||||||
l_pCon->NB_VC = 0;
|
|
||||||
for (l_pVirCon = l_pCon->VIR_CON_LIST; l_pVirCon;
|
|
||||||
l_pVirCon = l_pVirCon->NEXT) {
|
|
||||||
if (l_pVirCon->Z > 0)
|
|
||||||
goto fin_lpcon;
|
|
||||||
//continue;
|
|
||||||
// l_pSeg = getWSegment (l_pGrid, l_pVirCon->X, l_pVirCon->Y, l_pVirCon->Z - 1);
|
|
||||||
//else
|
|
||||||
l_pSeg = getWSegmentCV(l_pGrid, l_pVirCon);
|
|
||||||
if (l_pSeg->SIGNAL_INDEX == WSEGMENT_FREE) {
|
|
||||||
l_pCon->critVC = l_pVirCon;
|
|
||||||
(l_pCon->NB_VC)++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (l_pCon->NB_VC == 1) {
|
|
||||||
protectVC(i_pDataBase, l_pCon->critVC);
|
|
||||||
} else {
|
|
||||||
l_pCon->critVC = NULL;
|
|
||||||
}
|
|
||||||
fin_lpcon:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// maj con->NB_VC
|
|
||||||
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* route les signaux dans l'ordre :
|
* route les signaux dans l'ordre :
|
||||||
|
@ -398,7 +233,8 @@ reRoute(ocrRoutingDataBase * i_pDataBase,
|
||||||
chain_list *l_pSignalList;
|
chain_list *l_pSignalList;
|
||||||
ocrConnector *l_pCon;
|
ocrConnector *l_pCon;
|
||||||
|
|
||||||
|
if (i_pSignal == NULL)
|
||||||
|
goto skip;
|
||||||
// routage du signal désigné par i_pSignal
|
// routage du signal désigné par i_pSignal
|
||||||
// fprintf (stdout, "reRoute : Routage du signal %ld \n",
|
// fprintf (stdout, "reRoute : Routage du signal %ld \n",
|
||||||
// i_pSignal->INDEX);
|
// i_pSignal->INDEX);
|
||||||
|
@ -417,9 +253,11 @@ reRoute(ocrRoutingDataBase * i_pDataBase,
|
||||||
|
|
||||||
i_pSignal->ROUTED = 1;
|
i_pSignal->ROUTED = 1;
|
||||||
|
|
||||||
|
display(LEVEL, VVERB, "o rerouted %s\n", i_pSignal->NAME);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
l_uReturnValue = 0;
|
l_uReturnValue = 0;
|
||||||
display(LEVEL, VVERB, "o Echec reRoute %ld\n", i_pSignal->INDEX);
|
display(LEVEL, VVERB, "o Failed to reroute %s\n", i_pSignal->NAME);
|
||||||
|
|
||||||
i_pSignal->ROUTED = 2;
|
i_pSignal->ROUTED = 2;
|
||||||
deleteEquipotentielle(i_pParam, i_pDataBase->GRID, i_pSignal);
|
deleteEquipotentielle(i_pParam, i_pDataBase->GRID, i_pSignal);
|
||||||
|
@ -430,11 +268,17 @@ reRoute(ocrRoutingDataBase * i_pDataBase,
|
||||||
}
|
}
|
||||||
unMarkSegmentAsFree(i_pDataBase, i_pSignal, i_pSignal->INDEX); // XXX
|
unMarkSegmentAsFree(i_pDataBase, i_pSignal, i_pSignal->INDEX); // XXX
|
||||||
|
|
||||||
|
skip:
|
||||||
|
|
||||||
// tant qu'il reste des signaux à re router
|
// tant qu'il reste des signaux à re router
|
||||||
l_pSignalList = i_pDataBase->RIPUP;
|
l_pSignalList = i_pDataBase->RIPUP;
|
||||||
while (l_pSignalList) {
|
while (l_pSignalList) {
|
||||||
|
|
||||||
l_pSignal = (ocrSignal *) l_pSignalList->DATA;
|
l_pSignal = (ocrSignal *) l_pSignalList->DATA;
|
||||||
|
if (l_pSignal->ROUTED == 1) {
|
||||||
|
l_pSignalList = l_pSignalList->NEXT;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// fprintf (stdout, "reRoute : Routage du signal %ld \n",
|
// fprintf (stdout, "reRoute : Routage du signal %ld \n",
|
||||||
// l_pSignal->INDEX);
|
// l_pSignal->INDEX);
|
||||||
|
@ -444,30 +288,35 @@ reRoute(ocrRoutingDataBase * i_pDataBase,
|
||||||
unProtectVC(i_pDataBase, l_pCon->critVC);
|
unProtectVC(i_pDataBase, l_pCon->critVC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
display(LEVEL, VVERB, "o Rerouting %s\n", l_pSignal->NAME);
|
||||||
l_uLength = FINDNPATH(i_pParam, i_pDataBase->GRID,
|
l_uLength = FINDNPATH(i_pParam, i_pDataBase->GRID,
|
||||||
l_pSignal,
|
l_pSignal,
|
||||||
i_pDataBase->WINDOWS[i_pSignal->WIN]);
|
i_pDataBase->WINDOWS[l_pSignal->WIN]);
|
||||||
|
|
||||||
|
l_pSignalList = i_pDataBase->RIPUP;
|
||||||
|
|
||||||
if (l_uLength == OCRNATURALINT_MAX) {
|
if (l_uLength == OCRNATURALINT_MAX) {
|
||||||
l_uReturnValue = 0;
|
l_uReturnValue = 0;
|
||||||
display(LEVEL, VVERB, "o Echec reRoute %ld\n", l_pSignal->INDEX);
|
display(LEVEL, VVERB, "\n--- failed to reroute %s\n", l_pSignal->NAME);
|
||||||
l_pSignal->ROUTED = 2;
|
l_pSignal->ROUTED = 2;
|
||||||
|
|
||||||
deleteEquipotentielle(i_pParam, i_pDataBase->GRID, l_pSignal);
|
ripUp2 (i_pDataBase, i_pParam, l_pSignal);
|
||||||
|
//deleteEquipotentielle(i_pParam, i_pDataBase->GRID, l_pSignal);
|
||||||
|
|
||||||
l_pSignal->SEGMENT = NULL;
|
//l_pSignal->SEGMENT = NULL;
|
||||||
|
|
||||||
i_pDataBase->NB_UNROUTED++;
|
//i_pDataBase->NB_UNROUTED++;
|
||||||
l_pSignal->PRIORITY = i_pDataBase->NB_IT+1;
|
l_pSignal->PRIORITY = i_pDataBase->NB_IT+1;
|
||||||
//i_pSignal->PRIORITY = i_pDataBase->NB_IT;
|
|
||||||
// l_pSignal->PRIORITY ++;
|
|
||||||
} else {
|
} else {
|
||||||
i_pDataBase->NB_ROUTED++;
|
i_pDataBase->NB_ROUTED++;
|
||||||
l_pSignal->ROUTED = 1;
|
l_pSignal->ROUTED = 1;
|
||||||
|
l_pSignal->HARD ++;
|
||||||
|
display(LEVEL, VVERB, "+++ %s rerouted\n", l_pSignal->NAME);
|
||||||
}
|
}
|
||||||
unMarkSegmentAsFree(i_pDataBase, l_pSignal, l_pSignal->INDEX); // XXX
|
unMarkSegmentAsFree(i_pDataBase, l_pSignal, l_pSignal->INDEX); // XXX
|
||||||
|
countFreeVC(i_pDataBase);
|
||||||
|
|
||||||
l_pSignalList = l_pSignalList->NEXT;
|
//l_pSignalList = l_pSignalList->NEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
freechain(i_pDataBase->RIPUP);
|
freechain(i_pDataBase->RIPUP);
|
||||||
|
@ -576,7 +425,7 @@ ripUp2(ocrRoutingDataBase * i_pDataBase,
|
||||||
l_pVirCon)->
|
l_pVirCon)->
|
||||||
SIGNAL_INDEX);
|
SIGNAL_INDEX);
|
||||||
if (l_pSignal)
|
if (l_pSignal)
|
||||||
if (l_pSignal != i_pSignal) {
|
if ( (l_pSignal != i_pSignal) && (!(l_pSignal->HARD)) ) {
|
||||||
// ajoute le signal dans la liste à re-router.
|
// ajoute le signal dans la liste à re-router.
|
||||||
i_pDataBase->RIPUP = addchain(i_pDataBase->RIPUP,
|
i_pDataBase->RIPUP = addchain(i_pDataBase->RIPUP,
|
||||||
(void *) l_pSignal);
|
(void *) l_pSignal);
|
||||||
|
@ -1091,6 +940,7 @@ routingWindow(ocrRoutingDataBase * i_pDataBase, phfig_list * i_pPhFig)
|
||||||
l_pSignal->ROUTED = 1;
|
l_pSignal->ROUTED = 1;
|
||||||
i_pDataBase->NB_ROUTED++;
|
i_pDataBase->NB_ROUTED++;
|
||||||
display(LEVEL, VVERB, "\t\t\tok\n");
|
display(LEVEL, VVERB, "\t\t\tok\n");
|
||||||
|
|
||||||
//return 1; // XXX for debug...
|
//return 1; // XXX for debug...
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -1136,6 +986,7 @@ routingWindow(ocrRoutingDataBase * i_pDataBase, phfig_list * i_pPhFig)
|
||||||
// LOOP pour reperer les connecteurs isoles.
|
// LOOP pour reperer les connecteurs isoles.
|
||||||
countFreeVC(i_pDataBase);
|
countFreeVC(i_pDataBase);
|
||||||
}
|
}
|
||||||
|
reRoute(i_pDataBase, i_pDataBase->PARAM, NULL);
|
||||||
|
|
||||||
display(LEVEL, VERBOSE, "o It = %ld Sig = %ld Failures : %ld\n",
|
display(LEVEL, VERBOSE, "o It = %ld Sig = %ld Failures : %ld\n",
|
||||||
i_pDataBase->NB_IT,
|
i_pDataBase->NB_IT,
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/15 14:37:22 $
|
$Date: 2002/04/25 13:41:33 $
|
||||||
$Log: ocrWPlaneLabeling.c,v $
|
$Log: ocrWPlaneLabeling.c,v $
|
||||||
|
Revision 1.2 2002/04/25 13:41:33 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.1 2002/03/15 14:37:22 hcl
|
Revision 1.1 2002/03/15 14:37:22 hcl
|
||||||
Ca roule.
|
Ca roule.
|
||||||
|
|
||||||
|
@ -59,7 +62,7 @@
|
||||||
#define OFFSET(x) ( (ocrNaturalInt) (x)->KEY )
|
#define OFFSET(x) ( (ocrNaturalInt) (x)->KEY )
|
||||||
|
|
||||||
static char *res_id =
|
static char *res_id =
|
||||||
"$Id: ocrWPlaneLabeling.c,v 1.1 2002/03/15 14:37:22 hcl Exp $";
|
"$Id: ocrWPlaneLabeling.c,v 1.2 2002/04/25 13:41:33 hcl Exp $";
|
||||||
|
|
||||||
typedef struct ocrSubWSegment {
|
typedef struct ocrSubWSegment {
|
||||||
ocrWSegment *SEGMENT;
|
ocrWSegment *SEGMENT;
|
||||||
|
@ -614,7 +617,9 @@ processNextDeltaAgain(ocrRoutingParameters * param,
|
||||||
**/
|
**/
|
||||||
|
|
||||||
static inline void labelPlaneProcess(ocrRoutingParameters * param, ocrWRoutingGrid * grid, ocrNaturalInt xtarget, ocrNaturalInt ytarget, rbtree * labeling_status, ocrNaturalInt event_line, ocrNaturalInt labeling_line, // ligne courante du scheduler
|
static inline void labelPlaneProcess(ocrRoutingParameters * param, ocrWRoutingGrid * grid, ocrNaturalInt xtarget, ocrNaturalInt ytarget, rbtree * labeling_status, ocrNaturalInt event_line, ocrNaturalInt labeling_line, // ligne courante du scheduler
|
||||||
ocrNaturalInt delta_sce, ocrNaturalInt delta_dest, ocrNaturalInt plane_dest, // z
|
ocrNaturalInt delta_sce,
|
||||||
|
ocrNaturalInt delta_dest,
|
||||||
|
ocrNaturalInt plane_dest, // z
|
||||||
chain_list ** labeled_segment_list,
|
chain_list ** labeled_segment_list,
|
||||||
chain_list **
|
chain_list **
|
||||||
next_delta_sub_segment_list,
|
next_delta_sub_segment_list,
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/20 13:25:56 $
|
$Date: 2002/04/25 13:41:33 $
|
||||||
$Log: ocrWRoutingUtil.c,v $
|
$Log: ocrWRoutingUtil.c,v $
|
||||||
|
Revision 1.3 2002/04/25 13:41:33 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.2 2002/03/20 13:25:56 hcl
|
Revision 1.2 2002/03/20 13:25:56 hcl
|
||||||
SymX bug.
|
SymX bug.
|
||||||
|
|
||||||
|
@ -466,16 +469,39 @@ void add_phseg_to_grid(ocrRoutingDataBase * i_pDataBase,
|
||||||
((!(layer % 2)
|
((!(layer % 2)
|
||||||
&& (i_pDataBase->PARAM->EVEN_LAYERS_DIRECTION == ocrVertical)))))
|
&& (i_pDataBase->PARAM->EVEN_LAYERS_DIRECTION == ocrVertical)))))
|
||||||
{
|
{
|
||||||
|
ocrNaturalInt j;
|
||||||
// Layer Horizontal
|
// Layer Horizontal
|
||||||
|
|
||||||
for (i = y1; i <= y2; i++) {
|
for (i = y1; i <= y2; i++) {
|
||||||
#ifdef OCR_DEBUG
|
#ifdef OCR_DEBUG
|
||||||
printf("Adding horiz X=%d; Y1=%d; layer=%d\n", x1, i, layer);
|
printf("Adding horiz X=%d; Y1=%d; layer=%d\n", x1, i, layer);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (mode) { // CALU
|
||||||
seg = getWSegment(i_pDataBase->GRID, x1, i, layer);
|
seg = getWSegment(i_pDataBase->GRID, x1, i, layer);
|
||||||
seg =
|
seg = splitWSegment
|
||||||
splitWSegment(i_pDataBase->PARAM, i_pDataBase->GRID, seg,
|
(
|
||||||
x1, x2, WSEGMENT_OBSTACLE);
|
i_pDataBase->PARAM,
|
||||||
|
i_pDataBase->GRID,
|
||||||
|
seg, x1, x2,
|
||||||
|
WSEGMENT_OBSTACLE
|
||||||
|
)
|
||||||
|
;
|
||||||
|
} else { // TALU
|
||||||
|
|
||||||
|
for (j = x1; j <= x2; j++) {
|
||||||
|
seg = getWSegment(i_pDataBase->GRID, j, i, layer);
|
||||||
|
if (seg->SIGNAL_INDEX == WSEGMENT_FREE)
|
||||||
|
seg = splitWSegment
|
||||||
|
(
|
||||||
|
i_pDataBase->PARAM,
|
||||||
|
i_pDataBase->GRID,
|
||||||
|
seg, j, j,
|
||||||
|
WSEGMENT_OBSTACLE
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//if (mode) {
|
//if (mode) {
|
||||||
// CALU
|
// CALU
|
||||||
|
@ -485,15 +511,24 @@ void add_phseg_to_grid(ocrRoutingDataBase * i_pDataBase,
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
ocrNaturalInt j;
|
||||||
// Layer Vertical
|
// Layer Vertical
|
||||||
for (i = x1; i <= x2; i++) {
|
for (i = x1; i <= x2; i++) {
|
||||||
#ifdef OCR_DEBUG
|
#ifdef OCR_DEBUG
|
||||||
printf("Adding vert X=%d; Y1=%d; layer=%d\n", i, y1, layer);
|
printf("Adding vert X=%d; Y1=%d; layer=%d\n", i, y1, layer);
|
||||||
#endif
|
#endif
|
||||||
seg = getWSegment(i_pDataBase->GRID, i, y1, layer);
|
for (j = y1; j <= y2; j++) {
|
||||||
seg =
|
seg = getWSegment(i_pDataBase->GRID, i, j, layer);
|
||||||
splitWSegment(i_pDataBase->PARAM, i_pDataBase->GRID, seg,
|
if (seg->SIGNAL_INDEX == WSEGMENT_FREE)
|
||||||
y1, y2, WSEGMENT_OBSTACLE);
|
seg = splitWSegment
|
||||||
|
(
|
||||||
|
i_pDataBase->PARAM,
|
||||||
|
i_pDataBase->GRID,
|
||||||
|
seg, j, j,
|
||||||
|
WSEGMENT_OBSTACLE
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
//if (mode) {
|
//if (mode) {
|
||||||
// CALU
|
// CALU
|
||||||
// setWSegmentName (seg, i_pPhSeg->NAME);
|
// setWSegmentName (seg, i_pPhSeg->NAME);
|
||||||
|
@ -743,7 +778,7 @@ ocrWSegment *createWSegment(ocrNaturalInt offset,
|
||||||
// obstacle list
|
// obstacle list
|
||||||
//pt->OBSTACLE = NULL;
|
//pt->OBSTACLE = NULL;
|
||||||
|
|
||||||
pt->AUX = NULL;
|
//pt->AUX = NULL;
|
||||||
pt->NEXT = NULL;
|
pt->NEXT = NULL;
|
||||||
pt->ROOT = NULL;
|
pt->ROOT = NULL;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/20 13:25:57 $
|
$Date: 2002/04/25 13:41:34 $
|
||||||
$Log: ocrConnectorUtil.c,v $
|
$Log: ocrConnectorUtil.c,v $
|
||||||
|
Revision 1.3 2002/04/25 13:41:34 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.2 2002/03/20 13:25:57 hcl
|
Revision 1.2 2002/03/20 13:25:57 hcl
|
||||||
SymX bug.
|
SymX bug.
|
||||||
|
|
||||||
|
@ -101,6 +104,61 @@ distBetween2VirCon(ocrVirtualConnector * l_pVirCon1,
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
|
void countFreeVC(ocrRoutingDataBase * i_pDataBase)
|
||||||
|
{
|
||||||
|
|
||||||
|
ocrNaturalInt i;
|
||||||
|
ocrWRoutingGrid *l_pGrid = i_pDataBase->GRID;
|
||||||
|
|
||||||
|
// tous les sigs
|
||||||
|
for (i = 0; i < i_pDataBase->NB_SIGNAL; i++) {
|
||||||
|
ocrConnector *l_pCon;
|
||||||
|
|
||||||
|
if (i_pDataBase->SIGNAL[i]->ROUTED
|
||||||
|
|| i_pDataBase->SIGNAL[i]->NICHT_ZU_ROUTIEREN)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// tous les cons
|
||||||
|
for (l_pCon = i_pDataBase->SIGNAL[i]->CON_LIST; l_pCon;
|
||||||
|
l_pCon = l_pCon->NEXT) {
|
||||||
|
ocrVirtualConnector *l_pVirCon;
|
||||||
|
ocrWSegment *l_pSeg;
|
||||||
|
if (l_pCon->critVC) {
|
||||||
|
protectVC(i_pDataBase, l_pCon->critVC);
|
||||||
|
//continue;
|
||||||
|
goto fin_lpcon;
|
||||||
|
}
|
||||||
|
// tous les vircons
|
||||||
|
l_pCon->NB_VC = 0;
|
||||||
|
for (l_pVirCon = l_pCon->VIR_CON_LIST; l_pVirCon;
|
||||||
|
l_pVirCon = l_pVirCon->NEXT) {
|
||||||
|
if (l_pVirCon->Z > 0)
|
||||||
|
goto fin_lpcon;
|
||||||
|
//continue;
|
||||||
|
// l_pSeg = getWSegment (l_pGrid, l_pVirCon->X, l_pVirCon->Y, l_pVirCon->Z - 1);
|
||||||
|
//else
|
||||||
|
l_pSeg = getWSegmentCV(l_pGrid, l_pVirCon);
|
||||||
|
if (l_pSeg->SIGNAL_INDEX == WSEGMENT_FREE) {
|
||||||
|
l_pCon->critVC = l_pVirCon;
|
||||||
|
(l_pCon->NB_VC)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (l_pCon->NB_VC == 1) {
|
||||||
|
protectVC(i_pDataBase, l_pCon->critVC);
|
||||||
|
} else {
|
||||||
|
l_pCon->critVC = NULL;
|
||||||
|
}
|
||||||
|
fin_lpcon:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// maj con->NB_VC
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -451,10 +509,14 @@ chooseInternalConnector(ocrWRoutingGrid * i_pGrid,
|
||||||
i_pCon2->CON->TAG++;
|
i_pCon2->CON->TAG++;
|
||||||
|
|
||||||
// printf ("con : %ld con2 : %ld\n", l_uCon, l_uCon2);
|
// printf ("con : %ld con2 : %ld\n", l_uCon, l_uCon2);
|
||||||
if (!l_uCon)
|
if (!l_uCon) {
|
||||||
|
display (LEVEL, DEBUG, "\n failed for CON1 : %s\n", i_pCon->NAME);
|
||||||
return OCR_BAD_CON1;
|
return OCR_BAD_CON1;
|
||||||
if (!l_uCon2)
|
}
|
||||||
|
if (!l_uCon2) {
|
||||||
|
display (LEVEL, DEBUG, "\n failed for CON2 : %s\n", i_pCon2->NAME);
|
||||||
return OCR_BAD_CON2;
|
return OCR_BAD_CON2;
|
||||||
|
}
|
||||||
return OCR_OK;
|
return OCR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,11 +551,121 @@ chooseInternalConnector2(ocrWRoutingGrid * i_pGrid,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* protection des connecteurs isoles */
|
||||||
|
void
|
||||||
|
protectVC(ocrRoutingDataBase * i_pDataBase,
|
||||||
|
ocrVirtualConnector * i_pVirCon)
|
||||||
|
{
|
||||||
|
ocrWSegment *l_pSeg;
|
||||||
|
ocrWRoutingGrid *l_pGrid = i_pDataBase->GRID;
|
||||||
|
int z = 0;
|
||||||
|
|
||||||
|
//if (i_pVirCon->Z > 0)
|
||||||
|
// z = i_pVirCon->Z - 1;
|
||||||
|
z = i_pVirCon->Z;
|
||||||
|
|
||||||
|
//l_pSeg = getWSegmentCV (l_pGrid, i_pVirCon);
|
||||||
|
|
||||||
|
//for (z = i_pVirCon->Z ; z <= i_pDataBase->NB_OF_LAYERS ; z++) {
|
||||||
|
|
||||||
|
l_pSeg = getWSegment(l_pGrid, i_pVirCon->X, i_pVirCon->Y, z);
|
||||||
|
if (l_pSeg->SIGNAL_INDEX != WSEGMENT_FREE)
|
||||||
|
return;
|
||||||
|
if (getWSegDirection(i_pDataBase->PARAM, l_pSeg) == ocrHorizontal)
|
||||||
|
l_pSeg =
|
||||||
|
splitWSegment(i_pDataBase->PARAM, l_pGrid, l_pSeg,
|
||||||
|
i_pVirCon->X, i_pVirCon->X, WSEGMENT_OBSTACLE);
|
||||||
|
else
|
||||||
|
l_pSeg =
|
||||||
|
splitWSegment(i_pDataBase->PARAM, l_pGrid, l_pSeg,
|
||||||
|
i_pVirCon->Y, i_pVirCon->Y, WSEGMENT_OBSTACLE);
|
||||||
|
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
unProtectVC(ocrRoutingDataBase * i_pDataBase,
|
||||||
|
ocrVirtualConnector * i_pVirCon)
|
||||||
|
{
|
||||||
|
ocrWSegment *l_pSeg, *seg1, *seg2;
|
||||||
|
ocrWRoutingGrid *l_pGrid = i_pDataBase->GRID;
|
||||||
|
int z = 0, i;
|
||||||
|
|
||||||
|
//if (i_pVirCon->Z > 0)
|
||||||
|
// z = i_pVirCon->Z - 1;
|
||||||
|
z = i_pVirCon->Z;
|
||||||
|
|
||||||
|
//for (z = i_pVirCon->Z ; z <= i_pDataBase->NB_OF_LAYERS ; z++) {
|
||||||
|
//l_pSeg = getWSegmentCV (l_pGrid, i_pVirCon);
|
||||||
|
l_pSeg = getWSegment(l_pGrid, i_pVirCon->X, i_pVirCon->Y, z);
|
||||||
|
|
||||||
|
|
||||||
|
if (l_pSeg->SIGNAL_INDEX == WSEGMENT_OBSTACLE) {
|
||||||
|
//deleteSegment (i_pDataBase->PARAM, l_pGrid, l_pSeg);
|
||||||
|
l_pSeg->SIGNAL_INDEX = WSEGMENT_FREE;
|
||||||
|
|
||||||
|
// Fusion des segments libres
|
||||||
|
//mergeWSegment (i_pDataBase, l_pGrid, l_pSeg);
|
||||||
|
//return;
|
||||||
|
if (getWSegDirection(i_pDataBase->PARAM, l_pSeg) == ocrHorizontal) {
|
||||||
|
//printf("deprotect (%ld,%ld,%d):", 5 * i_pVirCon->X, 5 * i_pVirCon->Y, z);
|
||||||
|
seg1 = getWSegment(l_pGrid, i_pVirCon->X - 1, i_pVirCon->Y, z);
|
||||||
|
if (seg1->SIGNAL_INDEX == WSEGMENT_FREE) {
|
||||||
|
l_pSeg->P_MIN = seg1->P_MIN;
|
||||||
|
//printf ("G%ld;", seg1->P_MIN * 5);
|
||||||
|
//mbkfree (seg1);
|
||||||
|
//freeWSegment (seg1);
|
||||||
|
}
|
||||||
|
|
||||||
|
seg2 = getWSegment(l_pGrid, i_pVirCon->X + 1, i_pVirCon->Y, z);
|
||||||
|
if (seg2->SIGNAL_INDEX == WSEGMENT_FREE) {
|
||||||
|
l_pSeg->P_MAX = seg2->P_MAX;
|
||||||
|
//printf ("D%ld.", seg2->P_MAX * 5);
|
||||||
|
//freeWSegment (seg2);
|
||||||
|
//freeWSegment (seg2);
|
||||||
|
//mbkfree (seg2);
|
||||||
|
}
|
||||||
|
for (i = l_pSeg->P_MIN; i <= l_pSeg->P_MAX; i++)
|
||||||
|
setWGrid(l_pGrid, l_pSeg, i, i_pVirCon->Y, z);
|
||||||
|
//printf ("\n");
|
||||||
|
} else {
|
||||||
|
seg1 = getWSegment(l_pGrid, i_pVirCon->X, i_pVirCon->Y - 1, z);
|
||||||
|
if (seg1->SIGNAL_INDEX == WSEGMENT_FREE) {
|
||||||
|
l_pSeg->P_MIN = seg1->P_MIN;
|
||||||
|
//mbkfree (seg1);
|
||||||
|
//freeWSegment (seg1);
|
||||||
|
}
|
||||||
|
|
||||||
|
seg2 = getWSegment(l_pGrid, i_pVirCon->X, i_pVirCon->Y + 1, z);
|
||||||
|
if (seg2->SIGNAL_INDEX == WSEGMENT_FREE) {
|
||||||
|
l_pSeg->P_MAX = seg2->P_MAX;
|
||||||
|
//freeWSegment (seg2);
|
||||||
|
//mbkfree (seg2);
|
||||||
|
}
|
||||||
|
for (i = l_pSeg->P_MIN; i <= l_pSeg->P_MAX; i++)
|
||||||
|
setWGrid(l_pGrid, l_pSeg, i_pVirCon->X, i, z);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//printf ("non - de - protection !\n");
|
||||||
|
}
|
||||||
|
//}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Marquage de segments */
|
/* Marquage de segments */
|
||||||
|
|
||||||
// XXX XXX XXX XXX XXX XXX XXX XXX
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
markSegmentAsFree(ocrRoutingDataBase * i_pDataBase, ocrSignal * i_pSignal,
|
markSegmentAsFree(ocrRoutingDataBase * i_pDataBase, ocrSignal * i_pSignal,
|
||||||
ocrNaturalInt INDEX)
|
ocrNaturalInt INDEX)
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/15 14:37:26 $
|
$Date: 2002/04/25 13:41:34 $
|
||||||
$Log: ocrDataBaseUtil.c,v $
|
$Log: ocrDataBaseUtil.c,v $
|
||||||
|
Revision 1.2 2002/04/25 13:41:34 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.1 2002/03/15 14:37:26 hcl
|
Revision 1.1 2002/03/15 14:37:26 hcl
|
||||||
Ca roule.
|
Ca roule.
|
||||||
|
|
||||||
|
@ -41,7 +44,7 @@
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
|
|
||||||
static char *res_id =
|
static char *res_id =
|
||||||
"$Id: ocrDataBaseUtil.c,v 1.1 2002/03/15 14:37:26 hcl Exp $";
|
"$Id: ocrDataBaseUtil.c,v 1.2 2002/04/25 13:41:34 hcl Exp $";
|
||||||
extern ocrOption *g_pOption;
|
extern ocrOption *g_pOption;
|
||||||
#define LEVEL (g_pOption->LEVEL)
|
#define LEVEL (g_pOption->LEVEL)
|
||||||
|
|
||||||
|
@ -299,6 +302,8 @@ ocrSignal *createSignal(losig_list * i_pLoSig)
|
||||||
l_pSignal->VIA = NULL;
|
l_pSignal->VIA = NULL;
|
||||||
l_pSignal->GLOBAL = NULL;
|
l_pSignal->GLOBAL = NULL;
|
||||||
|
|
||||||
|
l_pSignal->HARD = 0;
|
||||||
|
|
||||||
l_pSignal->WIN = 0;
|
l_pSignal->WIN = 0;
|
||||||
l_pSignal->TYPE = 0;
|
l_pSignal->TYPE = 0;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
/*
|
/*
|
||||||
### -------------------------------------------------- ###
|
### -------------------------------------------------- ###
|
||||||
$Author: hcl $
|
$Author: hcl $
|
||||||
$Date: 2002/03/15 14:37:27 $
|
$Date: 2002/04/25 13:41:34 $
|
||||||
$Log: ocrSignalUtil.c,v $
|
$Log: ocrSignalUtil.c,v $
|
||||||
|
Revision 1.2 2002/04/25 13:41:34 hcl
|
||||||
|
New ripup/reroute loop, bug-kill (CALU&TALU).
|
||||||
|
|
||||||
Revision 1.1 2002/03/15 14:37:27 hcl
|
Revision 1.1 2002/03/15 14:37:27 hcl
|
||||||
Ca roule.
|
Ca roule.
|
||||||
|
|
||||||
|
@ -44,7 +47,7 @@
|
||||||
#include "ocrConnectorUtil.h"
|
#include "ocrConnectorUtil.h"
|
||||||
|
|
||||||
static char *res_id =
|
static char *res_id =
|
||||||
"$Id: ocrSignalUtil.c,v 1.1 2002/03/15 14:37:27 hcl Exp $";
|
"$Id: ocrSignalUtil.c,v 1.2 2002/04/25 13:41:34 hcl Exp $";
|
||||||
|
|
||||||
extern ocrOption *g_pOption;
|
extern ocrOption *g_pOption;
|
||||||
|
|
||||||
|
@ -136,11 +139,10 @@ int funcPriorityRandom(const void *a, const void *b)
|
||||||
int funcPriorityCon(const void *a, const void *b)
|
int funcPriorityCon(const void *a, const void *b)
|
||||||
{
|
{
|
||||||
if ((*(ocrSignal **) b)->PRIORITY == (*(ocrSignal **) a)->PRIORITY)
|
if ((*(ocrSignal **) b)->PRIORITY == (*(ocrSignal **) a)->PRIORITY)
|
||||||
return (*(ocrSignal **) b)->NB_CON - (*(ocrSignal **) a)->NB_CON;
|
//return (*(ocrSignal **) b)->NB_CON - (*(ocrSignal **) a)->NB_CON;
|
||||||
//return (*(ocrSignal **) a)->NB_CON - (*(ocrSignal **) b)->NB_CON;
|
return (*(ocrSignal **) a)->NB_CON - (*(ocrSignal **) b)->NB_CON;
|
||||||
else
|
else
|
||||||
return (*(ocrSignal **) b)->PRIORITY -
|
return (*(ocrSignal **) b)->PRIORITY - (*(ocrSignal **) a)->PRIORITY;
|
||||||
(*(ocrSignal **) a)->PRIORITY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue