197 lines
5.4 KiB
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);
|
|
}
|