565 lines
11 KiB
C
565 lines
11 KiB
C
/*
|
||
* mzDebug.c --
|
||
*
|
||
* Routines for debugging.
|
||
*
|
||
* *********************************************************************
|
||
* * Copyright (C) 1988, 1990 Michael H. Arnold and the Regents of the *
|
||
* * University of California. *
|
||
* * Permission to use, copy, modify, and distribute this *
|
||
* * software and its documentation for any purpose and without *
|
||
* * fee is hereby granted, provided that the above copyright *
|
||
* * notice appear in all copies. The University of California *
|
||
* * makes no representations about the suitability of this *
|
||
* * software for any purpose. It is provided "as is" without *
|
||
* * express or implied warranty. Export of this software outside *
|
||
* * of the United States of America may require an export license. *
|
||
* *********************************************************************
|
||
*/
|
||
|
||
#ifndef lint
|
||
static char rcsid[] __attribute__ ((unused)) = "$$";
|
||
#endif /* not lint */
|
||
|
||
#include <stdio.h>
|
||
|
||
#include "utils/magic.h"
|
||
#include "utils/signals.h"
|
||
#include "textio/textio.h"
|
||
#include "utils/hash.h"
|
||
#include "utils/geometry.h"
|
||
#include "tiles/tile.h"
|
||
#include "database/database.h"
|
||
#include "utils/malloc.h"
|
||
#include "utils/list.h"
|
||
#include "utils/heap.h"
|
||
#include "mzrouter/mzrouter.h"
|
||
#include "mzrouter/mzInternal.h"
|
||
|
||
/* extra variables for use with dbx */
|
||
RoutePath *mzDPath;
|
||
Tile *mzTile;
|
||
int mz;
|
||
|
||
/* Forward declarations */
|
||
extern void mzPrintRL();
|
||
extern void mzPrintRT();
|
||
extern void mzPrintRC();
|
||
extern void mzPrintRP();
|
||
extern void mzPrintPathHead();
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* MZPrintRCListNames --
|
||
*
|
||
* Print names of route contacts linked together by external "list"
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
MZPrintRCListNames(l)
|
||
List *l;
|
||
{
|
||
RouteContact *rC;
|
||
|
||
TxPrintf("\t");
|
||
|
||
for(;l!=NULL; l=LIST_TAIL(l))
|
||
{
|
||
rC = (RouteContact *) LIST_FIRST(l);
|
||
TxPrintf("%s ",DBTypeLongNameTbl[rC->rc_routeType.rt_tileType]);
|
||
}
|
||
|
||
TxPrintf("\n");
|
||
return;
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* MZPrintRLListNames --
|
||
*
|
||
* Print names of route Layers linked together by external "list"
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
MZPrintRLListNames(l)
|
||
List *l;
|
||
{
|
||
RouteLayer *rL;
|
||
|
||
TxPrintf("\t");
|
||
|
||
for(;l!=NULL; l=LIST_TAIL(l))
|
||
{
|
||
rL = (RouteLayer *) LIST_FIRST(l);
|
||
TxPrintf("%s ",DBTypeLongNameTbl[rL->rl_routeType.rt_tileType]);
|
||
}
|
||
|
||
TxPrintf("\n");
|
||
return;
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* MZPrintRLs --
|
||
*
|
||
* Print list of RouteLayer strucs.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
MZPrintRLs(rL)
|
||
RouteLayer *rL;
|
||
{
|
||
while(rL!=NULL)
|
||
{
|
||
mzPrintRL(rL);
|
||
rL = rL->rl_next;
|
||
|
||
if(rL!=NULL) TxMore("");
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* mzPrintRL --
|
||
*
|
||
* Print single RouteLayer struc.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
mzPrintRL(rL)
|
||
RouteLayer *rL;
|
||
{
|
||
List *cL;
|
||
|
||
TxPrintf("ROUTE LAYER:\n");
|
||
mzPrintRT(&(rL->rl_routeType));
|
||
TxPrintf("\tplaneNum = %d (%s)\n",rL->rl_planeNum,
|
||
DBPlaneLongNameTbl[rL->rl_planeNum]);
|
||
|
||
TxPrintf("\tcontactL = ");
|
||
for (cL=rL->rl_contactL; cL!=NULL; cL=LIST_TAIL(cL))
|
||
{
|
||
TxPrintf("%s",
|
||
DBTypeLongNameTbl[
|
||
((RouteContact*) LIST_FIRST(cL))->
|
||
rc_routeType.rt_tileType]);
|
||
|
||
if(((RouteContact*) LIST_FIRST(cL))->rc_rLayer1 == rL)
|
||
TxPrintf("(to %s) ", DBTypeLongNameTbl[
|
||
((RouteContact*) LIST_FIRST(cL))->
|
||
rc_rLayer2->rl_routeType.rt_tileType]);
|
||
else
|
||
TxPrintf("(to %s) ", DBTypeLongNameTbl[
|
||
((RouteContact*) LIST_FIRST(cL))->
|
||
rc_rLayer1->rl_routeType.rt_tileType]);
|
||
}
|
||
TxPrintf("\n");
|
||
|
||
TxPrintf("\thCost = %d\n",
|
||
rL->rl_hCost);
|
||
TxPrintf("\tvCost = %d\n",
|
||
rL->rl_vCost);
|
||
TxPrintf("\tjogCost = %d\n",
|
||
rL->rl_jogCost);
|
||
TxPrintf("\thintCost = %d\n",rL->rl_hintCost);
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* mzPrintRouteType --
|
||
*
|
||
* Print routeType struc.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
mzPrintRT(rT)
|
||
RouteType *rT;
|
||
{
|
||
int i;
|
||
|
||
TxPrintf("\tROUTETYPE:\n");
|
||
TxPrintf("\t\ttileType = %s\n", DBTypeLongNameTbl[rT->rt_tileType]);
|
||
TxPrintf("\t\tactive = %s\n", (rT->rt_active ? "TRUE" : "FALSE"));
|
||
TxPrintf("\t\twidth = %d\n",rT->rt_width);
|
||
|
||
TxPrintf("\t\tspacing = ");
|
||
for (i=0;i<TT_MAXTYPES;i++)
|
||
if(rT->rt_spacing[i]>=0)
|
||
TxPrintf("%s(%d) ",DBTypeLongNameTbl[i],rT->rt_spacing[i]);
|
||
if(rT->rt_spacing[TT_SUBCELL]>=0)
|
||
TxPrintf("%s(%d) ","SUBCELL",rT->rt_spacing[TT_SUBCELL]);
|
||
TxPrintf("\n");
|
||
|
||
TxPrintf("\t\teffWidth = %d\n",rT->rt_effWidth);
|
||
|
||
for (i=0;i<TT_MAXTYPES;i++)
|
||
if(rT->rt_bloatBot[i]>=0)
|
||
TxPrintf("%s(%d) ",DBTypeLongNameTbl[i],rT->rt_bloatBot[i]);
|
||
if(rT->rt_spacing[TT_SUBCELL]>=0)
|
||
TxPrintf("%s(%d) ","SUBCELL",rT->rt_bloatBot[TT_SUBCELL]);
|
||
TxPrintf("\n");
|
||
|
||
for (i=0;i<TT_MAXTYPES;i++)
|
||
if(rT->rt_bloatTop[i]>=0)
|
||
TxPrintf("%s(%d) ",DBTypeLongNameTbl[i],rT->rt_bloatTop[i]);
|
||
if(rT->rt_spacing[TT_SUBCELL]>=0)
|
||
TxPrintf("%s(%d) ","SUBCELL",rT->rt_bloatTop[TT_SUBCELL]);
|
||
TxPrintf("\n");
|
||
|
||
TxPrintf("\t\tnext = %s\n",
|
||
(rT->rt_next ? DBTypeLongNameTbl[rT->rt_next->rt_tileType] : "(nil)"));
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* MZPrintRCs --
|
||
*
|
||
* Print list of RouteLayer strucs.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
MZPrintRCs(rC)
|
||
RouteContact *rC;
|
||
{
|
||
while(rC!=NULL)
|
||
{
|
||
mzPrintRC(rC);
|
||
rC = rC->rc_next;
|
||
if(rC!=NULL) TxMore("");
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* mzPrintRC --
|
||
*
|
||
* Print single RouteContact struc.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
mzPrintRC(rC)
|
||
RouteContact *rC;
|
||
{
|
||
TxPrintf("ROUTE CONTACT:\n");
|
||
mzPrintRT(&(rC->rc_routeType));
|
||
|
||
TxPrintf("\trLayer1 = %s\n",
|
||
DBTypeLongNameTbl[rC->rc_rLayer1->rl_routeType.rt_tileType]);
|
||
TxPrintf("\trLayer2 = %s\n",
|
||
DBTypeLongNameTbl[rC->rc_rLayer2->rl_routeType.rt_tileType]);
|
||
|
||
TxPrintf("\tcost = %d\n",
|
||
rC->rc_cost);
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* mzPrintRPs --
|
||
*
|
||
* Print list of RoutePath strucs.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
mzPrintRPs(path)
|
||
RoutePath *path;
|
||
{
|
||
while(path!=NULL)
|
||
{
|
||
mzPrintRP(path);
|
||
path = path->rp_back;
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* mzPrintRP --
|
||
*
|
||
* Print single RoutePath struc.
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* None
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
mzPrintRP(path)
|
||
RoutePath *path;
|
||
{
|
||
TxPrintf("ROUTE PATH:");
|
||
TxPrintf(" layer = %s",
|
||
DBTypeLongNameTbl[path->rp_rLayer->rl_routeType.rt_tileType]);
|
||
TxPrintf(" entry = (%d, %d)", path->rp_entry.p_x, path->rp_entry.p_y);
|
||
TxPrintf(" cost = %.0f",
|
||
(double)(path->rp_cost));
|
||
TxPrintf(" extCode = { ");
|
||
if (path->rp_extendCode & EC_RIGHT)
|
||
{
|
||
TxPrintf("right ");
|
||
}
|
||
if (path->rp_extendCode & EC_LEFT)
|
||
{
|
||
TxPrintf("left ");
|
||
}
|
||
if (path->rp_extendCode & EC_UP)
|
||
{
|
||
TxPrintf("up");
|
||
}
|
||
if (path->rp_extendCode & EC_DOWN)
|
||
{
|
||
TxPrintf("down ");
|
||
}
|
||
if (path->rp_extendCode & (EC_UDCONTACTS | EC_LRCONTACTS))
|
||
{
|
||
TxPrintf("contacts ");
|
||
}
|
||
|
||
TxPrintf("}\n");
|
||
|
||
return;
|
||
}
|
||
|
||
/* mzPrintPathHead -- */
|
||
void
|
||
mzPrintPathHead(path)
|
||
RoutePath *path;
|
||
{
|
||
|
||
if(path==NULL)
|
||
{
|
||
TxPrintf(" NULL Path.\n");
|
||
}
|
||
else
|
||
{
|
||
TxPrintf(" point=(%d,%d), layer=%s, orient = '%c'",
|
||
path->rp_entry.p_x,
|
||
path->rp_entry.p_y,
|
||
DBTypeLongNameTbl[path->rp_rLayer->rl_routeType.rt_tileType],
|
||
path->rp_orient);
|
||
TxPrintf(", togo=%.0f",
|
||
(double)(path->rp_togo));
|
||
TxPrintf(", cost=%.0f\n",
|
||
(double)(path->rp_cost));
|
||
|
||
TxPrintf(" extendCode = { ");
|
||
if (path->rp_extendCode & EC_RIGHT)
|
||
{
|
||
TxPrintf("right ");
|
||
}
|
||
if (path->rp_extendCode & EC_LEFT)
|
||
{
|
||
TxPrintf("left ");
|
||
}
|
||
if (path->rp_extendCode & EC_UP)
|
||
{
|
||
TxPrintf("up ");
|
||
}
|
||
if (path->rp_extendCode & EC_DOWN)
|
||
{
|
||
TxPrintf("down ");
|
||
}
|
||
if (path->rp_extendCode & (EC_LRCONTACTS | EC_UDCONTACTS))
|
||
{
|
||
TxPrintf("contacts ");
|
||
}
|
||
|
||
TxPrintf("}\n");
|
||
}
|
||
return;
|
||
}
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* mzDumpTags --
|
||
*
|
||
* Dump tags on data tiles (for debugging).
|
||
*
|
||
* Results:
|
||
* None.
|
||
*
|
||
* Side effects:
|
||
* info written to file or via TxPrintf()
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
void
|
||
mzDumpTags(area)
|
||
Rect *area;
|
||
{
|
||
int mzDumpTagsFunc();
|
||
SearchContext scx;
|
||
|
||
/* mzke sure mzRouteUse is initialed */
|
||
if(mzRouteUse == NULL)
|
||
{
|
||
TxPrintf("Can not dump tags, until mzRouteUse is initialed.\n");
|
||
TxPrintf("(Do an iroute first.)\n");
|
||
return;
|
||
}
|
||
|
||
/* look at all data tiles under box. */
|
||
scx.scx_area = *area;
|
||
scx.scx_trans = GeoIdentityTransform;
|
||
scx.scx_use = mzRouteUse;
|
||
|
||
(void) DBTreeSrTiles(
|
||
&scx,
|
||
&DBAllTypeBits,
|
||
0, /* look inside all subcells */
|
||
mzDumpTagsFunc,
|
||
(ClientData) NULL);
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
/*
|
||
* ----------------------------------------------------------------------------
|
||
*
|
||
* mzDumpTagsFunc --
|
||
*
|
||
* Filter function called above, dumps tag info for all tiles in search area.
|
||
*
|
||
* Results:
|
||
* Returns 0 always.
|
||
*
|
||
* Side effects:
|
||
* Dumps info associated with tile.
|
||
*
|
||
* ----------------------------------------------------------------------------
|
||
*/
|
||
|
||
int
|
||
mzDumpTagsFunc(tile, cxp)
|
||
Tile *tile;
|
||
TreeContext *cxp;
|
||
{
|
||
SearchContext *scx = cxp->tc_scx;
|
||
Rect r;
|
||
|
||
/* if tile has no client data attached, skip it */
|
||
if (tile->ti_client == (ClientData)CLIENTDEFAULT)
|
||
return 0;
|
||
|
||
/* Get boundary of tile */
|
||
TITORECT(tile, &r);
|
||
|
||
/* print tile bounds */
|
||
TxPrintf("tile %x (x: %d to %d, y: %d to %d)\n",
|
||
(pointertype) tile, r.r_xbot, r.r_xtop, r.r_ybot, r.r_ytop);
|
||
|
||
/* dump rects attached to client field */
|
||
{
|
||
List *l;
|
||
for(l=(List *) (tile->ti_client); l!=NULL; l=LIST_TAIL(l))
|
||
{
|
||
Rect *rTerm = (Rect *) LIST_FIRST(l);
|
||
|
||
TxPrintf("\tattached dest area (x: %d to %d, y: %d to %d)\n",
|
||
rTerm->r_xbot,
|
||
rTerm->r_xtop,
|
||
rTerm->r_ybot,
|
||
rTerm->r_ytop);
|
||
}
|
||
}
|
||
|
||
/* continue search */
|
||
return 0;
|
||
}
|
||
|