Files
magic/mzrouter/mzDebug.c
T
R. Timothy Edwards 516c9d7635 First cut of pulling the TT_SIDE bit out of the tile database
and forcing it to be passed as an argument to all the callback
functions for the search routines that require it.  Magic now
compiles and runs with the new code, but there are a number of
known issues that need to be fixed up.  Committing now so that
I can rebase on the last update to the master branch.
2026-01-09 12:05:03 -05:00

567 lines
12 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 <stdint.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, dinfo, cxp)
Tile *tile;
TileType dinfo; /* (unused) */
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 %lx (x: %d to %d, y: %d to %d)\n",
(intmax_t) (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;
}