magic/mzrouter/mzHint.c

197 lines
5.4 KiB
C

/*
* mzHint.c --
*
* Builds global hint fence and rotate planes from hint info in mask data.
*
* *********************************************************************
* * 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. *
* *********************************************************************
*
* There are two global hint planes. One is merged into
* maximal horizontal strips, and the other
* into maximal vertical strips.
*/
#ifndef lint
static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/mzrouter/mzHint.c,v 1.1.1.1 2008/02/03 20:43:50 tim Exp $";
#endif /* not lint */
#include <stdio.h>
#include "utils/magic.h"
#include "utils/geometry.h"
#include "utils/geofast.h"
#include "tiles/tile.h"
#include "utils/hash.h"
#include "database/database.h"
#include "utils/signals.h"
#include "textio/textio.h"
#include "windows/windows.h"
#include "dbwind/dbwind.h"
#include "utils/malloc.h"
#include "utils/list.h"
#include "debug/debug.h"
#include "textio/textio.h"
#include "utils/heap.h"
#include "mzrouter/mzrouter.h"
#include "mzrouter/mzInternal.h"
/*
* ----------------------------------------------------------------------------
*
* mzBuildHFR --
*
* Traverse cells in database, building global Hint, Fence and Rotate
* planes. This serves two functions:
* 1. It flattens the hierarchy.
* 2. It creates max-vertical strip versions of hint and rotate.
* (VFencePlane not needed since fence info is translated into
* blockages in block planes)
* Results:
* None.
*
* Side effects:
* Global Hint, Fence and Rotate planes built up.
*
* ----------------------------------------------------------------------------
*/
void
mzBuildHFR(srcUse, area)
CellUse *srcUse; /* Search this cell and children for mask info */
Rect *area; /* Area over which planes will be built */
{
int mzBuildHFRFunc();
SearchContext scx;
/* Clear global hint planes */
{
/* Clear Hint Planes */
DBClearPaintPlane(mzHHintPlane);
DBClearPaintPlane(mzVHintPlane);
/* Clear Fence Plane
* (only one plane since this info is converted to info in blockage
* planes prior to maze routing) */
DBClearPaintPlane(mzHFencePlane);
/* Clear Rotate Planes */
DBClearPaintPlane(mzHRotatePlane);
DBClearPaintPlane(mzVRotatePlane);
}
/* set up search context */
scx.scx_area = *area;
scx.scx_trans = GeoIdentityTransform;
scx.scx_use = srcUse;
/* clip search area to bounding box to avoid overflow during transfroms */
GEOCLIP(&(scx.scx_area),&(srcUse->cu_def->cd_bbox));
if(mzTopHintsOnly)
/* Search the TOP LEVEL cell ONLY, processing each tile on hint plane */
{
(void) DBNoTreeSrTiles(&scx,
&mzHintTypesMask,
mzCellExpansionMask,
mzBuildHFRFunc,
(ClientData) NULL);
}
else
/* Search the cell tree, processing each tile on hint plane
* in expanded cell.
*/
{
(void) DBTreeSrTiles(&scx,
&mzHintTypesMask,
mzCellExpansionMask,
mzBuildHFRFunc,
(ClientData) NULL);
}
return;
}
/*
* ----------------------------------------------------------------------------
*
* mzBuildHFRFunc --
*
* Called by DBTreeSrTiles for each solid tile found on hint planes.
* "Copies" tiles into global hint, fence and rotate planes.
*
* Results:
* Returns 0 always.
*
* Side effects:
* Paints into global hint, fence and rotate planes.
*
* ----------------------------------------------------------------------------
*/
int
mzBuildHFRFunc(tile, cxp)
Tile *tile;
TreeContext *cxp;
{
SearchContext *scx = cxp->tc_scx;
Rect r, rDest;
/* Transform to result coordinates */
TITORECT(tile, &r);
GEOCLIP(&r, &scx->scx_area);
GEOTRANSRECT(&scx->scx_trans, &r, &rDest);
if(TiGetType(tile)==TT_MAGNET)
{
/* Paint into global hint planes */
DBPaintPlane(mzHHintPlane,
&rDest,
DBStdPaintTbl(TT_MAGNET, PL_M_HINT),
(PaintUndoInfo *) NULL);
DBPaintPlaneVert(mzVHintPlane,
&rDest,
DBStdPaintTbl(TT_MAGNET, PL_M_HINT),
(PaintUndoInfo *) NULL);
}
else if(TiGetType(tile)==TT_FENCE)
{
/* Paint into global fence plane
* (no vert plane required for fence, since fence
* translated to blocks in blockage planes)
*/
DBPaintPlane(mzHFencePlane,
&rDest,
DBStdPaintTbl(TT_FENCE, PL_F_HINT),
(PaintUndoInfo *) NULL);
}
else
{
ASSERT(TiGetType(tile)==TT_ROTATE,"mzBuildHFRFunc");
/* Paint into global rotate planes */
DBPaintPlane(mzHRotatePlane,
&rDest,
DBStdPaintTbl(TT_ROTATE, PL_R_HINT),
(PaintUndoInfo *) NULL);
DBPaintPlaneVert(mzVRotatePlane,
&rDest,
DBStdPaintTbl(TT_ROTATE, PL_R_HINT),
(PaintUndoInfo *) NULL);
}
/* return 0 - to continue search */
return(0);
}