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.
This commit is contained in:
parent
d24d52e403
commit
516c9d7635
|
|
@ -0,0 +1,123 @@
|
|||
Having abandoned the attempt to redefine a split tile as
|
||||
two separate tile entries, I am returning to the problem
|
||||
of removing TT_SIDE from the database.
|
||||
|
||||
TT_SIDE has been used to pass information to callback
|
||||
routines to indicate which side of a tile should be
|
||||
processed. This should never have been done, because
|
||||
it causes the database to be altered during searches,
|
||||
which prevents searches from being parallelized.
|
||||
|
||||
To remove this dependency:
|
||||
|
||||
All the basic search functions will require an
|
||||
additional argument which is a boolean and indicates
|
||||
which side of a split tile is to be processed by the
|
||||
callback. It is probably fine to treat the argument
|
||||
like "dinfo", which is to make it a TileType and
|
||||
set TT_DIAGONAL, TT_SIDE, and TT_DIRECTION as
|
||||
needed. For the basic use of callbacks, it will
|
||||
generally suffice to set only TT_SIDE.
|
||||
|
||||
-----------
|
||||
|
||||
Both TT_SIDE and SplitSide() are used frequently.
|
||||
Which is why I have not done this before.
|
||||
|
||||
First, enumerate all callback functions which use each
|
||||
of the above, and the search routine that will require
|
||||
the extra argument.
|
||||
|
||||
Search functions or functions needing changes:
|
||||
(Followed by the number of occurrences)
|
||||
DBSrPaintArea() 401
|
||||
DBTreeSrTiles() 99 <done>
|
||||
DBSrPaintNMArea() 16 <done>
|
||||
DBSrPaintClient() 15 <done>
|
||||
SimTreeSrTiles()
|
||||
|
||||
SelEnumPaint()
|
||||
GrClipTriangle()
|
||||
GrDrawTriangleEdge()
|
||||
GrDiagonal()
|
||||
DBTransformDiagonal()
|
||||
GrBox()
|
||||
|
||||
SplitSide():
|
||||
|
||||
calmaMergePaintFunc() --- Comment, unused, remove.
|
||||
calmaWritePaintFunc()
|
||||
calmaMergePaintFuncZ() --- Comment, unused, remove.
|
||||
calmaWritePaintFuncZ()
|
||||
cifHierCopyFunc()
|
||||
cifHierErrorFunc()
|
||||
cmdDropPaintCell()
|
||||
|
||||
To be fixed: STACKPUSH/STACKPOP stuff in resis/ResUtils.c
|
||||
resAddField will need to do something similar to
|
||||
extract to handle two clientData records for split tiles
|
||||
in ResAddPlumbing and ResRemovePlumbing.
|
||||
|
||||
dbcUnconnectFunc() --- Need to handle side, or is this already handled?
|
||||
|
||||
extConnFindFunc() --- Select proper region depending on side
|
||||
extInterSubtreeTile() --- Should handle non-Manhattan tiles.
|
||||
lefConnectFunc() --- write polygons to LEF?
|
||||
resExpandDevFunc() --- Probably needs to handle split types and replace STACKPUSH.
|
||||
(Lots to do in ResUtils.c)
|
||||
touchingTypesFunc() --- Should distinguish types between sides, and handle
|
||||
triangle geometry.
|
||||
|
||||
cifInteractingRegions() --- Uses the cifSquares code, but cifSquares does not
|
||||
handle non-Manhattan geometry, and interacting/overlapping
|
||||
methods must.
|
||||
|
||||
antennaAccumFunc() --- Needs to handle non-Manhattan geometry.
|
||||
|
||||
extTransPerimFunc() --- Needs to set TT_SIDE based on boundary direction
|
||||
before calling DBSrConnectOnePlane (ExtBasic.c:3882)
|
||||
ResMultiPlaneFunc() --- Needs to call ResNewSDDevice() with dinfo information
|
||||
|
||||
Any routine that does not use "dinfo" should do "if (dinfo & TT_SIDE) return 0".
|
||||
|
||||
Ought to create a single function for simply returning "1" and replace all the
|
||||
assorted functions that do that individually.
|
||||
|
||||
---------------------
|
||||
First pass is done, minus issues reported above that need to be worked on. The
|
||||
basic issue of adding an extra argument to all the callback functions is basically
|
||||
completed.
|
||||
|
||||
Moving on to compiling. . .
|
||||
CIFgen.c has lots of warnings around PUSHTILE(). Probably an incorrect cast, but
|
||||
I need to check all of the uses of PUSH and POP everywhere, anyway.
|
||||
|
||||
1/2/2026:
|
||||
Compiles now!
|
||||
Debug. . .
|
||||
Errors in dbwind (missed a DBSrPaintArea() call)
|
||||
Need to pass dinfo to GrBox() and GrBoxOutline()
|
||||
|
||||
Issue: Paint square on top of diagonal edge, ends up with one part of the tile
|
||||
not properly split at the edge; the tile goes to infinity and has a non-space
|
||||
type.
|
||||
|
||||
Reminder: Need to check for all instances of SplitSide(), as there should not
|
||||
be any. There are still 38 references that need to be removed.
|
||||
|
||||
Fix: extWalkTop (Bottom, Right, Left). . . type should not have been set by
|
||||
the split side of tile "tp". Should be according to the side being searched
|
||||
and the diagonal directions of "tile" and "tp".
|
||||
|
||||
ResUtils: Cannot use STACKPUSH and STACKPOP
|
||||
|
||||
A number of remaining uses of SplitSide() are in routines that were not fixed
|
||||
for dinfo or are not directly called from modified search functions, so will
|
||||
need to fix each one in turn.
|
||||
|
||||
Add dinfo to extSubtreeTileToNode() and extSubtreeHardNode()
|
||||
extNodeToTile needs to return dinfo. . .
|
||||
|
||||
extGetRegion() will need to be handled but only when I'm done with this and
|
||||
working on being able to attach two regions to a split tile.
|
||||
|
||||
|
|
@ -245,7 +245,9 @@ calmaExact(void)
|
|||
int pNum;
|
||||
Plane *newplane;
|
||||
Plane **parray;
|
||||
int gdsCopyPaintFunc(Tile *tile, GDSCopyRec *gdsCopyRec); /* Forward reference */
|
||||
|
||||
/* Forward reference */
|
||||
int gdsCopyPaintFunc(Tile *tile, TileType dinfo, GDSCopyRec *gdsCopyRec);
|
||||
|
||||
parray = (Plane **)mallocMagic(MAXCIFRLAYERS * sizeof(Plane *));
|
||||
|
||||
|
|
@ -751,6 +753,7 @@ calmaParseElement(
|
|||
int
|
||||
calmaEnumFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
int *plane)
|
||||
{
|
||||
return 1;
|
||||
|
|
@ -789,12 +792,13 @@ calmaElementSref(
|
|||
Point refarray[3], refunscaled[3], p;
|
||||
CellUse *use;
|
||||
CellDef *def;
|
||||
int gdsCopyPaintFunc(Tile *tile, GDSCopyRec *gdsCopyRec); /* Forward reference */
|
||||
int gdsHasUses(CellUse *use, ClientData clientdata); /* Forward reference */
|
||||
/* Added by NP */
|
||||
char *useid = NULL, *arraystr = NULL;
|
||||
int propAttrType;
|
||||
|
||||
/* Forward reference */
|
||||
int gdsCopyPaintFunc(Tile *tile, TileType dinfo, GDSCopyRec *gdsCopyRec);
|
||||
int gdsHasUses(CellUse *use, ClientData clientdata);
|
||||
|
||||
/* Skip CALMA_ELFLAGS, CALMA_PLEX */
|
||||
calmaSkipSet(calmaElementIgnore);
|
||||
|
||||
|
|
@ -1289,27 +1293,28 @@ gdsHasUses(
|
|||
int
|
||||
gdsCopyPaintFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
GDSCopyRec *gdsCopyRec)
|
||||
{
|
||||
int pNum;
|
||||
TileType dinfo;
|
||||
TileType newdinfo;
|
||||
Rect sourceRect, targetRect;
|
||||
Transform *trans = gdsCopyRec->trans;
|
||||
Plane *plane = gdsCopyRec->plane;
|
||||
|
||||
dinfo = TiGetTypeExact(tile);
|
||||
newdinfo = TiGetTypeExact(tile) | dinfo;
|
||||
|
||||
if (trans)
|
||||
{
|
||||
TiToRect(tile, &sourceRect);
|
||||
GeoTransRect(trans, &sourceRect, &targetRect);
|
||||
if (IsSplit(tile))
|
||||
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), trans);
|
||||
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile), trans);
|
||||
}
|
||||
else
|
||||
TiToRect(tile, &targetRect);
|
||||
|
||||
DBNMPaintPlane(plane, dinfo, &targetRect, CIFPaintTable,
|
||||
DBNMPaintPlane(plane, newdinfo, &targetRect, CIFPaintTable,
|
||||
(PaintUndoInfo *)NULL);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -97,10 +97,10 @@ typedef struct {
|
|||
|
||||
/* Forward declarations */
|
||||
extern int calmaWriteInitFunc(CellDef *def);
|
||||
extern int calmaWritePaintFunc(Tile *tile, calmaOutputStruct *cos);
|
||||
extern int calmaMergePaintFunc(Tile *tile, calmaOutputStruct *cos);
|
||||
extern int calmaWritePaintFunc(Tile *tile, TileType dinfo, calmaOutputStruct *cos);
|
||||
extern int calmaMergePaintFunc(Tile *tile, TileType dinfo, calmaOutputStruct *cos);
|
||||
extern int calmaWriteUseFunc(CellUse *use, FILE *f);
|
||||
extern int calmaPaintLabelFunc(Tile *tile, calmaOutputStruct *cos);
|
||||
extern int calmaPaintLabelFunc(Tile *tile, TileType dinfo, calmaOutputStruct *cos);
|
||||
extern void calmaWriteContacts(FILE *f);
|
||||
extern void calmaDelContacts(void);
|
||||
extern void calmaOutFunc(CellDef *def, FILE *f, const Rect *cliprect);
|
||||
|
|
@ -2464,6 +2464,7 @@ calmaProcessBoundary(
|
|||
int
|
||||
calmaMergePaintFunc(
|
||||
Tile *tile, /* Tile to be written out. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
calmaOutputStruct *cos) /* Information needed by algorithm */
|
||||
{
|
||||
FILE *f = cos->f;
|
||||
|
|
@ -2494,11 +2495,10 @@ calmaMergePaintFunc(
|
|||
split_type = -1;
|
||||
if (IsSplit(t))
|
||||
{
|
||||
/* If we use SplitSide, then we need to set it when the */
|
||||
/* If we use TT_SIDE, then we need to set it when the */
|
||||
/* tile is pushed. Since these are one-or-zero mask layers */
|
||||
/* I assume it is okay to just check which side is TT_SPACE */
|
||||
|
||||
/* split_type = (SplitSide(t) << 1) | SplitDirection(t); */
|
||||
split_type = SplitDirection(t);
|
||||
if (TiGetLeftType(t) == TT_SPACE) split_type |= 2;
|
||||
num_points = 2;
|
||||
|
|
@ -2721,7 +2721,9 @@ right_search:
|
|||
done_searches:
|
||||
if (intedges == 0)
|
||||
{
|
||||
calmaWritePaintFunc(t, cos);
|
||||
calmaWritePaintFunc(t,
|
||||
(split_type & 2) ? (TileType)TT_SIDE : (TileType)0,
|
||||
cos);
|
||||
|
||||
/* Although calmaWritePaintFunc is called only on isolated */
|
||||
/* tiles, we may have expanded it. This could use a LOT of */
|
||||
|
|
@ -2791,6 +2793,7 @@ done_searches:
|
|||
int
|
||||
calmaWritePaintFunc(
|
||||
Tile *tile, /* Tile to be written out. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
calmaOutputStruct *cos) /* File for output and clipping area */
|
||||
{
|
||||
FILE *f = cos->f;
|
||||
|
|
@ -2826,7 +2829,7 @@ calmaWritePaintFunc(
|
|||
/* Coordinates */
|
||||
calmaOutRH(36, CALMA_XY, CALMA_I4, f);
|
||||
|
||||
switch ((SplitSide(tile) << 1) | SplitDirection(tile))
|
||||
switch (((dinfo & TT_SIDE) ? 2 : 0) | SplitDirection(tile))
|
||||
{
|
||||
case 0x0:
|
||||
calmaOutI4(r.r_xbot, f); calmaOutI4(r.r_ybot, f);
|
||||
|
|
@ -3067,6 +3070,7 @@ calmaWriteLabelFunc(
|
|||
int
|
||||
calmaPaintLabelFunc(
|
||||
Tile *tile, /* Tile contains area for label. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
calmaOutputStruct *cos) /* File for output and clipping area */
|
||||
{
|
||||
FILE *f = cos->f;
|
||||
|
|
|
|||
|
|
@ -107,10 +107,10 @@ typedef struct {
|
|||
} calmaOutputStructZ;
|
||||
|
||||
/* Forward declarations */
|
||||
extern int calmaWritePaintFuncZ(Tile *tile, calmaOutputStructZ *cos);
|
||||
extern int calmaMergePaintFuncZ(Tile *tile, calmaOutputStructZ *cos);
|
||||
extern int calmaWritePaintFuncZ(Tile *tile, TileType dinfo, calmaOutputStructZ *cos);
|
||||
extern int calmaMergePaintFuncZ(Tile *tile, TileType dinfo, calmaOutputStructZ *cos);
|
||||
extern int calmaWriteUseFuncZ(CellUse *use, gzFile f);
|
||||
extern int calmaPaintLabelFuncZ(Tile *tile, calmaOutputStructZ *cos);
|
||||
extern int calmaPaintLabelFuncZ(Tile *tile, TileType dinfo, calmaOutputStructZ *cos);
|
||||
extern void calmaWriteContactsZ(gzFile f);
|
||||
extern void calmaOutFuncZ(CellDef *def, gzFile f, const Rect *cliprect);
|
||||
extern void calmaOutStructNameZ(int type, CellDef *def, gzFile f);
|
||||
|
|
@ -1899,6 +1899,7 @@ calmaProcessBoundaryZ(
|
|||
int
|
||||
calmaMergePaintFuncZ(
|
||||
Tile *tile, /* Tile to be written out. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
calmaOutputStructZ *cos) /* Information needed by algorithm */
|
||||
{
|
||||
gzFile f = cos->f;
|
||||
|
|
@ -1929,11 +1930,10 @@ calmaMergePaintFuncZ(
|
|||
split_type = -1;
|
||||
if (IsSplit(t))
|
||||
{
|
||||
/* If we use SplitSide, then we need to set it when the */
|
||||
/* If we use TT_SIDE, then we need to set it when the */
|
||||
/* tile is pushed. Since these are one-or-zero mask layers */
|
||||
/* I assume it is okay to just check which side is TT_SPACE */
|
||||
|
||||
/* split_type = (SplitSide(t) << 1) | SplitDirection(t); */
|
||||
split_type = SplitDirection(t);
|
||||
if (TiGetLeftType(t) == TT_SPACE) split_type |= 2;
|
||||
num_points = 2;
|
||||
|
|
@ -2156,7 +2156,9 @@ right_search:
|
|||
done_searches:
|
||||
if (intedges == 0)
|
||||
{
|
||||
calmaWritePaintFuncZ(t, cos);
|
||||
calmaWritePaintFuncZ(t,
|
||||
(split_type & 2) ? (TileType)TT_SIDE : (TileType)0,
|
||||
cos);
|
||||
|
||||
/* Although calmaWritePaintFunc is called only on isolated */
|
||||
/* tiles, we may have expanded it. This could use a LOT of */
|
||||
|
|
@ -2226,6 +2228,7 @@ done_searches:
|
|||
int
|
||||
calmaWritePaintFuncZ(
|
||||
Tile *tile, /* Tile to be written out. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
calmaOutputStructZ *cos) /* File for output and clipping area */
|
||||
{
|
||||
gzFile f = cos->f;
|
||||
|
|
@ -2261,7 +2264,7 @@ calmaWritePaintFuncZ(
|
|||
/* Coordinates */
|
||||
calmaOutRHZ(36, CALMA_XY, CALMA_I4, f);
|
||||
|
||||
switch ((SplitSide(tile) << 1) | SplitDirection(tile))
|
||||
switch (((dinfo & TT_SIDE) ? 2 : 0) | SplitDirection(tile))
|
||||
{
|
||||
case 0x0:
|
||||
calmaOutI4Z(r.r_xbot, f); calmaOutI4Z(r.r_ybot, f);
|
||||
|
|
@ -2502,6 +2505,7 @@ calmaWriteLabelFuncZ(
|
|||
int
|
||||
calmaPaintLabelFuncZ(
|
||||
Tile *tile, /* Tile contains area for label. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
calmaOutputStructZ *cos) /* File for output and clipping area */
|
||||
{
|
||||
gzFile f = cos->f;
|
||||
|
|
|
|||
270
cif/CIFgen.c
270
cif/CIFgen.c
|
|
@ -103,7 +103,8 @@ extern void cifGenClip(const Rect *area, Rect *expanded, Rect *clip);
|
|||
int
|
||||
cifPaintFunc(
|
||||
Tile *tile,
|
||||
PaintResultType *table) /* Used for painting. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
PaintResultType *table) /* Used for painting. */
|
||||
{
|
||||
Rect area;
|
||||
|
||||
|
|
@ -113,7 +114,7 @@ cifPaintFunc(
|
|||
area.r_ybot *= cifScale;
|
||||
area.r_ytop *= cifScale;
|
||||
|
||||
DBNMPaintPlane(cifPlane, TiGetTypeExact(tile), &area, table,
|
||||
DBNMPaintPlane(cifPlane, TiGetTypeExact(tile) | dinfo, &area, table,
|
||||
(PaintUndoInfo *) NULL);
|
||||
CIFTileOps += 1;
|
||||
return 0;
|
||||
|
|
@ -137,8 +138,9 @@ cifPaintFunc(
|
|||
|
||||
int
|
||||
cifInteractFunc(
|
||||
Tile *tile,
|
||||
ClientData clientdata) /* Unused */
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -323,6 +325,7 @@ SetMinBoxGrid(
|
|||
int
|
||||
cifGrowMinFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
PaintResultType *table) /* Table to be used for painting. */
|
||||
{
|
||||
Rect area, parea;
|
||||
|
|
@ -498,6 +501,7 @@ cifGrowMinFunc(
|
|||
int
|
||||
cifGrowGridFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
PaintResultType *table) /* Table to be used for painting. */
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -574,11 +578,12 @@ cifGrowGridFunc(
|
|||
int
|
||||
cifGrowEuclideanFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
const PaintResultType *table) /* Table to be used for painting. */
|
||||
{
|
||||
Tile *tp;
|
||||
Rect area, rtmp;
|
||||
TileType oldType = TiGetTypeExact(tile);
|
||||
TileType oldType = TiGetTypeExact(tile) | dinfo;
|
||||
unsigned char growDirs = GROW_NORTH | GROW_SOUTH | GROW_EAST | GROW_WEST;
|
||||
unsigned char cornerDirs = 0;
|
||||
|
||||
|
|
@ -787,10 +792,11 @@ cifGrowEuclideanFunc(
|
|||
int
|
||||
cifGrowFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
const PaintResultType *table) /* Table to be used for painting. */
|
||||
{
|
||||
Rect area;
|
||||
TileType oldType = TiGetTypeExact(tile);
|
||||
TileType oldType = TiGetTypeExact(tile) | dinfo;
|
||||
|
||||
TiToRect(tile, &area);
|
||||
|
||||
|
|
@ -916,6 +922,7 @@ cifGrowFunc(
|
|||
int
|
||||
cifBloatFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData clientData)
|
||||
{
|
||||
Rect tileArea, cifArea, bloat;
|
||||
|
|
@ -925,7 +932,7 @@ cifBloatFunc(
|
|||
BloatData *bloats = (BloatData *)clientData;
|
||||
int *bloatTable = (int *)bloats->bl_distance;
|
||||
|
||||
oldType = TiGetTypeExact(tile);
|
||||
oldType = TiGetTypeExact(tile) | dinfo;
|
||||
TiToRect(tile, &tileArea);
|
||||
|
||||
/* Output the original area of the tile. */
|
||||
|
|
@ -951,7 +958,7 @@ cifBloatFunc(
|
|||
if (CIFCurStyle->cs_flags & CWF_GROW_EUCLIDEAN)
|
||||
{
|
||||
growDistance = dist;
|
||||
cifGrowEuclideanFunc(tile, CIFPaintTable);
|
||||
cifGrowEuclideanFunc(tile, dinfo, CIFPaintTable);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1222,10 +1229,35 @@ endbloat:
|
|||
#define CIF_PROCESSED 1
|
||||
#define CIF_IGNORE 2
|
||||
|
||||
#define PUSHTILE(tp, stack) \
|
||||
/* Conditional push (if tile is unprocessed) */
|
||||
#define PUSHTILE(tp, dinfo, stack) \
|
||||
if (TiGetClient(tp) == CIF_UNPROCESSED) { \
|
||||
TiSetClientINT(tp, CIF_PENDING); \
|
||||
STACKPUSH((ClientData) (tp), stack); \
|
||||
STACKPUSH((ClientData)(tp), stack); \
|
||||
STACKPUSH((ClientData)(dinfo), stack); \
|
||||
}
|
||||
|
||||
/* Unconditional push */
|
||||
#define PUSHTILEALWAYS(tp, dinfo, stack) { \
|
||||
STACKPUSH((ClientData)(tp), stack); \
|
||||
STACKPUSH((ClientData)(dinfo), stack); \
|
||||
}
|
||||
|
||||
#define POPTILE(tp, dinfo, stack) { \
|
||||
dinfo = (TileType)STACKPOP(stack); \
|
||||
tp = (Tile *)STACKPOP(stack); \
|
||||
}
|
||||
|
||||
/* For routines that don't require split tile information */
|
||||
|
||||
#define PUSHTILEONLY(tp, stack) \
|
||||
if (TiGetClient(tp) == CIF_UNPROCESSED) { \
|
||||
TiSetClientINT(tp, CIF_PENDING); \
|
||||
STACKPUSH((ClientData)(tp), stack); \
|
||||
}
|
||||
|
||||
#define POPTILEONLY(tp, stack) { \
|
||||
tp = (Tile *)STACKPOP(stack); \
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1243,7 +1275,8 @@ endbloat:
|
|||
int
|
||||
cifProcessResetFunc(
|
||||
Tile *tile,
|
||||
ClientData clientData) /* unused */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientData) /* (unused) */
|
||||
{
|
||||
TiSetClient(tile, CIF_UNPROCESSED);
|
||||
return 0;
|
||||
|
|
@ -1263,8 +1296,9 @@ cifProcessResetFunc(
|
|||
*/
|
||||
|
||||
int
|
||||
cifProcessSelectiveResetFunc(tile, clipArea)
|
||||
cifProcessSelectiveResetFunc(tile, dinfo, clipArea)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
Rect *clipArea;
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -1297,11 +1331,12 @@ cifProcessSelectiveResetFunc(tile, clipArea)
|
|||
int
|
||||
cifFoundFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
Stack **BloatStackPtr)
|
||||
{
|
||||
if (TiGetClient(tile) == CIF_UNPROCESSED)
|
||||
{
|
||||
PUSHTILE(tile, *BloatStackPtr);
|
||||
PUSHTILE(tile, dinfo, *BloatStackPtr);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
|
|
@ -1338,6 +1373,7 @@ typedef struct _bloatStruct {
|
|||
int
|
||||
cifBloatAllFunc(
|
||||
Tile *tile, /* The tile to be processed. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
BloatStruct *bls)
|
||||
{
|
||||
Rect area, clipArea;
|
||||
|
|
@ -1371,8 +1407,9 @@ cifBloatAllFunc(
|
|||
/* processed that belongs to the connect mask, and use that as the */
|
||||
/* starting tile. */
|
||||
|
||||
t = tile;
|
||||
type = TiGetType(tile);
|
||||
type = TiGetType(tile); /* NOTE: This does not correctly handls
|
||||
* split tiles.
|
||||
*/
|
||||
|
||||
if (type == CIF_SOLIDTYPE)
|
||||
{
|
||||
|
|
@ -1445,8 +1482,8 @@ cifBloatAllFunc(
|
|||
}
|
||||
else
|
||||
{
|
||||
PUSHTILE(t, BloatStack);
|
||||
firstTile = t;
|
||||
PUSHTILE(tile, dinfo, BloatStack);
|
||||
firstTile = tile;
|
||||
}
|
||||
|
||||
/* Note: if op->co_distance is 0 then bloat distance is arbitrarily large */
|
||||
|
|
@ -1465,7 +1502,9 @@ cifBloatAllFunc(
|
|||
|
||||
while (!StackEmpty(BloatStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(BloatStack);
|
||||
TileType tt;
|
||||
|
||||
POPTILE(t, dinfo, BloatStack);
|
||||
if (TiGetClientINT(t) != CIF_PENDING) continue;
|
||||
TiSetClientINT(t, CIF_PROCESSED);
|
||||
|
||||
|
|
@ -1492,6 +1531,7 @@ cifBloatAllFunc(
|
|||
* is difficult to find an optimal method.
|
||||
*/
|
||||
STACKPUSH(t, ResetStack);
|
||||
STACKPUSH(dinfo, ResetStack);
|
||||
GeoClip(&cifarea, &clipArea);
|
||||
if (GEO_RECTNULL(&cifarea))
|
||||
continue;
|
||||
|
|
@ -1504,18 +1544,18 @@ cifBloatAllFunc(
|
|||
|
||||
if (IsSplit(t))
|
||||
{
|
||||
TileType tt;
|
||||
tt = TiGetTypeExact(t);
|
||||
tt = TiGetTypeExact(t) | dinfo;
|
||||
if ((tt & TT_SIDE) && (TTMaskHasType(connect, TiGetLeftType(t))))
|
||||
DBPaintPlane(cifPlane, &area, CIFPaintTable, (PaintUndoInfo *) NULL);
|
||||
else if (!(tt & TT_SIDE) && (TTMaskHasType(connect, TiGetRightType(t))))
|
||||
DBPaintPlane(cifPlane, &area, CIFPaintTable, (PaintUndoInfo *) NULL);
|
||||
else
|
||||
DBNMPaintPlane(cifPlane, TiGetTypeExact(t), &area,
|
||||
DBNMPaintPlane(cifPlane, TiGetTypeExact(t) | dinfo, &area,
|
||||
CIFPaintTable, (PaintUndoInfo *) NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
tt = TiGetTypeExact(t);
|
||||
if (op->co_distance > 0)
|
||||
GeoClip(&area, &clipArea);
|
||||
DBNMPaintPlane(cifPlane, TiGetTypeExact(t), &area,
|
||||
|
|
@ -1525,22 +1565,28 @@ cifBloatAllFunc(
|
|||
/* Top */
|
||||
for (tp = RT(t); RIGHT(tp) > LEFT(t); tp = BL(tp))
|
||||
if (TTMaskHasType(connect, TiGetBottomType(tp)))
|
||||
PUSHTILE(tp, BloatStack);
|
||||
PUSHTILE(tp,
|
||||
(SplitDirection(tp) == ((tt & TT_DIRECTION) ? 1 : 0)) ?
|
||||
(TileType)0 : (TileType)TT_SIDE,
|
||||
BloatStack);
|
||||
|
||||
/* Left */
|
||||
for (tp = BL(t); BOTTOM(tp) < TOP(t); tp = RT(tp))
|
||||
if (TTMaskHasType(connect, TiGetRightType(tp)))
|
||||
PUSHTILE(tp, BloatStack);
|
||||
PUSHTILE(tp, (TileType)TT_SIDE, BloatStack);
|
||||
|
||||
/* Bottom */
|
||||
for (tp = LB(t); LEFT(tp) < RIGHT(t); tp = TR(tp))
|
||||
if (TTMaskHasType(connect, TiGetTopType(tp)))
|
||||
PUSHTILE(tp, BloatStack);
|
||||
PUSHTILE(tp,
|
||||
(SplitDirection(tp) == ((tt & TT_DIRECTION) ? 1 : 0)) ?
|
||||
(TileType)TT_SIDE : (TileType)0,
|
||||
BloatStack);
|
||||
|
||||
/* Right */
|
||||
for (tp = TR(t); TOP(tp) > BOTTOM(t); tp = LB(tp))
|
||||
if (TTMaskHasType(connect, TiGetLeftType(tp)))
|
||||
PUSHTILE(tp, BloatStack);
|
||||
PUSHTILE(tp, (TileType)0, BloatStack);
|
||||
}
|
||||
|
||||
/* Clear self */
|
||||
|
|
@ -1557,7 +1603,7 @@ cifBloatAllFunc(
|
|||
|
||||
while (!StackEmpty(ResetStack))
|
||||
{
|
||||
t = (Tile *)STACKPOP(ResetStack);
|
||||
POPTILE(t, dinfo, ResetStack);
|
||||
TiSetClient(t, CIF_UNPROCESSED);
|
||||
}
|
||||
|
||||
|
|
@ -1792,6 +1838,7 @@ GetExpandedAreaGrid(
|
|||
int
|
||||
cifBridgeFunc1(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
BridgeStruct *brs)
|
||||
{
|
||||
Plane *plane = brs->plane;
|
||||
|
|
@ -1800,7 +1847,9 @@ cifBridgeFunc1(
|
|||
int width = brs->bridge->br_width;
|
||||
int spacing = growDistance;
|
||||
BridgeCheckStruct brcs;
|
||||
int cifBridgeCheckFunc(Tile *tile, BridgeCheckStruct *brcs); /* Forward reference */
|
||||
|
||||
/* Forward reference */
|
||||
int cifBridgeCheckFunc(Tile *tile, TileType dinfo, BridgeCheckStruct *brcs);
|
||||
|
||||
/* If tile is marked, then it has been handled, so ignore it */
|
||||
if (TiGetClient(tile) != CIF_UNPROCESSED) return 0;
|
||||
|
|
@ -1914,6 +1963,7 @@ cifBridgeFunc1(
|
|||
int
|
||||
cifBridgeFunc2(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
BridgeStruct *brs)
|
||||
{
|
||||
Plane *plane = brs->plane;
|
||||
|
|
@ -1923,7 +1973,9 @@ cifBridgeFunc2(
|
|||
int wtest;
|
||||
int spacing = growDistance;
|
||||
BridgeCheckStruct brcs;
|
||||
int cifBridgeCheckFunc(Tile *tile, BridgeCheckStruct *brcs); /* Forward reference */
|
||||
|
||||
/* Forward reference */
|
||||
int cifBridgeCheckFunc(Tile *tile, TileType dinfo, BridgeCheckStruct *brcs);
|
||||
|
||||
/* If tile is marked, then it has been handled, so ignore it */
|
||||
if (TiGetClient(tile) != CIF_UNPROCESSED) return 0;
|
||||
|
|
@ -2014,6 +2066,7 @@ cifBridgeFunc2(
|
|||
int
|
||||
cifBridgeCheckFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
BridgeCheckStruct *brcs)
|
||||
{
|
||||
int dir = brcs->direction;
|
||||
|
|
@ -2087,10 +2140,11 @@ cifBridgeCheckFunc(
|
|||
int
|
||||
cifOrthogonalFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
const PaintResultType *table) /* Table to be used for painting. */
|
||||
{
|
||||
Rect area;
|
||||
TileType oldType = TiGetTypeExact(tile);
|
||||
TileType oldType = TiGetTypeExact(tile) | dinfo;
|
||||
|
||||
TiToRect(tile, &area);
|
||||
|
||||
|
|
@ -2137,11 +2191,12 @@ cifOrthogonalFunc(
|
|||
int
|
||||
cifCloseFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
Plane *plane)
|
||||
{
|
||||
Rect area, newarea;
|
||||
int atotal;
|
||||
int cifGatherFunc(Tile *tile, int *atotal, int mode);
|
||||
int cifGatherFunc(Tile *tile, TileType dinfo, int *atotal, int mode);
|
||||
|
||||
/* If tile is marked, then it has been handled, so ignore it */
|
||||
if (TiGetClient(tile) != CIF_UNPROCESSED) return 0;
|
||||
|
|
@ -2152,7 +2207,7 @@ cifCloseFunc(
|
|||
/* total area. If any connected tile borders infinity, then stop */
|
||||
/* searching because the area is not enclosed. */
|
||||
|
||||
cifGatherFunc(tile, &atotal, CLOSE_SEARCH);
|
||||
cifGatherFunc(tile, dinfo, &atotal, CLOSE_SEARCH);
|
||||
|
||||
/* If the total area is smaller than the rule area, then paint all */
|
||||
/* the tile areas into the destination plane. A rule area of zero */
|
||||
|
|
@ -2161,11 +2216,11 @@ cifCloseFunc(
|
|||
|
||||
if ((atotal != INFINITY) && ((atotal < growDistance) || (growDistance == 0)))
|
||||
{
|
||||
cifGatherFunc(tile, &atotal, CLOSE_FILL);
|
||||
cifGatherFunc(tile, dinfo, &atotal, CLOSE_FILL);
|
||||
}
|
||||
else
|
||||
{
|
||||
cifGatherFunc(tile, &atotal, CLOSE_DONE);
|
||||
cifGatherFunc(tile, dinfo, &atotal, CLOSE_DONE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2173,6 +2228,7 @@ cifCloseFunc(
|
|||
int
|
||||
cifGatherFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
int *atotal,
|
||||
int mode)
|
||||
{
|
||||
|
|
@ -2188,10 +2244,13 @@ cifGatherFunc(
|
|||
if (GatherStack == (Stack *)NULL)
|
||||
GatherStack = StackNew(64);
|
||||
|
||||
STACKPUSH(tile, GatherStack);
|
||||
PUSHTILE(tile, dinfo, GatherStack);
|
||||
while (!StackEmpty(GatherStack))
|
||||
{
|
||||
tile = (Tile *)STACKPOP(GatherStack);
|
||||
TileType newdinfo;
|
||||
|
||||
POPTILE(tile, dinfo, GatherStack);
|
||||
newdinfo = TiGetTypeExact(tile) | dinfo;
|
||||
|
||||
/* Ignore if tile has already been processed */
|
||||
if (TiGetClient(tile) != cdata) continue;
|
||||
|
|
@ -2226,8 +2285,6 @@ cifGatherFunc(
|
|||
}
|
||||
else if (mode == CLOSE_FILL)
|
||||
{
|
||||
TileType dinfo = TiGetTypeExact(tile);
|
||||
|
||||
/* The tile type cannot be depended on to have the TT_SIDE bit set */
|
||||
/* for the side of the tile that is TT_SPACE. So set the side bit */
|
||||
/* manually. */
|
||||
|
|
@ -2235,12 +2292,13 @@ cifGatherFunc(
|
|||
if (IsSplit(tile))
|
||||
{
|
||||
if (TiGetLeftType(tile) == TT_SPACE)
|
||||
dinfo &= ~TT_SIDE;
|
||||
newdinfo &= ~TT_SIDE;
|
||||
else
|
||||
dinfo |= TT_SIDE;
|
||||
newdinfo |= TT_SIDE;
|
||||
}
|
||||
|
||||
DBNMPaintPlane(cifPlane, dinfo, &area, CIFPaintTable, (PaintUndoInfo *)NULL);
|
||||
DBNMPaintPlane(cifPlane, newdinfo, &area, CIFPaintTable,
|
||||
(PaintUndoInfo *)NULL);
|
||||
CIFTileOps++;
|
||||
}
|
||||
|
||||
|
|
@ -2255,7 +2313,10 @@ cifGatherFunc(
|
|||
for (tp = RT(tile); RIGHT(tp) > LEFT(tile); tp = BL(tp))
|
||||
if (TiGetClient(tp) == cdata && TiGetBottomType(tp) == TT_SPACE)
|
||||
{
|
||||
STACKPUSH(tp, GatherStack);
|
||||
PUSHTILEALWAYS(tp,
|
||||
((newdinfo & TT_DIRECTION) != (TiGetTypeExact(tp) & TT_DIRECTION)) ?
|
||||
(TileType)TT_SIDE : (TileType)0,
|
||||
GatherStack);
|
||||
}
|
||||
|
||||
/* Check bottom */
|
||||
|
|
@ -2263,7 +2324,10 @@ cifGatherFunc(
|
|||
for (tp = LB(tile); LEFT(tp) < RIGHT(tile); tp = TR(tp))
|
||||
if (TiGetClient(tp) == cdata && TiGetTopType(tp) == TT_SPACE)
|
||||
{
|
||||
STACKPUSH(tp, GatherStack);
|
||||
PUSHTILEALWAYS(tp,
|
||||
((newdinfo & TT_DIRECTION) == (TiGetTypeExact(tp) & TT_DIRECTION)) ?
|
||||
(TileType)TT_SIDE : (TileType)0,
|
||||
GatherStack);
|
||||
}
|
||||
|
||||
/* Check left */
|
||||
|
|
@ -2271,7 +2335,7 @@ cifGatherFunc(
|
|||
for (tp = BL(tile); BOTTOM(tp) < TOP(tile); tp = RT(tp))
|
||||
if (TiGetClient(tp) == cdata && TiGetRightType(tp) == TT_SPACE)
|
||||
{
|
||||
STACKPUSH(tp, GatherStack);
|
||||
PUSHTILEALWAYS(tp, (TileType)TT_SIDE, GatherStack);
|
||||
}
|
||||
|
||||
/* Check right */
|
||||
|
|
@ -2279,7 +2343,7 @@ cifGatherFunc(
|
|||
for (tp = TR(tile); TOP(tp) > BOTTOM(tile); tp = LB(tp))
|
||||
if (TiGetClient(tp) == cdata && TiGetLeftType(tp) == TT_SPACE)
|
||||
{
|
||||
STACKPUSH(tp, GatherStack);
|
||||
PUSHTILEALWAYS(tp, (TileType)0, GatherStack);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -2323,9 +2387,10 @@ typedef struct
|
|||
*/
|
||||
|
||||
int
|
||||
cifSquaresInitFunc(tile, clientData)
|
||||
cifSquaresInitFunc(tile, dinfo, clientData)
|
||||
Tile *tile;
|
||||
ClientData clientData;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientData; /* (unused) */
|
||||
{
|
||||
if (TiGetClient(tile) == CIF_UNPROCESSED)
|
||||
return 1;
|
||||
|
|
@ -2350,6 +2415,7 @@ cifSquaresInitFunc(tile, clientData)
|
|||
int
|
||||
cifSquaresStripFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
StripsData *stripsData)
|
||||
{
|
||||
bool vertical;
|
||||
|
|
@ -2477,7 +2543,8 @@ cifSquaresStripFunc(
|
|||
int
|
||||
cifUnconnectFunc(
|
||||
Tile *tile,
|
||||
ClientData clientData) /* unused */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientData) /* (unused) */
|
||||
{
|
||||
TileType t = TiGetTypeExact(tile);
|
||||
if (t == TT_SPACE) return 1;
|
||||
|
|
@ -2531,10 +2598,10 @@ cifRectBoundingBox(
|
|||
tile = PlaneGetHint(plane);
|
||||
TiToRect(tile, &bbox);
|
||||
|
||||
PUSHTILE(tile, BoxStack);
|
||||
PUSHTILEONLY(tile, BoxStack);
|
||||
while (!StackEmpty(BoxStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(BoxStack);
|
||||
POPTILEONLY(t, BoxStack);
|
||||
if (TiGetClientINT(t) != CIF_PENDING) continue;
|
||||
TiSetClientINT(t, CIF_PROCESSED);
|
||||
|
||||
|
|
@ -2549,7 +2616,7 @@ cifRectBoundingBox(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetBottomType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, BoxStack);
|
||||
PUSHTILEONLY(tp, BoxStack);
|
||||
}
|
||||
|
||||
/* Left */
|
||||
|
|
@ -2557,7 +2624,7 @@ cifRectBoundingBox(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetRightType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, BoxStack);
|
||||
PUSHTILEONLY(tp, BoxStack);
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
|
|
@ -2565,7 +2632,7 @@ cifRectBoundingBox(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetTopType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, BoxStack);
|
||||
PUSHTILEONLY(tp, BoxStack);
|
||||
}
|
||||
|
||||
/* Right */
|
||||
|
|
@ -2573,7 +2640,7 @@ cifRectBoundingBox(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetLeftType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, BoxStack);
|
||||
PUSHTILEONLY(tp, BoxStack);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2600,17 +2667,17 @@ cifRectBoundingBox(
|
|||
/* Clear the tiles that were processed in this set */
|
||||
|
||||
TiSetClientINT(tile, CIF_IGNORE);
|
||||
STACKPUSH(tile, BoxStack);
|
||||
PUSHTILEONLY(tile, BoxStack);
|
||||
while (!StackEmpty(BoxStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(BoxStack);
|
||||
POPTILEONLY(t, BoxStack);
|
||||
|
||||
/* Top */
|
||||
for (tp = RT(t); RIGHT(tp) > LEFT(t); tp = BL(tp))
|
||||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, BoxStack);
|
||||
PUSHTILEONLY(tp, BoxStack);
|
||||
}
|
||||
|
||||
/* Left */
|
||||
|
|
@ -2618,7 +2685,7 @@ cifRectBoundingBox(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, BoxStack);
|
||||
PUSHTILEONLY(tp, BoxStack);
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
|
|
@ -2626,7 +2693,7 @@ cifRectBoundingBox(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, BoxStack);
|
||||
PUSHTILEONLY(tp, BoxStack);
|
||||
}
|
||||
|
||||
/* Right */
|
||||
|
|
@ -2634,7 +2701,7 @@ cifRectBoundingBox(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, BoxStack);
|
||||
PUSHTILEONLY(tp, BoxStack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2802,10 +2869,10 @@ cifSquaresFillArea(
|
|||
tile = PlaneGetHint(plane);
|
||||
TiToRect(tile, &bbox);
|
||||
|
||||
PUSHTILE(tile, CutStack);
|
||||
PUSHTILEONLY(tile, CutStack);
|
||||
while (!StackEmpty(CutStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(CutStack);
|
||||
POPTILEONLY(t, CutStack);
|
||||
if (TiGetClientINT(t) != CIF_PENDING) continue;
|
||||
TiSetClientINT(t, CIF_PROCESSED);
|
||||
|
||||
|
|
@ -2820,7 +2887,7 @@ cifSquaresFillArea(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetBottomType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Left */
|
||||
|
|
@ -2828,7 +2895,7 @@ cifSquaresFillArea(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetRightType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
|
|
@ -2836,7 +2903,7 @@ cifSquaresFillArea(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetTopType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Right */
|
||||
|
|
@ -2844,7 +2911,7 @@ cifSquaresFillArea(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetLeftType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2933,17 +3000,17 @@ cifSquaresFillArea(
|
|||
/* Clear the tiles that were processed */
|
||||
|
||||
TiSetClientINT(tile, CIF_IGNORE);
|
||||
STACKPUSH(tile, CutStack);
|
||||
PUSHTILEONLY(tile, CutStack);
|
||||
while (!StackEmpty(CutStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(CutStack);
|
||||
POPTILEONLY(t, CutStack);
|
||||
|
||||
/* Top */
|
||||
for (tp = RT(t); RIGHT(tp) > LEFT(t); tp = BL(tp))
|
||||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Left */
|
||||
|
|
@ -2951,7 +3018,7 @@ cifSquaresFillArea(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
|
|
@ -2959,7 +3026,7 @@ cifSquaresFillArea(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Right */
|
||||
|
|
@ -2967,7 +3034,7 @@ cifSquaresFillArea(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3146,10 +3213,10 @@ cifSlotsFillArea(
|
|||
tile = PlaneGetHint(plane);
|
||||
TiToRect(tile, &bbox);
|
||||
|
||||
PUSHTILE(tile, CutStack);
|
||||
PUSHTILEONLY(tile, CutStack);
|
||||
while (!StackEmpty(CutStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(CutStack);
|
||||
POPTILEONLY(t, CutStack);
|
||||
if (TiGetClientINT(t) != CIF_PENDING) continue;
|
||||
TiSetClientINT(t, CIF_PROCESSED);
|
||||
|
||||
|
|
@ -3164,7 +3231,7 @@ cifSlotsFillArea(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetBottomType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Left */
|
||||
|
|
@ -3172,7 +3239,7 @@ cifSlotsFillArea(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetRightType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
|
|
@ -3180,7 +3247,7 @@ cifSlotsFillArea(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetTopType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Right */
|
||||
|
|
@ -3188,7 +3255,7 @@ cifSlotsFillArea(
|
|||
if (TTMaskHasType(&CIFSolidBits, TiGetLeftType(tp)))
|
||||
{
|
||||
simple = FALSE;
|
||||
PUSHTILE(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3298,17 +3365,17 @@ cifSlotsFillArea(
|
|||
/* Clear the tiles that were processed */
|
||||
|
||||
TiSetClientINT(tile, CIF_IGNORE);
|
||||
STACKPUSH(tile, CutStack);
|
||||
PUSHTILEONLY(tile, CutStack);
|
||||
while (!StackEmpty(CutStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(CutStack);
|
||||
POPTILEONLY(t, CutStack);
|
||||
|
||||
/* Top */
|
||||
for (tp = RT(t); RIGHT(tp) > LEFT(t); tp = BL(tp))
|
||||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Left */
|
||||
|
|
@ -3316,7 +3383,7 @@ cifSlotsFillArea(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
|
|
@ -3324,7 +3391,7 @@ cifSlotsFillArea(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
|
||||
/* Right */
|
||||
|
|
@ -3332,7 +3399,7 @@ cifSlotsFillArea(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, CutStack);
|
||||
PUSHTILEONLY(tp, CutStack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3368,6 +3435,7 @@ cifSlotsFillArea(
|
|||
int
|
||||
cifBloatMaxFunc(
|
||||
Tile *tile, /* The tile to be processed. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
CIFOp *op) /* Describes the operation to be performed
|
||||
* (all we care about is the opcode and
|
||||
* bloat table).
|
||||
|
|
@ -3474,7 +3542,7 @@ cifBloatMaxFunc(
|
|||
CIFError(&area, "tile inverted by shrink");
|
||||
}
|
||||
else
|
||||
DBNMPaintPlane(cifPlane, TiGetTypeExact(tile), &area,
|
||||
DBNMPaintPlane(cifPlane, TiGetTypeExact(tile) | dinfo, &area,
|
||||
CIFPaintTable, (PaintUndoInfo *) NULL);
|
||||
|
||||
CIFTileOps += 1;
|
||||
|
|
@ -3560,6 +3628,7 @@ inside_triangle(
|
|||
int
|
||||
cifContactFunc(
|
||||
Tile *tile, /* Tile to be diced up. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
CIFSquaresInfo *csi) /* Describes how to generate squares. */
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -4146,6 +4215,7 @@ typedef struct _bridgeLimCheckStruct {
|
|||
int
|
||||
bridgeLimFound(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
bool calcOverlap)
|
||||
{
|
||||
if (calcOverlap)
|
||||
|
|
@ -4229,6 +4299,7 @@ bridgeLimSrTiles(
|
|||
int
|
||||
cifBridgeLimFunc0(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
BridgeLimStruct *brlims)
|
||||
{
|
||||
Plane *plane = brlims->plane;
|
||||
|
|
@ -4305,6 +4376,7 @@ cifBridgeLimFunc0(
|
|||
int
|
||||
bridgeLimCheckFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
BridgeLimCheckStruct *brlimcs)
|
||||
{
|
||||
int dir = brlimcs->direction;
|
||||
|
|
@ -4423,6 +4495,7 @@ bridgeErase(
|
|||
int
|
||||
cifBridgeLimFunc1(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
BridgeLimStruct *brlims)
|
||||
{
|
||||
Plane *plane = brlims->plane;
|
||||
|
|
@ -4585,6 +4658,7 @@ cifBridgeLimFunc1(
|
|||
int
|
||||
cifBridgeLimFunc2(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
BridgeLimStruct *brlims)
|
||||
{
|
||||
Plane *plane = brlims->plane;
|
||||
|
|
@ -4739,12 +4813,16 @@ cifInteractingRegions(
|
|||
/* to the destination plane or not depending on whether any */
|
||||
/* part of the region overlapped the specified type(s). */
|
||||
|
||||
/* NOTE: Currently reusing code from cifSquares, but cifSquares */
|
||||
/* does not handle non-Manhattan geometry, whereas overlap and */
|
||||
/* interaction detection must. */
|
||||
|
||||
interacts = FALSE;
|
||||
tile = PlaneGetHint(plane);
|
||||
PUSHTILE(tile, RegStack);
|
||||
PUSHTILEONLY(tile, RegStack);
|
||||
while (!StackEmpty(RegStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(RegStack);
|
||||
POPTILEONLY(t, RegStack);
|
||||
if (TiGetClientINT(t) != CIF_PENDING) continue;
|
||||
TiSetClientINT(t, CIF_PROCESSED);
|
||||
|
||||
|
|
@ -4777,28 +4855,28 @@ cifInteractingRegions(
|
|||
for (tp = RT(t); RIGHT(tp) > LEFT(t); tp = BL(tp))
|
||||
if (TTMaskHasType(&CIFSolidBits, TiGetBottomType(tp)))
|
||||
{
|
||||
PUSHTILE(tp, RegStack);
|
||||
PUSHTILEONLY(tp, RegStack);
|
||||
}
|
||||
|
||||
/* Left */
|
||||
for (tp = BL(t); BOTTOM(tp) < TOP(t); tp = RT(tp))
|
||||
if (TTMaskHasType(&CIFSolidBits, TiGetRightType(tp)))
|
||||
{
|
||||
PUSHTILE(tp, RegStack);
|
||||
PUSHTILEONLY(tp, RegStack);
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
for (tp = LB(t); LEFT(tp) < RIGHT(t); tp = TR(tp))
|
||||
if (TTMaskHasType(&CIFSolidBits, TiGetTopType(tp)))
|
||||
{
|
||||
PUSHTILE(tp, RegStack);
|
||||
PUSHTILEONLY(tp, RegStack);
|
||||
}
|
||||
|
||||
/* Right */
|
||||
for (tp = TR(t); TOP(tp) > BOTTOM(t); tp = LB(tp))
|
||||
if (TTMaskHasType(&CIFSolidBits, TiGetLeftType(tp)))
|
||||
{
|
||||
PUSHTILE(tp, RegStack);
|
||||
PUSHTILEONLY(tp, RegStack);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4815,10 +4893,10 @@ cifInteractingRegions(
|
|||
/* op->co_paintMask (op->co_cifMask) */
|
||||
|
||||
TiSetClientINT(tile, CIF_IGNORE);
|
||||
STACKPUSH(tile, RegStack);
|
||||
PUSHTILEONLY(tile, RegStack);
|
||||
while (!StackEmpty(RegStack))
|
||||
{
|
||||
t = (Tile *) STACKPOP(RegStack);
|
||||
POPTILEONLY(t, RegStack);
|
||||
|
||||
if (interacts)
|
||||
{
|
||||
|
|
@ -4831,7 +4909,7 @@ cifInteractingRegions(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, RegStack);
|
||||
PUSHTILEONLY(tp, RegStack);
|
||||
}
|
||||
|
||||
/* Left */
|
||||
|
|
@ -4839,7 +4917,7 @@ cifInteractingRegions(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, RegStack);
|
||||
PUSHTILEONLY(tp, RegStack);
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
|
|
@ -4847,7 +4925,7 @@ cifInteractingRegions(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, RegStack);
|
||||
PUSHTILEONLY(tp, RegStack);
|
||||
}
|
||||
|
||||
/* Right */
|
||||
|
|
@ -4855,7 +4933,7 @@ cifInteractingRegions(
|
|||
if (TiGetClientINT(tp) == CIF_PROCESSED)
|
||||
{
|
||||
TiSetClientINT(tp, CIF_IGNORE);
|
||||
STACKPUSH(tp, RegStack);
|
||||
PUSHTILEONLY(tp, RegStack);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -433,15 +433,16 @@ cifHierCopyMaskHints(
|
|||
int
|
||||
cifHierCopyFunc(
|
||||
Tile *tile, /* Pointer to tile to copy. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
TreeContext *cxp) /* Describes context of search, including
|
||||
* transform and client data.
|
||||
*/
|
||||
{
|
||||
TileType type = TiGetTypeExact(tile);
|
||||
TileType type = TiGetTypeExact(tile) | dinfo;
|
||||
Rect sourceRect, targetRect;
|
||||
int pNum;
|
||||
CellDef *def = (CellDef *) cxp->tc_filter->tf_arg;
|
||||
int dinfo = 0;
|
||||
TileType newdinfo = 0;
|
||||
|
||||
/* Ignore tiles in vendor GDS, unless this is specifically */
|
||||
/* overridden by the "see-vendor" option. */
|
||||
|
|
@ -457,8 +458,8 @@ cifHierCopyFunc(
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
dinfo = DBTransformDiagonal(type, &cxp->tc_scx->scx_trans);
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) :
|
||||
newdinfo = DBTransformDiagonal(type, &cxp->tc_scx->scx_trans);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) :
|
||||
SplitLeftType(tile);
|
||||
}
|
||||
|
||||
|
|
@ -473,7 +474,7 @@ cifHierCopyFunc(
|
|||
{
|
||||
if (DBPaintOnPlane(type, pNum))
|
||||
{
|
||||
DBNMPaintPlane(def->cd_planes[pNum], dinfo, &targetRect,
|
||||
DBNMPaintPlane(def->cd_planes[pNum], newdinfo, &targetRect,
|
||||
DBStdPaintTbl(type, pNum), (PaintUndoInfo *) NULL);
|
||||
}
|
||||
}
|
||||
|
|
@ -562,9 +563,11 @@ cifHierCellFunc(
|
|||
int
|
||||
cifHierErrorFunc(
|
||||
Tile *tile, /* Tile that covers area it shouldn't. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
Rect *checkArea) /* Intersection of this and tile is error. */
|
||||
{
|
||||
Rect area;
|
||||
bool side = (dinfo & TT_SIDE) ? TRUE : FALSE;
|
||||
|
||||
TiToRect(tile, &area);
|
||||
|
||||
|
|
@ -572,8 +575,8 @@ cifHierErrorFunc(
|
|||
* space bounds the checkArea.
|
||||
*/
|
||||
if (IsSplit(tile))
|
||||
if (((area.r_xbot == checkArea->r_xbot) && !SplitSide(tile)) ||
|
||||
((area.r_xtop == checkArea->r_xtop) && SplitSide(tile)))
|
||||
if (((area.r_xbot == checkArea->r_xbot) && !side) ||
|
||||
((area.r_xtop == checkArea->r_xtop) && side))
|
||||
return 0;
|
||||
|
||||
GeoClip(&area, checkArea);
|
||||
|
|
@ -604,6 +607,7 @@ cifHierErrorFunc(
|
|||
int
|
||||
cifHierCheckFunc(
|
||||
Tile *tile, /* Tile containing CIF. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
Plane *plane) /* Plane to check against and modify. */
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -612,7 +616,7 @@ cifHierCheckFunc(
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
DBSrPaintNMArea((Tile *)NULL, plane, TiGetTypeExact(tile),
|
||||
DBSrPaintNMArea((Tile *)NULL, plane, TiGetTypeExact(tile) | dinfo,
|
||||
&area, &DBSpaceBits, cifHierErrorFunc, (ClientData) &area);
|
||||
|
||||
DBNMPaintPlane(plane, TiGetTypeExact(tile), &area, CIFEraseTable,
|
||||
|
|
@ -651,6 +655,7 @@ cifHierCheckFunc(
|
|||
int
|
||||
cifHierTempCheckFunc(
|
||||
Tile *tile, /* Tile containing CIF. */
|
||||
TileType dinfo, /* Information about split tiles */
|
||||
Plane *plane) /* Plane to check against and modify. */
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -658,7 +663,7 @@ cifHierTempCheckFunc(
|
|||
TiToRect(tile, &area);
|
||||
|
||||
if (IsSplit(tile))
|
||||
DBNMPaintPlane(plane, TiGetTypeExact(tile), &area, CIFEraseTable,
|
||||
DBNMPaintPlane(plane, TiGetTypeExact(tile) | dinfo, &area, CIFEraseTable,
|
||||
(PaintUndoInfo *) NULL);
|
||||
else
|
||||
DBPaintPlane(plane, &area, CIFEraseTable, (PaintUndoInfo *) NULL);
|
||||
|
|
@ -686,6 +691,7 @@ cifHierTempCheckFunc(
|
|||
int
|
||||
cifHierPaintFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* Information about split tiles */
|
||||
Plane *plane) /* Plane in which to paint CIF over tile's
|
||||
* area.
|
||||
*/
|
||||
|
|
@ -695,7 +701,7 @@ cifHierPaintFunc(
|
|||
TiToRect(tile, &area);
|
||||
if (CIFCurStyle->cs_flags & CWF_GROW_SLIVERS) cifGrowSliver(tile, &area);
|
||||
if (IsSplit(tile))
|
||||
DBNMPaintPlane(plane, TiGetTypeExact(tile), &area, CIFPaintTable,
|
||||
DBNMPaintPlane(plane, TiGetTypeExact(tile) | dinfo, &area, CIFPaintTable,
|
||||
(PaintUndoInfo *) NULL);
|
||||
else
|
||||
DBPaintPlane(plane, &area, CIFPaintTable, (PaintUndoInfo *) NULL);
|
||||
|
|
@ -1127,7 +1133,9 @@ cifGrowSliver(
|
|||
|
||||
int
|
||||
cifHierPaintArrayFunc(
|
||||
Tile *tile)
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
Rect area;
|
||||
int i, j, xbot, xtop;
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@ extern void CIFClearPlanes(Plane **planes);
|
|||
extern Plane *CIFGenLayer(CIFOp *op, const Rect *area, CellDef *cellDef, CellDef *origDef, Plane *temps[],
|
||||
bool hier, ClientData clientdata);
|
||||
extern void CIFInitCells(void);
|
||||
extern int cifHierCopyFunc(Tile *tile, TreeContext *cxp);
|
||||
extern int cifHierCopyFunc(Tile *tile, TileType dinfo, TreeContext *cxp);
|
||||
extern int cifHierCopyMaskHints(SearchContext *scx, ClientData clientData);
|
||||
extern void CIFLoadStyle(char *stylename);
|
||||
extern void CIFCopyMaskHints(SearchContext *scx, CellDef *targetDef);
|
||||
|
|
|
|||
|
|
@ -505,6 +505,7 @@ CIFParseStart(void)
|
|||
|
||||
int cifCheckPaintFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData clientData)
|
||||
{
|
||||
return 1;
|
||||
|
|
@ -515,27 +516,28 @@ int cifCheckPaintFunc(
|
|||
int
|
||||
cifCopyPaintFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
CIFCopyRec *cifCopyRec)
|
||||
{
|
||||
int pNum;
|
||||
TileType dinfo;
|
||||
TileType newdinfo;
|
||||
Rect sourceRect, targetRect;
|
||||
Transform *trans = cifCopyRec->trans;
|
||||
Plane *plane = cifCopyRec->plane;
|
||||
|
||||
dinfo = TiGetTypeExact(tile);
|
||||
newdinfo = TiGetTypeExact(tile) | dinfo;
|
||||
|
||||
if (trans)
|
||||
{
|
||||
TiToRect(tile, &sourceRect);
|
||||
GeoTransRect(trans, &sourceRect, &targetRect);
|
||||
if (IsSplit(tile))
|
||||
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), trans);
|
||||
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, trans);
|
||||
}
|
||||
else
|
||||
TiToRect(tile, &targetRect);
|
||||
|
||||
DBNMPaintPlane(plane, dinfo, &targetRect, CIFPaintTable,
|
||||
DBNMPaintPlane(plane, newdinfo, &targetRect, CIFPaintTable,
|
||||
(PaintUndoInfo *)NULL);
|
||||
|
||||
return 0;
|
||||
|
|
@ -561,6 +563,7 @@ cifCopyPaintFunc(
|
|||
int
|
||||
cifMaskHintFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* Unused, do not support non-manhattan hints */
|
||||
LinkedRect **lrecp)
|
||||
{
|
||||
Rect r;
|
||||
|
|
@ -597,8 +600,9 @@ int
|
|||
CIFPaintCurrent(
|
||||
int filetype)
|
||||
{
|
||||
extern int cifMakeBoundaryFunc(Tile *tile, ClientData clientdata); /* Forward declaration. */
|
||||
extern int cifPaintCurrentFunc(Tile *tile, TileType type); /* Forward declaration. */
|
||||
/* Forward declarations. */
|
||||
extern int cifMakeBoundaryFunc(Tile *tile, TileType dinfo, ClientData clientdata);
|
||||
extern int cifPaintCurrentFunc(Tile *tile, TileType dinfo, TileType type);
|
||||
|
||||
Plane *plane, *swapplane;
|
||||
int i;
|
||||
|
|
@ -891,6 +895,7 @@ CIFPaintCurrent(
|
|||
int
|
||||
cifMakeBoundaryFunc(
|
||||
Tile *tile, /* Tile of CIF information. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
ClientData clientdata) /* Pass the file type (CIF or CALMA) */
|
||||
{
|
||||
/* It is assumed that there is one rectangle for the boundary. */
|
||||
|
|
@ -970,6 +975,7 @@ cifMakeBoundaryFunc(
|
|||
int
|
||||
cifPaintCurrentFunc(
|
||||
Tile *tile, /* Tile of CIF information. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
TileType type) /* Magic type to be painted. */
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -1019,7 +1025,7 @@ cifPaintCurrentFunc(
|
|||
for (pNum = PL_PAINTBASE; pNum < DBNumPlanes; pNum++)
|
||||
if (DBPaintOnPlane(type, pNum))
|
||||
{
|
||||
DBNMPaintPlane(cifReadCellDef->cd_planes[pNum], TiGetTypeExact(tile),
|
||||
DBNMPaintPlane(cifReadCellDef->cd_planes[pNum], TiGetTypeExact(tile) | dinfo,
|
||||
&area, DBStdPaintTbl(type, pNum), (PaintUndoInfo *) NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
15
cif/CIFsee.c
15
cif/CIFsee.c
|
|
@ -78,6 +78,7 @@ typedef struct {
|
|||
int
|
||||
cifPaintDBFunc(
|
||||
Tile *tile, /* Tile of CIF information. */
|
||||
TileType dinfo,
|
||||
PaintLayerData *pld)
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -106,7 +107,7 @@ cifPaintDBFunc(
|
|||
if (DBPaintOnPlane(type, pNum))
|
||||
{
|
||||
ui.pu_pNum = pNum;
|
||||
DBNMPaintPlane(paintDef->cd_planes[pNum], TiGetTypeExact(tile),
|
||||
DBNMPaintPlane(paintDef->cd_planes[pNum], TiGetTypeExact(tile) | dinfo,
|
||||
&area, DBStdPaintTbl(type, pNum), (PaintUndoInfo *) &ui);
|
||||
}
|
||||
|
||||
|
|
@ -219,6 +220,7 @@ CIFPaintLayer(
|
|||
int
|
||||
cifSeeFunc(
|
||||
Tile *tile, /* Tile to be entered as feedback. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
SeeLayerData *sld) /* Layer and explanation for the feedback. */
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -233,10 +235,10 @@ cifSeeFunc(
|
|||
(float)area.r_ybot / (float)CIFCurStyle->cs_scaleFactor);
|
||||
}
|
||||
|
||||
/* (NOTE: Preserve information about the geometry of a diagonal tile) */
|
||||
DBWFeedbackAdd(&area, sld->text, cifSeeDef, CIFCurStyle->cs_scaleFactor,
|
||||
sld->style |
|
||||
(TiGetTypeExact(tile) & (TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
|
||||
/* (preserve information about the geometry of a diagonal tile) */
|
||||
sld->style | ((TiGetTypeExact(tile) | dinfo) &
|
||||
(TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -438,9 +440,11 @@ CIFCoverageLayer(
|
|||
SearchContext scx;
|
||||
TileTypeBitMask mask, depend;
|
||||
float fcover;
|
||||
int cifCoverageFunc(Tile *tile, ClientData *arg);
|
||||
bool doBox = (area != &rootDef->cd_bbox) ? TRUE : FALSE;
|
||||
|
||||
/* Forward declaration */
|
||||
int cifCoverageFunc(Tile *tile, TileType dinfo, ClientData *arg);
|
||||
|
||||
/* Check out the CIF layer name. */
|
||||
|
||||
if (!CIFNameToMask(layer, &mask, &depend)) return;
|
||||
|
|
@ -512,6 +516,7 @@ CIFCoverageLayer(
|
|||
int
|
||||
cifCoverageFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData *arg)
|
||||
{
|
||||
coverstats *cstats = (coverstats *)arg;
|
||||
|
|
|
|||
|
|
@ -46,8 +46,8 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
|
|||
/* Forward declarations */
|
||||
extern int cifWriteInitFunc(CellDef *def);
|
||||
extern int cifWriteMarkFunc(CellUse *use);
|
||||
extern int cifWritePaintFunc(Tile *tile, FILE *f);
|
||||
extern int cifWriteLabelFunc(Tile *tile, FILE *f);
|
||||
extern int cifWritePaintFunc(Tile *tile, TileType dinfo, FILE *f);
|
||||
extern int cifWriteLabelFunc(Tile *tile, TileType dinfo, FILE *f);
|
||||
extern int cifWriteUseFunc(CellUse *use, FILE *f);
|
||||
extern void cifOutPreamble(FILE *outf, CellDef *cell);
|
||||
extern void cifOut(FILE *outf);
|
||||
|
|
@ -584,6 +584,7 @@ cifWriteUseFunc(
|
|||
int
|
||||
cifWriteLabelFunc(
|
||||
Tile *tile, /* Tile to be written out. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
FILE *f) /* File in which to write. */
|
||||
{
|
||||
Rect r;
|
||||
|
|
@ -643,7 +644,8 @@ cifWriteLabelFunc(
|
|||
int
|
||||
cifWritePaintFunc(
|
||||
Tile *tile, /* Tile to be written out. */
|
||||
FILE *f) /* File in which to write. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
FILE *f) /* File in which to write. */
|
||||
{
|
||||
Rect r;
|
||||
|
||||
|
|
@ -662,7 +664,7 @@ cifWritePaintFunc(
|
|||
Point points[5];
|
||||
int i, np;
|
||||
|
||||
GrClipTriangle(&r, NULL, FALSE, TiGetTypeExact(tile), points, &np);
|
||||
GrClipTriangle(&r, NULL, FALSE, TiGetTypeExact(tile) | dinfo, points, &np);
|
||||
|
||||
/* Write triangle as a CIF polygon */
|
||||
|
||||
|
|
|
|||
|
|
@ -2396,8 +2396,10 @@ CmdContact(
|
|||
CCStruct ccs;
|
||||
Rect area;
|
||||
LinkedRect *lr = NULL;
|
||||
int cmdContactFunc(Tile *tile, CCStruct *ccs); /* Forward declaration */
|
||||
int cmdContactEraseFunc(Tile *tile, LinkedRect **lr); /* Forward declaration */
|
||||
|
||||
/* Forward declarations */
|
||||
int cmdContactFunc(Tile *tile, TileType dinfo, CCStruct *ccs);
|
||||
int cmdContactEraseFunc(Tile *tile, TileType dinfo, LinkedRect **lr);
|
||||
|
||||
windCheckOnlyWindow(&w, DBWclientID);
|
||||
if ((w == (MagWindow *) NULL) || (w->w_client != DBWclientID))
|
||||
|
|
@ -2531,11 +2533,14 @@ CmdContact(
|
|||
int
|
||||
cmdContactFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
CCStruct *ccs)
|
||||
{
|
||||
TileType stype;
|
||||
TileTypeBitMask smask;
|
||||
int cmdContactFunc2(Tile *tile, CCStruct *ccs); /* Forward declaration */
|
||||
|
||||
/* Forward declaration */
|
||||
int cmdContactFunc2(Tile *tile, TileType dinfo, CCStruct *ccs);
|
||||
|
||||
TiToRect(tile, &ccs->area);
|
||||
GeoClip(&ccs->area, &ccs->clip);
|
||||
|
|
@ -2545,7 +2550,7 @@ cmdContactFunc(
|
|||
break;
|
||||
|
||||
TTMaskSetOnlyType(&smask, stype);
|
||||
DBSrPaintArea((Tile *) NULL, ccs->rootDef->cd_planes[DBPlane(stype)],
|
||||
DBSrPaintNMArea((Tile *)NULL, ccs->rootDef->cd_planes[DBPlane(stype)], dinfo,
|
||||
&ccs->area, &smask, cmdContactFunc2, (ClientData)ccs);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2553,6 +2558,7 @@ cmdContactFunc(
|
|||
int
|
||||
cmdContactFunc2(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
CCStruct *ccs)
|
||||
{
|
||||
LinkedRect *newlr;
|
||||
|
|
@ -2575,6 +2581,7 @@ cmdContactFunc2(
|
|||
int
|
||||
cmdContactEraseFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
LinkedRect **lr)
|
||||
{
|
||||
LinkedRect *newlr;
|
||||
|
|
@ -2828,14 +2835,15 @@ CmdCorner(
|
|||
TileTypeBitMask maskBits;
|
||||
Rect editBox;
|
||||
SearchContext scx;
|
||||
extern int cmdCornerFunc(Tile *tile, TreeContext *cxp);
|
||||
bool hasErr = FALSE;
|
||||
int locargc = cmd->tx_argc;
|
||||
|
||||
extern int cmdBevelFunc(Tile *tile, TreeContext *cxp);
|
||||
bool dobevel = FALSE;
|
||||
NMCornerPath cmdPathList;
|
||||
|
||||
/* Forward declarations */
|
||||
extern int cmdCornerFunc(Tile *tile, TileType dinfo, TreeContext *cxp);
|
||||
extern int cmdBevelFunc(Tile *tile, TileType dinfo, TreeContext *cxp);
|
||||
|
||||
if (cmd->tx_argc < 3 || cmd->tx_argc > 5)
|
||||
{
|
||||
TxError("Usage: %s direction1 direction2 [layers]\n",
|
||||
|
|
@ -3030,6 +3038,7 @@ CmdCorner(
|
|||
int
|
||||
cmdCornerFunc(
|
||||
Tile *tile, /* Tile to fill with. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
TreeContext *cxp) /* Describes state of search. */
|
||||
{
|
||||
Rect r1, r2, r3;
|
||||
|
|
@ -3196,6 +3205,7 @@ AddNewPoint(
|
|||
int
|
||||
cmdBevelFunc(
|
||||
Tile *tile, /* Tile to fill with. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
TreeContext *cxp) /* Describes state of search. */
|
||||
{
|
||||
Rect r1, r2, r3;
|
||||
|
|
@ -4585,6 +4595,7 @@ CmdDrc(
|
|||
int
|
||||
cmdDropPaintCell(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
TreeContext *cxp)
|
||||
{
|
||||
CellDef *cellDef = cxp->tc_scx->scx_use->cu_def;
|
||||
|
|
@ -4593,7 +4604,7 @@ cmdDropPaintCell(
|
|||
TileType type;
|
||||
Rect area;
|
||||
|
||||
if (SplitSide(tile))
|
||||
if (dinfo & TT_SIDE)
|
||||
type = SplitRightType(tile);
|
||||
else
|
||||
type = SplitLeftType(tile);
|
||||
|
|
@ -4626,6 +4637,7 @@ cmdDropPaintCell(
|
|||
int
|
||||
cmdDropFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData clientData)
|
||||
{
|
||||
TileTypeBitMask tMask, *lMask = (TileTypeBitMask *)clientData;
|
||||
|
|
@ -4636,7 +4648,7 @@ cmdDropFunc(
|
|||
scx.scx_use = EditCellUse;
|
||||
scx.scx_trans = GeoIdentityTransform;
|
||||
|
||||
if (SplitSide(tile))
|
||||
if (dinfo & TT_SIDE)
|
||||
type = SplitRightType(tile);
|
||||
else
|
||||
type = SplitLeftType(tile);
|
||||
|
|
|
|||
|
|
@ -102,15 +102,17 @@ struct cmdFPArg
|
|||
int
|
||||
feedPolyFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
struct cmdFPArg *arg)
|
||||
{
|
||||
Rect area;
|
||||
TiToRect(tile, &area);
|
||||
|
||||
/* (NOTE: Preserve information about the geometry of a diagonal tile) */
|
||||
DBWFeedbackAdd(&area, arg->text, arg->def, FEEDMAGNIFY,
|
||||
arg->style |
|
||||
(TiGetTypeExact(tile) & (TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
|
||||
/* (preserve information about the geometry of a diagonal tile) */
|
||||
((TiGetTypeExact(tile) | dinfo) &
|
||||
(TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -507,13 +509,15 @@ struct cmdFillArea *cmdFillList; /* List of areas to fill. */
|
|||
|
||||
void
|
||||
CmdFill(
|
||||
MagWindow *w, /* Window in which command was invoked. */
|
||||
MagWindow *w, /* Window in which command was invoked. */
|
||||
TxCommand *cmd) /* Describes the command that was invoked. */
|
||||
{
|
||||
TileTypeBitMask maskBits;
|
||||
Rect editBox;
|
||||
SearchContext scx;
|
||||
extern int cmdFillFunc(Tile *tile, TreeContext *cxp);
|
||||
|
||||
/* Forward declaration */
|
||||
extern int cmdFillFunc(Tile *tile, TileType dinfo, TreeContext *cxp);
|
||||
|
||||
if (cmd->tx_argc < 2 || cmd->tx_argc > 3)
|
||||
{
|
||||
|
|
@ -603,11 +607,16 @@ CmdFill(
|
|||
* paint here it may mess up the search. Instead, the procedures
|
||||
* save areas on a list. The list is post-processed to paint the
|
||||
* areas once the search is finished.
|
||||
*
|
||||
* Split tile information is unused because there is no obvious
|
||||
* meaning to "filling" from a split tile, although probably reasonable
|
||||
* methods could be worked out.
|
||||
*/
|
||||
|
||||
int
|
||||
cmdFillFunc(
|
||||
Tile *tile, /* Tile to fill with. */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
TreeContext *cxp) /* Describes state of search. */
|
||||
{
|
||||
Rect r1, r2;
|
||||
|
|
@ -1707,7 +1716,7 @@ checklocal:
|
|||
|
||||
if (locvalid == TRUE)
|
||||
{
|
||||
int findTile(Tile *tile, TileType *rtype);
|
||||
int findTile(Tile *tile, TileType dinfo, TileType *rtype);
|
||||
CellDef *targetdef = use->cu_def;
|
||||
Plane *plane = targetdef->cd_planes[pnum];
|
||||
|
||||
|
|
@ -1841,13 +1850,14 @@ CmdGoto(
|
|||
int
|
||||
findTile(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
TileType *rtype)
|
||||
{
|
||||
TileType ttype;
|
||||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
if (SplitSide(tile))
|
||||
if (dinfo & TT_SIDE)
|
||||
ttype = SplitRightType(tile);
|
||||
else
|
||||
ttype = SplitLeftType(tile);
|
||||
|
|
|
|||
|
|
@ -61,7 +61,9 @@ static const char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magi
|
|||
|
||||
int
|
||||
existFunc(
|
||||
Tile *tile)
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -839,7 +841,8 @@ struct linked_id {
|
|||
|
||||
int
|
||||
cmdWhatPrintCell(
|
||||
Tile *tile,
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
TreeContext *cxp)
|
||||
{
|
||||
struct linked_id **lid = (struct linked_id **)cxp->tc_filter->tf_arg;
|
||||
|
|
@ -894,6 +897,7 @@ static LabelStore *labelBlockTop, *labelEntry;
|
|||
int
|
||||
cmdFindWhatTileFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData clientData)
|
||||
{
|
||||
struct linked_id **lid = (struct linked_id **)clientData;
|
||||
|
|
@ -905,7 +909,7 @@ cmdFindWhatTileFunc(
|
|||
scx.scx_use = EditCellUse;
|
||||
scx.scx_trans = GeoIdentityTransform;
|
||||
|
||||
if (SplitSide(tile))
|
||||
if (dinfo & TT_SIDE)
|
||||
type = SplitRightType(tile);
|
||||
else
|
||||
type = SplitLeftType(tile);
|
||||
|
|
|
|||
|
|
@ -211,7 +211,8 @@ CmdExtractTest(
|
|||
|
||||
int
|
||||
tileCountProc(
|
||||
Tile *tile,
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
int *tcount)
|
||||
{
|
||||
(*tcount)++;
|
||||
|
|
@ -800,11 +801,13 @@ cmdStatsCount(
|
|||
CellDef *def,
|
||||
struct countClient *cc)
|
||||
{
|
||||
int cmdStatsCountTile(Tile *tile, struct cellInfo *ci);
|
||||
int pNum;
|
||||
struct cellInfo *ci;
|
||||
TileType t;
|
||||
|
||||
/* Forward declaration */
|
||||
int cmdStatsCountTile(Tile *tile, TileType dinfo, struct cellInfo *ci);
|
||||
|
||||
if (def->cd_client)
|
||||
return (1);
|
||||
|
||||
|
|
@ -829,6 +832,7 @@ cmdStatsCount(
|
|||
int
|
||||
cmdStatsCountTile(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
struct cellInfo *ci)
|
||||
{
|
||||
TileType type = TiGetType(tile);
|
||||
|
|
@ -1099,17 +1103,18 @@ CmdTsearch(
|
|||
MagWindow *w,
|
||||
TxCommand *cmd)
|
||||
{
|
||||
int cmdTsrFunc(Tile *tp);
|
||||
char *RunStats(int flags, struct tms *lastt, struct tms *deltat);
|
||||
char *rstatp;
|
||||
static TileTypeBitMask mask;
|
||||
static struct tms tlast, tdelta;
|
||||
Rect rtool, rsearch;
|
||||
/**** Rect *ebox; ****/
|
||||
Plane *plane;
|
||||
int i, pNum, count;
|
||||
int usPerSearch, usPerTile, usPerL2, us, boxarea;
|
||||
|
||||
/* Forward declarations */
|
||||
int cmdTsrFunc(Tile *tp, TileType dinfo, ClientData clientdata);
|
||||
char *RunStats(int flags, struct tms *lastt, struct tms *deltat);
|
||||
|
||||
if (cmd->tx_argc < 3 || cmd->tx_argc > 5)
|
||||
{
|
||||
TxError("Usage: tsearch plane count [mask [new|mayo]]\n");
|
||||
|
|
@ -1209,7 +1214,9 @@ CmdTsearch(
|
|||
|
||||
int
|
||||
cmdTsrFunc(
|
||||
Tile *tp)
|
||||
Tile *tp,
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
if (cmdTsearchDebug)
|
||||
TxPrintf("%lx\n", (intptr_t) tp);
|
||||
|
|
|
|||
|
|
@ -967,14 +967,15 @@ DBCellGenerateSimpleSubstrate(scx, subType, notSubMask, targetDef)
|
|||
*/
|
||||
|
||||
int
|
||||
dbEraseSubFunc(tile, cxp)
|
||||
dbEraseSubFunc(tile, dinfo, cxp)
|
||||
Tile *tile; /* Pointer to source tile with shield type */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* Context from DBTreeSrTiles */
|
||||
{
|
||||
SearchContext *scx;
|
||||
Rect sourceRect, targetRect;
|
||||
int pNum;
|
||||
TileType dinfo, loctype, subType;
|
||||
TileType newdinfo, loctype, subType;
|
||||
Plane *plane;
|
||||
struct dbCopySubData *csd; /* Client data */
|
||||
|
||||
|
|
@ -983,12 +984,11 @@ dbEraseSubFunc(tile, cxp)
|
|||
plane = csd->csd_plane;
|
||||
pNum = csd->csd_pNum;
|
||||
subType = csd->csd_subtype;
|
||||
dinfo = TiGetTypeExact(tile);
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
if (loctype == TT_SPACE) return 0;
|
||||
dinfo = DBTransformDiagonal(dinfo, &scx->scx_trans);
|
||||
newdinfo = DBTransformDiagonal(dinfo, &scx->scx_trans);
|
||||
}
|
||||
|
||||
/* Construct the rect for the tile */
|
||||
|
|
@ -999,7 +999,7 @@ dbEraseSubFunc(tile, cxp)
|
|||
|
||||
csd->csd_modified = TRUE;
|
||||
|
||||
return DBNMPaintPlane(plane, dinfo, &targetRect, DBStdEraseTbl(subType, pNum),
|
||||
return DBNMPaintPlane(plane, newdinfo, &targetRect, DBStdEraseTbl(subType, pNum),
|
||||
(PaintUndoInfo *)NULL);
|
||||
}
|
||||
|
||||
|
|
@ -1011,14 +1011,15 @@ dbEraseSubFunc(tile, cxp)
|
|||
*/
|
||||
|
||||
int
|
||||
dbPaintSubFunc(tile, cxp)
|
||||
dbPaintSubFunc(tile, dinfo, cxp)
|
||||
Tile *tile; /* Pointer to source tile with shield type */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* Context from DBTreeSrTiles */
|
||||
{
|
||||
SearchContext *scx;
|
||||
Rect sourceRect, targetRect;
|
||||
int pNum;
|
||||
TileType dinfo, loctype, subType;
|
||||
TileType newdinfo, loctype, subType;
|
||||
Plane *plane;
|
||||
struct dbCopySubData *csd; /* Client data */
|
||||
|
||||
|
|
@ -1027,12 +1028,11 @@ dbPaintSubFunc(tile, cxp)
|
|||
plane = csd->csd_plane;
|
||||
pNum = csd->csd_pNum;
|
||||
subType = csd->csd_subtype;
|
||||
dinfo = TiGetTypeExact(tile);
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
if (loctype == TT_SPACE) return 0;
|
||||
dinfo = DBTransformDiagonal(dinfo, &scx->scx_trans);
|
||||
newdinfo = DBTransformDiagonal(dinfo, &scx->scx_trans);
|
||||
}
|
||||
|
||||
/* Construct the rect for the tile */
|
||||
|
|
@ -1043,7 +1043,7 @@ dbPaintSubFunc(tile, cxp)
|
|||
|
||||
csd->csd_modified = TRUE;
|
||||
|
||||
return DBNMPaintPlane(plane, dinfo, &targetRect, DBStdPaintTbl(subType, pNum),
|
||||
return DBNMPaintPlane(plane, newdinfo, &targetRect, DBStdPaintTbl(subType, pNum),
|
||||
(PaintUndoInfo *)NULL);
|
||||
}
|
||||
|
||||
|
|
@ -1056,14 +1056,15 @@ dbPaintSubFunc(tile, cxp)
|
|||
*/
|
||||
|
||||
int
|
||||
dbEraseNonSub(tile, cxp)
|
||||
dbEraseNonSub(tile, dinfo, cxp)
|
||||
Tile *tile; /* Pointer to tile to erase from target */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* Context from DBTreeSrTiles */
|
||||
{
|
||||
SearchContext *scx;
|
||||
Rect sourceRect, targetRect;
|
||||
Plane *plane; /* Plane of target data */
|
||||
TileType dinfo, loctype, subType;
|
||||
TileType newdinfo, loctype, subType;
|
||||
struct dbCopySubData *csd;
|
||||
int pNum;
|
||||
|
||||
|
|
@ -1074,12 +1075,11 @@ dbEraseNonSub(tile, cxp)
|
|||
|
||||
scx = cxp->tc_scx;
|
||||
|
||||
dinfo = TiGetTypeExact(tile);
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
if (loctype == TT_SPACE) return 0;
|
||||
dinfo = DBTransformDiagonal(dinfo, &scx->scx_trans);
|
||||
newdinfo = DBTransformDiagonal(dinfo, &scx->scx_trans);
|
||||
}
|
||||
|
||||
/* Construct the rect for the tile */
|
||||
|
|
@ -1089,7 +1089,7 @@ dbEraseNonSub(tile, cxp)
|
|||
GEOTRANSRECT(&scx->scx_trans, &sourceRect, &targetRect);
|
||||
|
||||
/* Erase the substrate type from the area of this tile in the target plane. */
|
||||
return DBNMPaintPlane(plane, dinfo, &targetRect, DBStdEraseTbl(subType, pNum),
|
||||
return DBNMPaintPlane(plane, newdinfo, &targetRect, DBStdEraseTbl(subType, pNum),
|
||||
(PaintUndoInfo *)NULL);
|
||||
}
|
||||
|
||||
|
|
@ -1101,8 +1101,9 @@ dbEraseNonSub(tile, cxp)
|
|||
*/
|
||||
|
||||
int
|
||||
dbCopySubFunc(tile, csd)
|
||||
dbCopySubFunc(tile, dinfo, csd)
|
||||
Tile *tile; /* Pointer to tile to erase from target */
|
||||
TileType dinfo; /* Split tile information */
|
||||
struct dbCopySubData *csd; /* Client data */
|
||||
{
|
||||
Rect rect;
|
||||
|
|
@ -1112,10 +1113,10 @@ dbCopySubFunc(tile, csd)
|
|||
|
||||
plane = csd->csd_plane;
|
||||
pNum = csd->csd_pNum;
|
||||
type = TiGetTypeExact(tile);
|
||||
type = TiGetTypeExact(tile) | dinfo;
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
if (loctype == TT_SPACE) return 0;
|
||||
}
|
||||
else
|
||||
|
|
@ -1436,8 +1437,9 @@ DBCellCopyLabels(scx, mask, xMask, targetUse, pArea)
|
|||
***/
|
||||
|
||||
int
|
||||
dbCopyManhattanPaint(tile, cxp)
|
||||
Tile *tile; /* Pointer to tile to copy */
|
||||
dbCopyManhattanPaint(tile, dinfo, cxp)
|
||||
Tile *tile; /* Pointer to tile to copy */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* Context from DBTreeSrTiles */
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -1483,8 +1485,9 @@ dbCopyManhattanPaint(tile, cxp)
|
|||
***/
|
||||
|
||||
int
|
||||
dbCopyAllPaint(tile, cxp)
|
||||
Tile *tile; /* Pointer to tile to copy */
|
||||
dbCopyAllPaint(tile, dinfo, cxp)
|
||||
Tile *tile; /* Pointer to tile to copy */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* Context from DBTreeSrTiles */
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -1492,7 +1495,7 @@ dbCopyAllPaint(tile, cxp)
|
|||
Rect sourceRect, targetRect;
|
||||
PaintUndoInfo ui;
|
||||
CellDef *def;
|
||||
TileType type = TiGetTypeExact(tile);
|
||||
TileType type = TiGetTypeExact(tile) | dinfo;
|
||||
int pNum = cxp->tc_plane;
|
||||
int result;
|
||||
TileTypeBitMask *typeMask;
|
||||
|
|
@ -1505,13 +1508,13 @@ dbCopyAllPaint(tile, cxp)
|
|||
*/
|
||||
|
||||
bool splittile = FALSE;
|
||||
TileType dinfo = 0;
|
||||
TileType newdinfo = 0;
|
||||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
splittile = TRUE;
|
||||
dinfo = DBTransformDiagonal(type, &scx->scx_trans);
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) :
|
||||
newdinfo = DBTransformDiagonal(type, &scx->scx_trans);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) :
|
||||
SplitLeftType(tile);
|
||||
}
|
||||
|
||||
|
|
@ -1571,7 +1574,7 @@ dbCopyAllPaint(tile, cxp)
|
|||
Rect rrect, orect;
|
||||
int np, i, j;
|
||||
|
||||
GrClipTriangle(&targetRect, &arg->caa_rect, TRUE, dinfo, points, &np);
|
||||
GrClipTriangle(&targetRect, &arg->caa_rect, TRUE, newdinfo, points, &np);
|
||||
|
||||
if (np == 0)
|
||||
return(0);
|
||||
|
|
@ -1600,7 +1603,7 @@ dbCopyAllPaint(tile, cxp)
|
|||
rrect.r_ybot = points[0].p_y;
|
||||
rrect.r_ytop = points[2].p_y;
|
||||
GeoCanonicalRect(&rrect, &targetRect);
|
||||
dinfo = 0;
|
||||
newdinfo = 0;
|
||||
}
|
||||
else if (np >= 4) /* Process extra rectangles in the area */
|
||||
{
|
||||
|
|
@ -1657,7 +1660,7 @@ topbottom:
|
|||
|
||||
splitdone:
|
||||
|
||||
result = (*dbCurPaintPlane)(def, pNum, dinfo | type, &targetRect, &ui);
|
||||
result = (*dbCurPaintPlane)(def, pNum, newdinfo | type, &targetRect, &ui);
|
||||
if ((result != 0) && (arg->caa_func != NULL))
|
||||
{
|
||||
/* result == 1 used exclusively for DRC off-grid error flagging */
|
||||
|
|
|
|||
|
|
@ -120,6 +120,7 @@ DBSrCellPlaneArea(BPlane *plane, const Rect *rect, int (*func)(), ClientData arg
|
|||
* int
|
||||
* func(tile, cxp)
|
||||
* Tile *tile;
|
||||
* TileType dinfo;
|
||||
* TreeContext *cxp;
|
||||
* {
|
||||
* }
|
||||
|
|
@ -416,6 +417,7 @@ dbCellUniqueTileSrFunc(scx, fp)
|
|||
* int
|
||||
* func(tile, cxp)
|
||||
* Tile *tile;
|
||||
* TileType dinfo;
|
||||
* TreeContext *cxp;
|
||||
* {
|
||||
* }
|
||||
|
|
@ -914,8 +916,9 @@ DBSeeTypesAll(rootUse, rootRect, xMask, mask)
|
|||
*/
|
||||
|
||||
int
|
||||
dbSeeTypesAllSrFunc(tile, cxp)
|
||||
dbSeeTypesAllSrFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
TreeContext *cxp;
|
||||
{
|
||||
Rect tileRect;
|
||||
|
|
@ -926,7 +929,7 @@ dbSeeTypesAllSrFunc(tile, cxp)
|
|||
if (GEO_OVERLAP((&tileRect), area))
|
||||
{
|
||||
if (IsSplit(tile))
|
||||
TTMaskSetType(mask, SplitSide(tile) ?
|
||||
TTMaskSetType(mask, (dinfo & TT_SIDE) ?
|
||||
SplitRightType(tile) : SplitLeftType(tile));
|
||||
else
|
||||
TTMaskSetType(mask, TiGetType(tile));
|
||||
|
|
@ -1607,8 +1610,9 @@ dbScalePlane(oldplane, newplane, pnum, scalen, scaled, doCIF)
|
|||
*/
|
||||
|
||||
int
|
||||
dbTileScaleFunc(tile, scvals)
|
||||
dbTileScaleFunc(tile, dinfo, scvals)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
struct scaleArg *scvals;
|
||||
{
|
||||
TileType type;
|
||||
|
|
@ -1631,10 +1635,10 @@ dbTileScaleFunc(tile, scvals)
|
|||
return 0;
|
||||
}
|
||||
|
||||
type = TiGetTypeExact(tile);
|
||||
type = TiGetTypeExact(tile) | dinfo;
|
||||
exact = type;
|
||||
if (IsSplit(tile))
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
DBNMPaintPlane(scvals->ptarget, exact, &targetRect,
|
||||
(
|
||||
#ifdef CIF_MODULE
|
||||
|
|
@ -1689,8 +1693,9 @@ dbMovePlane(oldplane, newplane, pnum, origx, origy)
|
|||
*/
|
||||
|
||||
int
|
||||
dbTileMoveFunc(tile, mvvals)
|
||||
dbTileMoveFunc(tile, dinfo, mvvals)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
struct moveArg *mvvals;
|
||||
{
|
||||
TileType type;
|
||||
|
|
@ -1703,10 +1708,10 @@ dbTileMoveFunc(tile, mvvals)
|
|||
DBMovePoint(&targetRect.r_ll, mvvals->origx, mvvals->origy);
|
||||
DBMovePoint(&targetRect.r_ur, mvvals->origx, mvvals->origy);
|
||||
|
||||
type = TiGetTypeExact(tile);
|
||||
type = TiGetTypeExact(tile) | dinfo;
|
||||
exact = type;
|
||||
if (IsSplit(tile))
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
DBNMPaintPlane(mvvals->ptarget, exact, &targetRect,
|
||||
DBStdPaintTbl(type, mvvals->pnum),
|
||||
(PaintUndoInfo *)NULL);
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@ DBInvTransformDiagonal(oldtype, trans)
|
|||
* int
|
||||
* func(tile, clientData)
|
||||
* Tile *tile;
|
||||
* TileType dinfo;
|
||||
* ClientData clientData;
|
||||
* {
|
||||
* }
|
||||
|
|
@ -166,8 +167,9 @@ DBInvTransformDiagonal(oldtype, trans)
|
|||
*/
|
||||
|
||||
int
|
||||
DBSrConnectOnePlane(startTile, connect, func, clientData)
|
||||
DBSrConnectOnePlane(startTile, dinfo, connect, func, clientData)
|
||||
Tile *startTile; /* Starting tile for search */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TileTypeBitMask *connect; /* Pointer to a table indicating what tile
|
||||
* types connect to what other tile types.
|
||||
* Each entry gives a mask of types that
|
||||
|
|
@ -192,7 +194,7 @@ DBSrConnectOnePlane(startTile, connect, func, clientData)
|
|||
csa.csa_clear = FALSE;
|
||||
csa.csa_connect = connect;
|
||||
csa.csa_pNum = -1;
|
||||
if (dbSrConnectFunc(startTile, PTR2CD(&csa)) != 0) result = 1;
|
||||
if (dbSrConnectFunc(startTile, dinfo, PTR2CD(&csa)) != 0) result = 1;
|
||||
|
||||
/* Pass 2. Don't call any client function, just clear the marks.
|
||||
* Don't allow any interruptions.
|
||||
|
|
@ -201,7 +203,7 @@ DBSrConnectOnePlane(startTile, connect, func, clientData)
|
|||
SigDisableInterrupts();
|
||||
csa.csa_clientFunc = NULL;
|
||||
csa.csa_clear = TRUE;
|
||||
(void) dbSrConnectFunc(startTile, PTR2CD(&csa));
|
||||
(void) dbSrConnectFunc(startTile, dinfo, PTR2CD(&csa));
|
||||
SigEnableInterrupts();
|
||||
|
||||
return result;
|
||||
|
|
@ -276,7 +278,7 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
|
|||
{
|
||||
struct conSrArg csa;
|
||||
int startPlane, result;
|
||||
Tile *startTile; /* Starting tile for search. */
|
||||
TileAndDinfo start_tad; /* Starting tile and split information */
|
||||
|
||||
result = 0;
|
||||
csa.csa_def = def;
|
||||
|
|
@ -287,17 +289,17 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
|
|||
* the tile address and returns.
|
||||
*/
|
||||
|
||||
startTile = NULL;
|
||||
start_tad.tad_tile = NULL;
|
||||
for (startPlane = PL_TECHDEPBASE; startPlane < DBNumPlanes; startPlane++)
|
||||
{
|
||||
csa.csa_pNum = startPlane;
|
||||
if (DBSrPaintArea((Tile *) NULL,
|
||||
def->cd_planes[startPlane], startArea, mask,
|
||||
dbSrConnectStartFunc, PTR2CD(&startTile)) != 0) break;
|
||||
dbSrConnectStartFunc, PTR2CD(&start_tad)) != 0) break;
|
||||
}
|
||||
if (startTile == NULL) return 0;
|
||||
if (start_tad.tad_tile == NULL) return 0;
|
||||
/* The following lets us call DBSrConnect recursively */
|
||||
else if (startTile->ti_client == (ClientData)1) return 0;
|
||||
else if (start_tad.tad_tile->ti_client == (ClientData)1) return 0;
|
||||
|
||||
/* Pass 1. During this pass the client function gets called. */
|
||||
|
||||
|
|
@ -306,7 +308,8 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
|
|||
csa.csa_clientDefault = CLIENTDEFAULT;
|
||||
csa.csa_clear = FALSE;
|
||||
csa.csa_connect = connect;
|
||||
if (dbSrConnectFunc(startTile, PTR2CD(&csa)) != 0) result = 1;
|
||||
if (dbSrConnectFunc(start_tad.tad_tile, start_tad.tad_dinfo,
|
||||
PTR2CD(&csa)) != 0) result = 1;
|
||||
|
||||
/* Pass 2. Don't call any client function, just clear the marks.
|
||||
* Don't allow any interruptions.
|
||||
|
|
@ -315,7 +318,7 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
|
|||
SigDisableInterrupts();
|
||||
csa.csa_clientFunc = NULL;
|
||||
csa.csa_clear = TRUE;
|
||||
(void) dbSrConnectFunc(startTile, PTR2CD(&csa));
|
||||
(void) dbSrConnectFunc(start_tad.tad_tile, start_tad.tad_dinfo, PTR2CD(&csa));
|
||||
SigEnableInterrupts();
|
||||
|
||||
return result;
|
||||
|
|
@ -325,11 +328,12 @@ DBSrConnect(def, startArea, mask, connect, bounds, func, clientData)
|
|||
int
|
||||
dbSrConnectStartFunc(
|
||||
Tile *tile, /* This will be the starting tile. */
|
||||
ClientData cdata) /* We store tile's address here. */
|
||||
/* (Tile **pTile) */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData cdata) /* We store tile and split info here. */
|
||||
{
|
||||
Tile **pTile = (Tile **)CD2PTR(cdata);
|
||||
*pTile = tile;
|
||||
TileAndDinfo *tad = (TileAndDinfo *)CD2PTR(cdata);
|
||||
tad->tad_tile = tile;
|
||||
tad->tad_dinfo = dinfo;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -367,7 +371,7 @@ DBSrConnectOnePass(def, startArea, mask, connect, bounds, func, clientData)
|
|||
{
|
||||
struct conSrArg csa;
|
||||
int startPlane, result;
|
||||
Tile *startTile; /* Starting tile for search. */
|
||||
TileAndDinfo tad;
|
||||
|
||||
result = 0;
|
||||
csa.csa_def = def;
|
||||
|
|
@ -378,17 +382,17 @@ DBSrConnectOnePass(def, startArea, mask, connect, bounds, func, clientData)
|
|||
* the tile address and returns.
|
||||
*/
|
||||
|
||||
startTile = NULL;
|
||||
tad.tad_tile = NULL;
|
||||
for (startPlane = PL_TECHDEPBASE; startPlane < DBNumPlanes; startPlane++)
|
||||
{
|
||||
csa.csa_pNum = startPlane;
|
||||
if (DBSrPaintArea((Tile *) NULL,
|
||||
def->cd_planes[startPlane], startArea, mask,
|
||||
dbSrConnectStartFunc, PTR2CD(&startTile)) != 0) break;
|
||||
dbSrConnectStartFunc, PTR2CD(&tad)) != 0) break;
|
||||
}
|
||||
if (startTile == NULL) return 0;
|
||||
if (tad.tad_tile == NULL) return 0;
|
||||
/* The following lets us call DBSrConnect recursively */
|
||||
else if (startTile->ti_client == (ClientData)1) return 0;
|
||||
else if (tad.tad_tile->ti_client == (ClientData)1) return 0;
|
||||
|
||||
/* Pass 1. During this pass the client function gets called. */
|
||||
|
||||
|
|
@ -397,7 +401,7 @@ DBSrConnectOnePass(def, startArea, mask, connect, bounds, func, clientData)
|
|||
csa.csa_clientDefault = CLIENTDEFAULT;
|
||||
csa.csa_clear = FALSE;
|
||||
csa.csa_connect = connect;
|
||||
if (dbSrConnectFunc(startTile, PTR2CD(&csa)) != 0) result = 1;
|
||||
if (dbSrConnectFunc(tad.tad_tile, tad.tad_dinfo, PTR2CD(&csa)) != 0) result = 1;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -420,12 +424,15 @@ DBSrConnectOnePass(def, startArea, mask, connect, bounds, func, clientData)
|
|||
*/
|
||||
|
||||
int
|
||||
dbcFindTileFunc(tile, arg)
|
||||
dbcFindTileFunc(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData arg;
|
||||
{
|
||||
Tile **tptr = (Tile **)arg;
|
||||
*tptr = tile;
|
||||
TileAndDinfo *tad = (TileAndDinfo *)arg;
|
||||
|
||||
tad->tad_tile = tile;
|
||||
tad->tad_dinfo = dinfo;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -465,6 +472,7 @@ dbcFindTileFunc(tile, arg)
|
|||
int
|
||||
dbSrConnectFunc(
|
||||
Tile *tile, /* Tile that is connected. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
ClientData cdata) /* Contains information about the search. */
|
||||
/* (struct conSrArg *csa) */
|
||||
{
|
||||
|
|
@ -484,11 +492,13 @@ dbSrConnectFunc(
|
|||
/* Drop the first entry on the stack */
|
||||
pNum = csa->csa_pNum;
|
||||
STACKPUSH(INT2CD(tile), dbConnectStack);
|
||||
STACKPUSH(INT2CD(dinfo), dbConnectStack);
|
||||
STACKPUSH(INT2CD(pNum), dbConnectStack);
|
||||
|
||||
while (!StackEmpty(dbConnectStack))
|
||||
{
|
||||
pNum = (int)CD2INT(STACKPOP(dbConnectStack));
|
||||
dinfo = (int)CD2INT(STACKPOP(dbConnectStack));
|
||||
tile = (Tile *)CD2INT(STACKPOP(dbConnectStack));
|
||||
if (result == 1) continue;
|
||||
|
||||
|
|
@ -522,7 +532,7 @@ dbSrConnectFunc(
|
|||
|
||||
if (callClient && (csa->csa_clientFunc != NULL))
|
||||
{
|
||||
if ((*csa->csa_clientFunc)(tile, pNum, csa->csa_clientData) != 0)
|
||||
if ((*csa->csa_clientFunc)(tile, dinfo, pNum, csa->csa_clientData) != 0)
|
||||
{
|
||||
result = 1;
|
||||
continue;
|
||||
|
|
@ -536,7 +546,7 @@ dbSrConnectFunc(
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
if (SplitSide(tile))
|
||||
if (dinfo & TT_SIDE)
|
||||
loctype = SplitRightType(tile);
|
||||
else
|
||||
loctype = SplitLeftType(tile);
|
||||
|
|
@ -547,7 +557,7 @@ dbSrConnectFunc(
|
|||
|
||||
/* Left side: */
|
||||
|
||||
if (IsSplit(tile) && SplitSide(tile)) goto bottomside;
|
||||
if (IsSplit(tile) && (dinfo & TT_SIDE)) goto bottomside;
|
||||
|
||||
for (t2 = BL(tile); BOTTOM(t2) < tileArea.r_ytop; t2 = RT(t2))
|
||||
{
|
||||
|
|
@ -564,9 +574,11 @@ dbSrConnectFunc(
|
|||
if (t2->ti_client == csa->csa_clientDefault) continue;
|
||||
}
|
||||
else if (t2->ti_client == (ClientData) 1) continue;
|
||||
if (IsSplit(t2))
|
||||
TiSetBody(t2, INT2CD(CD2INT(t2->ti_body) | TT_SIDE)); /* bit set */
|
||||
STACKPUSH(INT2CD(t2), dbConnectStack);
|
||||
if (IsSplit(t2))
|
||||
STACKPUSH(INT2CD((TileType)TT_SIDE), dbConnectStack);
|
||||
else
|
||||
STACKPUSH(INT2CD(0), dbConnectStack);
|
||||
STACKPUSH(INT2CD(pNum), dbConnectStack);
|
||||
}
|
||||
}
|
||||
|
|
@ -574,7 +586,7 @@ dbSrConnectFunc(
|
|||
/* Bottom side: */
|
||||
|
||||
bottomside:
|
||||
if (IsSplit(tile) && (!(SplitSide(tile) ^ SplitDirection(tile))))
|
||||
if (IsSplit(tile) && ((!((dinfo & TT_SIDE) ? 1 : 0)) ^ SplitDirection(tile)))
|
||||
goto rightside;
|
||||
|
||||
for (t2 = LB(tile); LEFT(t2) < tileArea.r_xtop; t2 = TR(t2))
|
||||
|
|
@ -592,16 +604,17 @@ bottomside:
|
|||
if (t2->ti_client == csa->csa_clientDefault) continue;
|
||||
}
|
||||
else if (t2->ti_client == (ClientData) 1) continue;
|
||||
STACKPUSH(INT2CD(t2), dbConnectStack);
|
||||
if (IsSplit(t2))
|
||||
{
|
||||
if (SplitDirection(t2))
|
||||
/* bit set */
|
||||
TiSetBody(t2, INT2CD(CD2INT(t2->ti_body) | TT_SIDE));
|
||||
STACKPUSH(INT2CD((TileType)TT_SIDE), dbConnectStack);
|
||||
else
|
||||
/* bit clear */
|
||||
TiSetBody(t2, INT2CD(CD2INT(t2->ti_body) & ~TT_SIDE));
|
||||
STACKPUSH(INT2CD(0), dbConnectStack);
|
||||
}
|
||||
STACKPUSH(INT2CD(t2), dbConnectStack);
|
||||
else
|
||||
STACKPUSH(INT2CD(0), dbConnectStack);
|
||||
STACKPUSH(INT2CD(pNum), dbConnectStack);
|
||||
}
|
||||
}
|
||||
|
|
@ -609,7 +622,7 @@ bottomside:
|
|||
/* Right side: */
|
||||
|
||||
rightside:
|
||||
if (IsSplit(tile) && !SplitSide(tile)) goto topside;
|
||||
if (IsSplit(tile) && !(dinfo & TT_SIDE)) goto topside;
|
||||
|
||||
for (t2 = TR(tile); ; t2 = LB(t2))
|
||||
{
|
||||
|
|
@ -626,9 +639,8 @@ rightside:
|
|||
if (t2->ti_client == csa->csa_clientDefault) goto nextRight;
|
||||
}
|
||||
else if (t2->ti_client == (ClientData) 1) goto nextRight;
|
||||
if (IsSplit(t2))
|
||||
TiSetBody(t2, INT2CD(CD2INT(t2->ti_body) & ~TT_SIDE)); /* bit clear */
|
||||
STACKPUSH(INT2CD(t2), dbConnectStack);
|
||||
STACKPUSH(INT2CD(0), dbConnectStack);
|
||||
STACKPUSH(INT2CD(pNum), dbConnectStack);
|
||||
}
|
||||
nextRight: if (BOTTOM(t2) <= tileArea.r_ybot) break;
|
||||
|
|
@ -637,7 +649,8 @@ rightside:
|
|||
/* Top side: */
|
||||
topside:
|
||||
|
||||
if (IsSplit(tile) && (SplitSide(tile) ^ SplitDirection(tile))) goto donesides;
|
||||
if (IsSplit(tile) && (((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
|
||||
goto donesides;
|
||||
|
||||
for (t2 = RT(tile); ; t2 = BL(t2))
|
||||
{
|
||||
|
|
@ -654,16 +667,18 @@ topside:
|
|||
if (t2->ti_client == csa->csa_clientDefault) goto nextTop;
|
||||
}
|
||||
else if (t2->ti_client == (ClientData) 1) goto nextTop;
|
||||
STACKPUSH(INT2CD(t2), dbConnectStack);
|
||||
if (IsSplit(t2))
|
||||
{
|
||||
if (SplitDirection(t2))
|
||||
/* bit clear */
|
||||
TiSetBody(t2, INT2CD(CD2INT(t2->ti_body) & ~TT_SIDE));
|
||||
STACKPUSH(INT2CD(0), dbConnectStack);
|
||||
else
|
||||
/* bit set */
|
||||
TiSetBody(t2, INT2CD(CD2INT(t2->ti_body) | TT_SIDE));
|
||||
STACKPUSH(INT2CD((TileType)TT_SIDE), dbConnectStack);
|
||||
}
|
||||
STACKPUSH(INT2CD(t2), dbConnectStack);
|
||||
else
|
||||
STACKPUSH(INT2CD(0), dbConnectStack);
|
||||
STACKPUSH(INT2CD(pNum), dbConnectStack);
|
||||
}
|
||||
nextTop: if (LEFT(t2) <= tileArea.r_xbot) break;
|
||||
|
|
@ -682,6 +697,7 @@ donesides:
|
|||
{
|
||||
Rect newArea;
|
||||
GEO_EXPAND(&tileArea, 1, &newArea);
|
||||
TileAndDinfo tad;
|
||||
|
||||
for (i = PL_TECHDEPBASE; i < DBNumPlanes; i++)
|
||||
{
|
||||
|
|
@ -690,17 +706,19 @@ donesides:
|
|||
{
|
||||
if (DBSrPaintNMArea((Tile *) NULL, csa->csa_def->cd_planes[i],
|
||||
TiGetTypeExact(tile), &newArea, connectMask,
|
||||
dbcFindTileFunc, (ClientData)&t2) != 0)
|
||||
dbcFindTileFunc, (ClientData)&tad) != 0)
|
||||
{
|
||||
STACKPUSH(INT2CD(t2), dbConnectStack);
|
||||
STACKPUSH(PTR2CD(tad.tad_tile), dbConnectStack);
|
||||
STACKPUSH(INT2CD(tad.tad_dinfo), dbConnectStack);
|
||||
STACKPUSH(INT2CD(i), dbConnectStack);
|
||||
}
|
||||
}
|
||||
else if (DBSrPaintArea((Tile *) NULL, csa->csa_def->cd_planes[i],
|
||||
&newArea, connectMask, dbcFindTileFunc,
|
||||
(ClientData)&t2) != 0)
|
||||
(ClientData)&tad) != 0)
|
||||
{
|
||||
STACKPUSH(INT2CD(t2), dbConnectStack);
|
||||
STACKPUSH(PTR2CD(tad.tad_tile), dbConnectStack);
|
||||
STACKPUSH(INT2CD(tad.tad_dinfo), dbConnectStack);
|
||||
STACKPUSH(INT2CD(i), dbConnectStack);
|
||||
}
|
||||
}
|
||||
|
|
@ -734,9 +752,10 @@ donesides:
|
|||
/** @typedef cb_database_srpaintnmarea_t */
|
||||
/** @typedef cb_database_srpaintarea_t */
|
||||
int
|
||||
dbcUnconnectFunc(tile, clientData)
|
||||
dbcUnconnectFunc(tile, dinfo, clientData)
|
||||
Tile *tile; /* Current tile */
|
||||
ClientData clientData; /* Unused. */
|
||||
TileType dinfo; /* Split tile information, unused */
|
||||
ClientData clientData; /* Unused. */
|
||||
|
||||
{
|
||||
return 1;
|
||||
|
|
@ -949,8 +968,9 @@ dbcConnectLabelFunc(scx, lab, tpath, csa2)
|
|||
*/
|
||||
|
||||
int
|
||||
dbcConnectFunc(tile, cx)
|
||||
dbcConnectFunc(tile, dinfo, cx)
|
||||
Tile *tile; /* Tile found. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cx; /* Describes context of search. The client
|
||||
* data is a pointer to a conSrArg2 record
|
||||
* containing various required information.
|
||||
|
|
@ -963,8 +983,8 @@ dbcConnectFunc(tile, cx)
|
|||
Rect *srArea;
|
||||
SearchContext *scx = cx->tc_scx;
|
||||
SearchContext scx2;
|
||||
TileType loctype = TiGetTypeExact(tile);
|
||||
TileType dinfo = 0;
|
||||
TileType loctype = TiGetTypeExact(tile) | dinfo;
|
||||
TileType newdinfo = 0;
|
||||
int retval, i, pNum = cx->tc_plane;
|
||||
CellDef *def;
|
||||
|
||||
|
|
@ -996,8 +1016,8 @@ dbcConnectFunc(tile, cx)
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
dinfo = DBTransformDiagonal(loctype, &scx->scx_trans);
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
newdinfo = DBTransformDiagonal(loctype, &scx->scx_trans);
|
||||
loctype = ((dinfo & TT_SIDE)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
}
|
||||
|
||||
/* See if the destination cell contains stuff over the whole
|
||||
|
|
@ -1035,7 +1055,7 @@ dbcConnectFunc(tile, cx)
|
|||
def = csa2->csa2_use->cu_def;
|
||||
retval = 1;
|
||||
if (DBSrPaintNMArea((Tile *) NULL, def->cd_planes[pNum],
|
||||
dinfo, &newarea, ¬ConnectMask, dbcUnconnectFunc,
|
||||
newdinfo, &newarea, ¬ConnectMask, dbcUnconnectFunc,
|
||||
(ClientData) NULL) == 0)
|
||||
retval = 0;
|
||||
|
||||
|
|
@ -1044,7 +1064,7 @@ dbcConnectFunc(tile, cx)
|
|||
* the storage for the current list element.
|
||||
*/
|
||||
|
||||
DBNMPaintPlane(def->cd_planes[pNum], dinfo,
|
||||
DBNMPaintPlane(def->cd_planes[pNum], newdinfo,
|
||||
&newarea, DBStdPaintTbl(loctype, pNum),
|
||||
(PaintUndoInfo *) NULL);
|
||||
|
||||
|
|
@ -1061,14 +1081,14 @@ dbcConnectFunc(tile, cx)
|
|||
|
||||
/* Only extend those sides bordering the diagonal tile */
|
||||
|
||||
if (dinfo & TT_DIAGONAL)
|
||||
if (newdinfo & TT_DIAGONAL)
|
||||
{
|
||||
if (dinfo & TT_SIDE) /* right */
|
||||
if (newdinfo & TT_SIDE) /* right */
|
||||
newarea.r_xtop += 1;
|
||||
else /* left */
|
||||
newarea.r_xbot -= 1;
|
||||
if (((dinfo & TT_SIDE) >> 1)
|
||||
== (dinfo & TT_DIRECTION)) /* top */
|
||||
if (((newdinfo & TT_SIDE) >> 1)
|
||||
== (newdinfo & TT_DIRECTION)) /* top */
|
||||
newarea.r_ytop += 1;
|
||||
else /* bottom */
|
||||
newarea.r_ybot -= 1;
|
||||
|
|
@ -1108,7 +1128,7 @@ dbcConnectFunc(tile, cx)
|
|||
|
||||
csa2->csa2_list[csa2->csa2_top].area = newarea;
|
||||
csa2->csa2_list[csa2->csa2_top].connectMask = connectMask;
|
||||
csa2->csa2_list[csa2->csa2_top].dinfo = dinfo;
|
||||
csa2->csa2_list[csa2->csa2_top].dinfo = newdinfo;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3228,8 +3228,9 @@ DBCellFindScale(cellDef)
|
|||
}
|
||||
|
||||
int
|
||||
dbFindGCFFunc(tile, ggcf)
|
||||
dbFindGCFFunc(tile, dinfo, ggcf)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
int *ggcf;
|
||||
{
|
||||
Rect r;
|
||||
|
|
@ -4218,8 +4219,9 @@ ioerror:
|
|||
*/
|
||||
|
||||
int
|
||||
dbWritePaintCommandsFunc(tile, cdarg)
|
||||
dbWritePaintCommandsFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData cdarg;
|
||||
{
|
||||
char pstring[256];
|
||||
|
|
@ -4242,7 +4244,7 @@ dbWritePaintCommandsFunc(tile, cdarg)
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
diridx = (SplitDirection(tile) << 1) + SplitSide(tile);
|
||||
diridx = (SplitDirection(tile) << 1) + ((dinfo & TT_SIDE) ? 1 : 0);
|
||||
|
||||
fprintf(f, "box values %d %d %d %d\n",
|
||||
LEFT(tile), BOTTOM(tile), RIGHT(tile), TOP(tile));
|
||||
|
|
@ -4707,8 +4709,9 @@ cleanup:
|
|||
*/
|
||||
|
||||
int
|
||||
dbWritePaintFunc(tile, cdarg)
|
||||
dbWritePaintFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData cdarg;
|
||||
{
|
||||
char pstring[256];
|
||||
|
|
@ -4770,7 +4773,7 @@ dbWritePaintFunc(tile, cdarg)
|
|||
sprintf(pstring, "rect %d %d %d %d\n",
|
||||
LEFT(tile) / arg->wa_reducer, BOTTOM(tile) / arg->wa_reducer,
|
||||
RIGHT(tile) / arg->wa_reducer, TOP(tile) / arg->wa_reducer);
|
||||
FPUTSR(arg->wa_file,pstring);
|
||||
FPUTSR(arg->wa_file, pstring);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -583,8 +583,9 @@ DBReOrientLabel(cellDef, area, newPos)
|
|||
*/
|
||||
|
||||
int
|
||||
dbGetLabelArea(tile, area)
|
||||
dbGetLabelArea(tile, dinfo, area)
|
||||
Tile *tile; /* Tile found. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
Rect *area; /* Area to be modified. */
|
||||
{
|
||||
Rect r;
|
||||
|
|
@ -1085,14 +1086,15 @@ DBPickLabelLayer(def, lab, doCalma)
|
|||
*/
|
||||
|
||||
int
|
||||
dbPickFunc1(tile, mask)
|
||||
dbPickFunc1(tile, dinfo, mask)
|
||||
Tile *tile; /* Tile found. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TileTypeBitMask *mask; /* Mask to be modified. */
|
||||
{
|
||||
TileType type;
|
||||
|
||||
if (IsSplit(tile))
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
else
|
||||
type = TiGetType(tile);
|
||||
|
||||
|
|
@ -1111,15 +1113,16 @@ dbPickFunc1(tile, mask)
|
|||
*/
|
||||
|
||||
int
|
||||
dbPickFunc2(tile, mask)
|
||||
dbPickFunc2(tile, dinfo, mask)
|
||||
Tile *tile; /* Tile found. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TileTypeBitMask *mask; /* Mask to be modified. */
|
||||
{
|
||||
TileType type;
|
||||
TileTypeBitMask tmp, *rMask;
|
||||
|
||||
if (IsSplit(tile))
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
else
|
||||
type = TiGetType(tile);
|
||||
|
||||
|
|
|
|||
|
|
@ -1820,14 +1820,15 @@ nextrect:
|
|||
*/
|
||||
|
||||
int
|
||||
dbNMEnumFunc(tile, arg)
|
||||
dbNMEnumFunc(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
LinkedRect **arg;
|
||||
{
|
||||
LinkedRect *lr;
|
||||
|
||||
/* Ignore the second call to any diagonal---only count once! */
|
||||
if (IsSplit(tile) && SplitSide(tile)) return 0;
|
||||
if (IsSplit(tile) && (dinfo & TT_SIDE)) return 0;
|
||||
|
||||
lr = (LinkedRect *) mallocMagic(sizeof(LinkedRect));
|
||||
TiToRect(tile, &lr->r_r);
|
||||
|
|
|
|||
|
|
@ -119,8 +119,9 @@ DBPaint (cellDef, rect, type)
|
|||
*/
|
||||
|
||||
int
|
||||
dbResolveImages(tile, cellDef)
|
||||
dbResolveImages(tile, dinfo, cellDef)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
CellDef *cellDef;
|
||||
{
|
||||
Rect rect;
|
||||
|
|
@ -130,7 +131,7 @@ dbResolveImages(tile, cellDef)
|
|||
/* Recursive call back to DBPaint---this will ensure that */
|
||||
/* all of the planes of the image type are painted. */
|
||||
|
||||
DBPaint(cellDef, &rect, TiGetTypeExact(tile));
|
||||
DBPaint(cellDef, &rect, TiGetTypeExact(tile) | dinfo);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ int dbCheckMaxHFunc(), dbCheckMaxVFunc();
|
|||
* int
|
||||
* func(tile, cdata)
|
||||
* Tile *tile;
|
||||
* TileType dinfo;
|
||||
* ClientData cdata;
|
||||
* {
|
||||
* }
|
||||
|
|
@ -266,17 +267,15 @@ nm_enum:
|
|||
|
||||
if (!(ignore_sides & IGNORE_LEFT))
|
||||
{
|
||||
TiSetBody(tp, INT2CD(tpt & ~TT_SIDE)); /* bit clear */
|
||||
if ((*func)(tp, arg)) return (1);
|
||||
if ((*func)(tp, (TileType)TT_DIAGONAL, arg)) return (1);
|
||||
}
|
||||
if (!(ignore_sides & IGNORE_RIGHT))
|
||||
{
|
||||
TiSetBody(tp, INT2CD(tpt | TT_SIDE)); /* bit set */
|
||||
if ((*func)(tp, arg)) return (1);
|
||||
if ((*func)(tp, (TileType)TT_DIAGONAL | TT_SIDE, arg)) return (1);
|
||||
}
|
||||
}
|
||||
else
|
||||
if (TTMaskHasType(mask, TiGetType(tp)) && (*func)(tp, arg))
|
||||
if (TTMaskHasType(mask, TiGetType(tp)) && (*func)(tp, (TileType)0, arg))
|
||||
return (1);
|
||||
|
||||
enum_next:
|
||||
|
|
@ -325,6 +324,7 @@ enum_next:
|
|||
* int
|
||||
* func(tile, cdata)
|
||||
* Tile *tile;
|
||||
* TileType dinfo;
|
||||
* ClientData cdata;
|
||||
* {
|
||||
* }
|
||||
|
|
@ -416,9 +416,7 @@ enumerate:
|
|||
(dlong)(rect->r_xbot - LEFT(tp)) * theight : DLONG_MIN;
|
||||
if (SplitDirection(tp) ? (f1 > f4) : (f2 > f4))
|
||||
{
|
||||
TiSetBody(tp, INT2CD((TileType)CD2INT(TiGetBody(tp))
|
||||
& ~TT_SIDE)); /* bit clear */
|
||||
if ((*func)(tp, arg)) return (1);
|
||||
if ((*func)(tp, (TileType)TT_DIAGONAL, arg)) return (1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -429,14 +427,12 @@ enumerate:
|
|||
(dlong)(RIGHT(tp) - rect->r_xtop) * theight : DLONG_MIN;
|
||||
if (SplitDirection(tp) ? (f2 > f3) : (f1 > f3))
|
||||
{
|
||||
TiSetBody(tp, INT2CD((TileType)CD2INT(TiGetBody(tp))
|
||||
| TT_SIDE)); /* bit set */
|
||||
if ((*func)(tp, arg)) return (1);
|
||||
if ((*func)(tp, (TileType)TT_DIAGONAL | TT_SIDE, arg)) return (1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if (TTMaskHasType(mask, TiGetType(tp)) && (*func)(tp, arg))
|
||||
if (TTMaskHasType(mask, TiGetType(tp)) && (*func)(tp, (TileType)0, arg))
|
||||
return (1);
|
||||
|
||||
tpnew = TR(tp);
|
||||
|
|
@ -485,6 +481,7 @@ enumerate:
|
|||
* int
|
||||
* func(tile, cdata)
|
||||
* Tile *tile;
|
||||
* TileType dinfo;
|
||||
* ClientData cdata;
|
||||
* {
|
||||
* }
|
||||
|
|
@ -576,9 +573,7 @@ enumerate:
|
|||
(dlong)(rect->r_xbot - LEFT(tp)) * (dlong)theight : DLONG_MIN;
|
||||
if (SplitDirection(tp) ? (f1 > f4) : (f2 > f4))
|
||||
{
|
||||
TiSetBody(tp, INT2CD((TileType)CD2INT(TiGetBody(tp))
|
||||
& ~TT_SIDE)); /* bit clear */
|
||||
if ((tp->ti_client == client) && (*func)(tp, arg))
|
||||
if ((tp->ti_client == client) && (*func)(tp, (TileType)TT_DIAGONAL, arg))
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
|
|
@ -590,16 +585,15 @@ enumerate:
|
|||
(dlong)(RIGHT(tp) - rect->r_xtop) * (dlong)theight : DLONG_MIN;
|
||||
if (SplitDirection(tp) ? (f2 > f3) : (f1 > f3))
|
||||
{
|
||||
TiSetBody(tp, INT2CD((TileType)CD2INT(TiGetBody(tp))
|
||||
| TT_SIDE)); /* bit set */
|
||||
if ((tp->ti_client == client) && (*func)(tp, arg))
|
||||
if ((tp->ti_client == client) && (*func)(tp, (TileType)TT_DIAGONAL
|
||||
| TT_SIDE, arg))
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if (TTMaskHasType(mask, TiGetType(tp)) && tp->ti_client == client
|
||||
&& (*func)(tp, arg))
|
||||
&& (*func)(tp, (TileType)0, arg))
|
||||
return (1);
|
||||
|
||||
tpnew = TR(tp);
|
||||
|
|
@ -918,8 +912,9 @@ DBCheckMaxHStrips(plane, area, proc, cdata)
|
|||
*/
|
||||
|
||||
int
|
||||
dbCheckMaxHFunc(tile, dbc)
|
||||
dbCheckMaxHFunc(tile, dinfo, dbc)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
struct dbCheck *dbc;
|
||||
{
|
||||
Tile *tp;
|
||||
|
|
@ -1010,8 +1005,9 @@ DBCheckMaxVStrips(plane, area, proc, cdata)
|
|||
*/
|
||||
|
||||
int
|
||||
dbCheckMaxVFunc(tile, dbc)
|
||||
dbCheckMaxVFunc(tile, dinfo, dbc)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
struct dbCheck *dbc;
|
||||
{
|
||||
Tile *tp;
|
||||
|
|
|
|||
|
|
@ -551,6 +551,15 @@ typedef struct diag_info
|
|||
bool side;
|
||||
} DiagInfo;
|
||||
|
||||
/* Where search functions need to return a Tile pointer and tile split */
|
||||
/* information, use this structure. */
|
||||
|
||||
typedef struct tile_and_dinfo
|
||||
{
|
||||
Tile *tad_tile;
|
||||
TileType tad_dinfo;
|
||||
} TileAndDinfo;
|
||||
|
||||
/* This would normally go in geometry.h except that it uses TileType. */
|
||||
/* Used in selOps.c but also passed back to CmdRS.c for select command. */
|
||||
|
||||
|
|
@ -920,9 +929,9 @@ extern int DBArraySr();
|
|||
extern bool DBNearestLabel();
|
||||
extern int DBSrLabelLoc();
|
||||
extern TileType DBTransformDiagonal();
|
||||
extern int dbcUnconnectFunc(Tile *tile, ClientData clientData); /* (notused) */
|
||||
extern int dbSrConnectFunc(Tile *tile, ClientData clientData); /* (struct conSrArg *csa) */
|
||||
extern int dbSrConnectStartFunc(Tile *tile, ClientData clientData); /* cb_database_srpaintarea_t (Tile **pTile) */
|
||||
extern int dbcUnconnectFunc(Tile *tile, TileType dinfo, ClientData clientData); /* (notused) */
|
||||
extern int dbSrConnectFunc(Tile *tile, TileType dinfo, ClientData clientData); /* (struct conSrArg *csa) */
|
||||
extern int dbSrConnectStartFunc(Tile *tile, TileType dinfo, ClientData clientData); /* cb_database_srpaintarea_t (Tile **pTile) */
|
||||
|
||||
/* C99 compat */
|
||||
extern void DBEraseValid();
|
||||
|
|
|
|||
|
|
@ -571,8 +571,9 @@ DBWredisplay(w, rootArea, clipArea)
|
|||
*/
|
||||
|
||||
int
|
||||
dbwPaintFunc(tile, cxp)
|
||||
Tile *tile; /* Tile to be redisplayed. */
|
||||
dbwPaintFunc(tile, dinfo, cxp)
|
||||
Tile *tile; /* Tile to be redisplayed. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* From DBTreeSrTiles */
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -652,7 +653,7 @@ dbwPaintFunc(tile, cxp)
|
|||
/* whether to render the outline with a fast rectangle- */
|
||||
/* drawing routine or to render it segment by segment. */
|
||||
|
||||
GrBox(dbwWindow, &scx->scx_trans, tile);
|
||||
GrBox(dbwWindow, &scx->scx_trans, tile, dinfo);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1075,8 +1076,10 @@ dbwBBoxFunc(scx)
|
|||
*/
|
||||
|
||||
int
|
||||
dbwTileFunc(tile)
|
||||
dbwTileFunc(tile, dinfo, clientdata)
|
||||
Tile *tile; /* A tile to be redisplayed. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
Rect r, r2;
|
||||
int xoffset, yoffset;
|
||||
|
|
@ -1113,7 +1116,7 @@ dbwTileFunc(tile)
|
|||
|
||||
if (dbwSeeTypes)
|
||||
{
|
||||
(void) sprintf(string, "%s",DBTypeShortName(TiGetType(tile)));
|
||||
(void) sprintf(string, "%s", DBTypeShortName(TiGetType(tile)));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1129,7 +1132,7 @@ dbwTileFunc(tile)
|
|||
|
||||
#define XYOFFSET 12
|
||||
|
||||
for (i=0; i<4; i++)
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
xoffset = 0;
|
||||
yoffset = 0;
|
||||
|
|
@ -1172,13 +1175,13 @@ dbwTileFunc(tile)
|
|||
yoffset = temp;
|
||||
}
|
||||
|
||||
if ( (dbwWatchTrans.t_a < 0) || (dbwWatchTrans.t_b < 0) )
|
||||
if ((dbwWatchTrans.t_a < 0) || (dbwWatchTrans.t_b < 0))
|
||||
{
|
||||
/* mirror in x */
|
||||
xoffset = -xoffset;
|
||||
}
|
||||
|
||||
if ( (dbwWatchTrans.t_d < 0) || (dbwWatchTrans.t_e < 0) )
|
||||
if ((dbwWatchTrans.t_d < 0) || (dbwWatchTrans.t_e < 0))
|
||||
{
|
||||
/* mirror in y */
|
||||
yoffset = -yoffset;
|
||||
|
|
|
|||
|
|
@ -249,7 +249,10 @@ DBWFeedbackRedraw(window, plane)
|
|||
}
|
||||
|
||||
int
|
||||
dbwFeedbackAlways1()
|
||||
dbwFeedbackAlways1(
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -392,8 +392,9 @@ DBWHLRedrawWind(window)
|
|||
*/
|
||||
|
||||
int
|
||||
dbwhlEraseFunc(tile, window)
|
||||
dbwhlEraseFunc(tile, dinfo, window)
|
||||
Tile *tile; /* Tile describing area to be erased. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
MagWindow *window; /* Window that is being altered. */
|
||||
{
|
||||
Rect area;
|
||||
|
|
|
|||
|
|
@ -764,7 +764,10 @@ DBWDrawBox(window, plane)
|
|||
}
|
||||
|
||||
int
|
||||
dbwBoxAlways1()
|
||||
dbwBoxAlways1(
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,8 +140,9 @@ drcCifPointToSegment(px, py, s1x, s1y, s2x, s2y)
|
|||
*/
|
||||
|
||||
int
|
||||
areaCheck(tile, arg)
|
||||
areaCheck(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
struct drcClientData *arg;
|
||||
{
|
||||
Rect rect; /* Area where error is to be recorded. */
|
||||
|
|
@ -195,7 +196,7 @@ areaCheck(tile, arg)
|
|||
- arg->dCD_constraint->r_ytop + sdist) >= 0)
|
||||
&& ((sqx * sqx + sqy * sqy) >= ssdist))
|
||||
return 0;
|
||||
else if (IsSplit(tile) && !SplitDirection(tile) && !SplitSide(tile))
|
||||
else if (IsSplit(tile) && !SplitDirection(tile) && !(dinfo & TT_SIDE))
|
||||
{
|
||||
sstest = drcCifPointToSegment(arg->dCD_constraint->r_xbot + sdist,
|
||||
arg->dCD_constraint->r_ytop - sdist,
|
||||
|
|
@ -210,7 +211,7 @@ areaCheck(tile, arg)
|
|||
- arg->dCD_constraint->r_ytop + sdist) >= 0)
|
||||
&& ((sqx * sqx + sqy * sqy) >= ssdist))
|
||||
return 0;
|
||||
else if (IsSplit(tile) && SplitDirection(tile) && SplitSide(tile))
|
||||
else if (IsSplit(tile) && SplitDirection(tile) && (dinfo & TT_SIDE))
|
||||
{
|
||||
sstest = drcCifPointToSegment(arg->dCD_constraint->r_xtop - sdist,
|
||||
arg->dCD_constraint->r_ytop - sdist,
|
||||
|
|
@ -226,7 +227,7 @@ areaCheck(tile, arg)
|
|||
+ sdist - rect.r_ytop) >= 0)
|
||||
&& ((sqx * sqx + sqy * sqy) >= ssdist))
|
||||
return 0;
|
||||
else if (IsSplit(tile) && SplitDirection(tile) && !SplitSide(tile))
|
||||
else if (IsSplit(tile) && SplitDirection(tile) && !(dinfo & TT_SIDE))
|
||||
{
|
||||
sstest = drcCifPointToSegment(arg->dCD_constraint->r_xbot + sdist,
|
||||
arg->dCD_constraint->r_ybot + sdist,
|
||||
|
|
@ -242,7 +243,7 @@ areaCheck(tile, arg)
|
|||
+ sdist - rect.r_ytop) >= 0)
|
||||
&& ((sqx * sqx + sqy * sqy) >= ssdist))
|
||||
return 0;
|
||||
else if (IsSplit(tile) && !SplitDirection(tile) && SplitSide(tile))
|
||||
else if (IsSplit(tile) && !SplitDirection(tile) && (dinfo & TT_SIDE))
|
||||
{
|
||||
sstest = drcCifPointToSegment(arg->dCD_constraint->r_xtop - sdist,
|
||||
arg->dCD_constraint->r_ybot + sdist,
|
||||
|
|
@ -306,8 +307,9 @@ areaCheck(tile, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
areaNMReject(tile, arg)
|
||||
areaNMReject(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData *arg;
|
||||
{
|
||||
Tile *checktile = (Tile *)arg;
|
||||
|
|
@ -337,8 +339,9 @@ areaNMReject(tile, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
areaNMCheck(tile, arg)
|
||||
areaNMCheck(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
struct drcClientData *arg;
|
||||
{
|
||||
Rect rect; /* Area where error is to be recorded. */
|
||||
|
|
@ -492,8 +495,9 @@ DRCBasicCheck (celldef, checkRect, clipRect, function, cdata)
|
|||
*/
|
||||
|
||||
int
|
||||
drcTile (tile, arg)
|
||||
Tile *tile; /* Tile being examined */
|
||||
drcTile (tile, dinfo, arg)
|
||||
Tile *tile; /* Tile being examined */
|
||||
TileType dinfo; /* Split tile information */
|
||||
struct drcClientData *arg;
|
||||
{
|
||||
DRCCookie *cptr; /* Current design rule on list */
|
||||
|
|
@ -533,7 +537,7 @@ drcTile (tile, arg)
|
|||
/* DRC searches only one direction on regular tiles, the split */
|
||||
/* tiles are only processed for one of the two cases. */
|
||||
|
||||
if (IsSplit(tile) && !SplitSide(tile))
|
||||
if (IsSplit(tile) && !(dinfo & TT_SIDE))
|
||||
{
|
||||
int deltax, deltay;
|
||||
TileType tt, to;
|
||||
|
|
@ -555,7 +559,7 @@ drcTile (tile, arg)
|
|||
{
|
||||
int deltax, deltay, w, h;
|
||||
double r;
|
||||
TileType dinfo, dsplit;
|
||||
TileType newdinfo, dsplit;
|
||||
|
||||
/* Work to be done: Handle triggering rules for non-Manhattan */
|
||||
/* edges; especially important for the wide-spacing rule. */
|
||||
|
|
@ -605,7 +609,7 @@ drcTile (tile, arg)
|
|||
|
||||
if (SplitDirection(tile) == 0) deltay = -deltay;
|
||||
|
||||
dinfo = TiGetTypeExact(tile) & (TT_DIAGONAL | TT_DIRECTION);
|
||||
newdinfo = TiGetTypeExact(tile) & (TT_DIAGONAL | TT_DIRECTION);
|
||||
if (!(cptr->drcc_flags & DRC_REVERSE))
|
||||
{
|
||||
/* Forward case is behind the triangle */
|
||||
|
|
@ -613,19 +617,19 @@ drcTile (tile, arg)
|
|||
deltay = -deltay;
|
||||
|
||||
/* Split side changes in the reverse case */
|
||||
dinfo |= TT_SIDE;
|
||||
newdinfo |= TT_SIDE;
|
||||
}
|
||||
|
||||
/* The area to check is bounded between the diagonals of
|
||||
* tile and errRect (which is the tile area, offset).
|
||||
* Pass errRect and dinfo to areaNMCheck using the
|
||||
* Pass errRect and newdinfo to areaNMCheck using the
|
||||
* ClientData structure arg->dCD_rlist and arg->dCD_entries,
|
||||
* which are not used by areaNMCheck.
|
||||
*/
|
||||
arg->dCD_rlist = (Rect *)mallocMagic(sizeof(Rect));
|
||||
*(arg->dCD_rlist) = errRect;
|
||||
arg->dCD_entries = dinfo;
|
||||
if (dinfo & TT_SIDE)
|
||||
arg->dCD_entries = newdinfo;
|
||||
if (newdinfo & TT_SIDE)
|
||||
arg->dCD_entries &= ~TT_SIDE;
|
||||
else
|
||||
arg->dCD_entries |= TT_SIDE;
|
||||
|
|
@ -637,7 +641,7 @@ drcTile (tile, arg)
|
|||
errRect.r_ytop += deltay;
|
||||
|
||||
DBSrPaintNMArea((Tile *) NULL,
|
||||
arg->dCD_celldef->cd_planes[cptr->drcc_plane], dinfo,
|
||||
arg->dCD_celldef->cd_planes[cptr->drcc_plane], newdinfo,
|
||||
&errRect, &tmpMask, areaNMCheck, (ClientData) arg);
|
||||
|
||||
arg->dCD_entries = 0;
|
||||
|
|
|
|||
20
drc/DRCcif.c
20
drc/DRCcif.c
|
|
@ -603,8 +603,9 @@ drcCifCheck(arg)
|
|||
*/
|
||||
|
||||
int
|
||||
drcCifTile (tile, arg)
|
||||
Tile *tile; /* Tile being examined */
|
||||
drcCifTile (tile, dinfo, arg)
|
||||
Tile *tile; /* Tile being examined */
|
||||
TileType dinfo; /* Split tile information */
|
||||
struct drcClientData *arg;
|
||||
{
|
||||
DRCCookie *cptr; /* Current design rule on list */
|
||||
|
|
@ -628,7 +629,7 @@ drcCifTile (tile, arg)
|
|||
/* check. */
|
||||
|
||||
if (IsSplit(tile))
|
||||
if (SplitSide(tile))
|
||||
if (dinfo & TT_SIDE)
|
||||
goto tbcheck;
|
||||
|
||||
/*
|
||||
|
|
@ -826,7 +827,7 @@ tbcheck:
|
|||
/* bottom check. */
|
||||
|
||||
if (IsSplit(tile))
|
||||
if (SplitSide(tile) == SplitDirection(tile))
|
||||
if (((dinfo & TT_SIDE) ? 1 : 0) == SplitDirection(tile))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
|
@ -1031,8 +1032,9 @@ tbcheck:
|
|||
*/
|
||||
|
||||
int
|
||||
areaCifCheck(tile, arg)
|
||||
areaCifCheck(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
struct drcClientData *arg;
|
||||
{
|
||||
Rect rect; /* Area where error is to be recorded. */
|
||||
|
|
@ -1085,7 +1087,7 @@ areaCifCheck(tile, arg)
|
|||
- arg->dCD_constraint->r_ytop + sdist) >= 0)
|
||||
&& ((sqx * sqx + sqy * sqy) >= ssdist))
|
||||
return 0;
|
||||
else if (IsSplit(tile) && !SplitDirection(tile) && !SplitSide(tile))
|
||||
else if (IsSplit(tile) && !SplitDirection(tile) && !(dinfo & TT_SIDE))
|
||||
{
|
||||
sstest = drcCifPointToSegment(arg->dCD_constraint->r_xbot + sdist,
|
||||
arg->dCD_constraint->r_ytop - sdist,
|
||||
|
|
@ -1100,7 +1102,7 @@ areaCifCheck(tile, arg)
|
|||
- arg->dCD_constraint->r_ytop + sdist) >= 0)
|
||||
&& ((sqx * sqx + sqy * sqy) >= ssdist))
|
||||
return 0;
|
||||
else if (IsSplit(tile) && SplitDirection(tile) && SplitSide(tile))
|
||||
else if (IsSplit(tile) && SplitDirection(tile) && (dinfo & TT_SIDE))
|
||||
{
|
||||
sstest = drcCifPointToSegment(arg->dCD_constraint->r_xtop - sdist,
|
||||
arg->dCD_constraint->r_ytop - sdist,
|
||||
|
|
@ -1116,7 +1118,7 @@ areaCifCheck(tile, arg)
|
|||
+ sdist - cifrect.r_ytop) >= 0)
|
||||
&& ((sqx * sqx + sqy * sqy) >= ssdist))
|
||||
return 0;
|
||||
else if (IsSplit(tile) && SplitDirection(tile) && !SplitSide(tile))
|
||||
else if (IsSplit(tile) && SplitDirection(tile) && !(dinfo & TT_SIDE))
|
||||
{
|
||||
sstest = drcCifPointToSegment(arg->dCD_constraint->r_xbot + sdist,
|
||||
arg->dCD_constraint->r_ybot + sdist,
|
||||
|
|
@ -1132,7 +1134,7 @@ areaCifCheck(tile, arg)
|
|||
+ sdist - cifrect.r_ytop) >= 0)
|
||||
&& ((sqx * sqx + sqy * sqy) >= ssdist))
|
||||
return 0;
|
||||
else if (IsSplit(tile) && !SplitDirection(tile) && SplitSide(tile))
|
||||
else if (IsSplit(tile) && !SplitDirection(tile) && (dinfo & TT_SIDE))
|
||||
{
|
||||
sstest = drcCifPointToSegment(arg->dCD_constraint->r_xtop - sdist,
|
||||
arg->dCD_constraint->r_ybot + sdist,
|
||||
|
|
|
|||
|
|
@ -639,9 +639,10 @@ checkDone:
|
|||
|
||||
/* ARGSUSED */
|
||||
int
|
||||
drcCheckTile(tile, arg)
|
||||
Tile * tile; /* tile in DRC_CHECK plane */
|
||||
ClientData arg; /* Not used. */
|
||||
drcCheckTile(tile, dinfo, arg)
|
||||
Tile *tile; /* Tile in DRC_CHECK plane */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
ClientData arg; /* Not used. */
|
||||
{
|
||||
Rect square; /* Square area of the checkerboard
|
||||
* being processed right now.
|
||||
|
|
@ -767,13 +768,15 @@ drcCheckTile(tile, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
drcXorFunc(tile)
|
||||
drcXorFunc(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData clientdata;
|
||||
{
|
||||
Rect area;
|
||||
|
||||
TiToRect(tile, &area);
|
||||
DBPaintPlane(drcDisplayPlane, &area, drcXorTable, (PaintUndoInfo *) NULL);
|
||||
DBNMPaintPlane(drcDisplayPlane, dinfo, &area, drcXorTable, (PaintUndoInfo *) NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -782,14 +785,15 @@ drcXorFunc(tile)
|
|||
*/
|
||||
|
||||
int
|
||||
drcPutBackFunc(tile, cellDef)
|
||||
drcPutBackFunc(tile, dinfo, cellDef)
|
||||
Tile *tile; /* Error tile, from drcTempPlane. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
CellDef *cellDef; /* Celldef in which to paint error. */
|
||||
{
|
||||
Rect area;
|
||||
|
||||
TiToRect(tile, &area);
|
||||
DBPaintPlane(cellDef->cd_planes[PL_DRC_ERROR], &area,
|
||||
DBNMPaintPlane(cellDef->cd_planes[PL_DRC_ERROR], dinfo, &area,
|
||||
DBStdPaintTbl(TiGetType(tile), PL_DRC_ERROR),
|
||||
(PaintUndoInfo *) NULL);
|
||||
return 0;
|
||||
|
|
@ -816,8 +820,9 @@ drcPutBackFunc(tile, cellDef)
|
|||
*/
|
||||
|
||||
int
|
||||
drcIncludeArea(tile, rect)
|
||||
drcIncludeArea(tile, dinfo, rect)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
Rect *rect; /* Rectangle in which to record total area. */
|
||||
{
|
||||
Rect dum;
|
||||
|
|
|
|||
|
|
@ -468,8 +468,9 @@ drcCheckRectSize(starttile, arg, cptr)
|
|||
|
||||
int
|
||||
MaxRectsExclude(
|
||||
Tile *tile,
|
||||
ClientData clientdata)
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -957,9 +957,10 @@ drcCountFunc(scx, dupTable)
|
|||
}
|
||||
|
||||
int
|
||||
drcCountFunc2(tile, countptr)
|
||||
Tile *tile; /* Tile found in error plane. */
|
||||
int *countptr; /* Address of count word. */
|
||||
drcCountFunc2(tile, dinfo, countptr)
|
||||
Tile *tile; /* Tile found in error plane. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
int *countptr; /* Address of count word. */
|
||||
{
|
||||
if (TiGetType(tile) != (TileType) TT_SPACE) (*countptr)++;
|
||||
return 0;
|
||||
|
|
@ -1106,8 +1107,9 @@ drcFindFunc(scx, finddata)
|
|||
}
|
||||
|
||||
int
|
||||
drcFindFunc2(tile, finddata)
|
||||
drcFindFunc2(tile, dinfo, finddata)
|
||||
Tile *tile; /* Tile in error plane. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
Sindx *finddata; /* Information about error to find */
|
||||
|
||||
{
|
||||
|
|
|
|||
|
|
@ -317,7 +317,9 @@ drcSubcellFunc(subUse, dsa)
|
|||
*/
|
||||
|
||||
int
|
||||
drcAlwaysOne()
|
||||
drcAlwaysOne(Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData clientdata)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -540,8 +542,9 @@ DRCFindInteractions(def, area, radius, interaction)
|
|||
*/
|
||||
|
||||
int
|
||||
drcExactOverlapCheck(tile, arg)
|
||||
drcExactOverlapCheck(tile, dinfo, arg)
|
||||
Tile *tile; /* Tile to check. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
struct drcClientData *arg; /* How to detect and process errors. */
|
||||
{
|
||||
Rect rect;
|
||||
|
|
@ -579,8 +582,9 @@ drcExactOverlapCheck(tile, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
drcExactOverlapTile(tile, cxp)
|
||||
drcExactOverlapTile(tile, dinfo, cxp)
|
||||
Tile *tile; /* Tile that must overlap exactly. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
TreeContext *cxp; /* Tells how to translate out of subcell.
|
||||
* The client data must be a drcClientData
|
||||
* record, and the caller must have filled
|
||||
|
|
|
|||
|
|
@ -754,8 +754,9 @@ antennacheckVisit(
|
|||
*/
|
||||
|
||||
int
|
||||
areaMarkFunc(tile, ams)
|
||||
areaMarkFunc(tile, dinfo, ams)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
AntennaMarkStruct *ams;
|
||||
{
|
||||
Rect rect;
|
||||
|
|
@ -778,8 +779,9 @@ areaMarkFunc(tile, ams)
|
|||
*/
|
||||
|
||||
int
|
||||
areaAccumFunc(tile, gdas)
|
||||
areaAccumFunc(tile, dinfo, gdas)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
GateDiffAccumStruct *gdas;
|
||||
{
|
||||
Rect *rect = &(gdas->r);
|
||||
|
|
@ -788,7 +790,7 @@ areaAccumFunc(tile, gdas)
|
|||
|
||||
/* Avoid double-counting the area of contacts */
|
||||
if (IsSplit(tile))
|
||||
type = SplitSide(tile) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
else
|
||||
type = TiGetType(tile);
|
||||
|
||||
|
|
@ -798,6 +800,7 @@ areaAccumFunc(tile, gdas)
|
|||
|
||||
TiToRect(tile, rect);
|
||||
area = (dlong)(rect->r_xtop - rect->r_xbot) * (dlong)(rect->r_ytop - rect->r_ybot);
|
||||
if (IsSplit(tile)) area /= 2;
|
||||
gdas->accum += area;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -816,8 +819,9 @@ areaAccumFunc(tile, gdas)
|
|||
*/
|
||||
|
||||
int
|
||||
antennaAccumFunc(tile, aaptr)
|
||||
antennaAccumFunc(tile, dinfo, aaptr)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* Not used, but should be handled */
|
||||
AntennaAccumStruct *aaptr;
|
||||
{
|
||||
Rect *rect = &(aaptr->r);
|
||||
|
|
@ -1003,6 +1007,7 @@ antennaAccumFunc(tile, aaptr)
|
|||
TiToRect(tile, rect);
|
||||
area = (dlong)(rect->r_xtop - rect->r_xbot)
|
||||
* (dlong)(rect->r_ytop - rect->r_ybot);
|
||||
if (IsSplit(tile)) area /= 2;
|
||||
|
||||
typeareas[type] += area;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -714,11 +714,11 @@ extArrayNodeName(np, ha, et1, et2)
|
|||
{
|
||||
Tile *tp;
|
||||
|
||||
tp = extNodeToTile(np, et1);
|
||||
tp = extNodeToTile(np, et1, NULL);
|
||||
if (tp && TiGetType(tp) != TT_SPACE && extHasRegion(tp, extUnInit))
|
||||
return (extArrayTileToNode(tp, np->nreg_pnum, et1, ha, TRUE));
|
||||
|
||||
tp = extNodeToTile(np, et2);
|
||||
tp = extNodeToTile(np, et2, NULL);
|
||||
if (tp && TiGetType(tp) != TT_SPACE && extHasRegion(tp, extUnInit))
|
||||
return (extArrayTileToNode(tp, np->nreg_pnum, et2, ha, TRUE));
|
||||
|
||||
|
|
|
|||
|
|
@ -166,8 +166,9 @@ bool extLabType();
|
|||
/* that is not in the topmost def of the search. */
|
||||
|
||||
int
|
||||
extFoundFunc(tile, cxp)
|
||||
extFoundFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; // Unused
|
||||
TreeContext *cxp;
|
||||
{
|
||||
CellDef *def = (CellDef *)cxp->tc_filter->tf_arg;
|
||||
|
|
@ -2113,8 +2114,9 @@ extDevFindParamMatch(devptr, length, width)
|
|||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
int
|
||||
extSDTileFunc(tile, pNum)
|
||||
extSDTileFunc(tile, dinfo, pNum)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
int pNum;
|
||||
{
|
||||
LinkedTile *newdevtile;
|
||||
|
|
@ -2143,13 +2145,14 @@ extSDTileFunc(tile, pNum)
|
|||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
int
|
||||
extTransFindTermArea(tile, eapd)
|
||||
extTransFindTermArea(tile, dinfo, eapd)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ExtAreaPerimData *eapd;
|
||||
{
|
||||
int extTermAPFunc(); /* Forward declaration */
|
||||
|
||||
DBSrConnectOnePlane(tile, DBConnectTbl, extTermAPFunc, (ClientData)eapd);
|
||||
DBSrConnectOnePlane(tile, dinfo, DBConnectTbl, extTermAPFunc, (ClientData)eapd);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -2262,13 +2265,13 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_uninit = (ClientData) extTransRec.tr_gatenode;
|
||||
arg.fra_region = (ExtRegion *) reg;
|
||||
arg.fra_each = extTransTileFunc;
|
||||
ntiles = ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
ntiles = ExtFindNeighbors(reg->treg_tile, reg->treg_type, arg.fra_pNum, &arg);
|
||||
|
||||
/* Re-mark with extTransRec.tr_gatenode */
|
||||
arg.fra_uninit = (ClientData) reg;
|
||||
arg.fra_region = (ExtRegion *) extTransRec.tr_gatenode;
|
||||
arg.fra_each = (int (*)()) NULL;
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type, arg.fra_pNum, &arg);
|
||||
|
||||
/* Are the terminal types on a compeletely different */
|
||||
/* plane than the top type? If so, do an area search */
|
||||
|
|
@ -2345,12 +2348,14 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_uninit = (ClientData)extTransRec.tr_gatenode;
|
||||
arg.fra_region = (ExtRegion *)reg;
|
||||
arg.fra_each = extSDTileFunc;
|
||||
ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
|
||||
arg.fra_uninit = (ClientData) reg;
|
||||
arg.fra_region = (ExtRegion *) extTransRec.tr_gatenode;
|
||||
arg.fra_each = (int (*)()) NULL;
|
||||
ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
|
||||
for (lt = extSpecialDevice; lt; lt = lt->t_next)
|
||||
{
|
||||
|
|
@ -2672,7 +2677,8 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_region = (ExtRegion *) reg;
|
||||
arg.fra_each = extAnnularTileFunc;
|
||||
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
|
||||
extSeparateBounds(n - 1); /* Handle MOScaps (if necessary) */
|
||||
extComputeEffectiveLW(&length, &width, n,
|
||||
|
|
@ -2695,7 +2701,8 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_uninit = (ClientData) reg;
|
||||
arg.fra_region = (ExtRegion *) extTransRec.tr_gatenode;
|
||||
arg.fra_each = (int (*)()) NULL;
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -2761,7 +2768,8 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_uninit = (ClientData) extTransRec.tr_gatenode;
|
||||
arg.fra_region = (ExtRegion *) reg;
|
||||
arg.fra_each = extAnnularTileFunc;
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
|
||||
if (extComputeCapLW(&length, &width) == FALSE)
|
||||
{
|
||||
|
|
@ -2790,7 +2798,8 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_uninit = (ClientData) reg;
|
||||
arg.fra_region = (ExtRegion *) extTransRec.tr_gatenode;
|
||||
arg.fra_each = (int (*)()) NULL;
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2855,7 +2864,8 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_each = extAnnularTileFunc;
|
||||
else
|
||||
arg.fra_each = extResistorTileFunc;
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
|
||||
if (extSpecialBounds[0] != NULL)
|
||||
{
|
||||
|
|
@ -2892,7 +2902,8 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_uninit = (ClientData) reg;
|
||||
arg.fra_region = (ExtRegion *) extTransRec.tr_gatenode;
|
||||
arg.fra_each = (int (*)()) NULL;
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -3015,7 +3026,8 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_uninit = (ClientData) extTransRec.tr_gatenode;
|
||||
arg.fra_region = (ExtRegion *) reg;
|
||||
arg.fra_each = extAnnularTileFunc;
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
|
||||
if (extComputeCapLW(&length, &width) == FALSE)
|
||||
{
|
||||
|
|
@ -3044,7 +3056,8 @@ extOutputDevices(def, transList, outFile)
|
|||
arg.fra_uninit = (ClientData) reg;
|
||||
arg.fra_region = (ExtRegion *) extTransRec.tr_gatenode;
|
||||
arg.fra_each = (int (*)()) NULL;
|
||||
(void) ExtFindNeighbors(reg->treg_tile, arg.fra_pNum, &arg);
|
||||
(void) ExtFindNeighbors(reg->treg_tile, reg->treg_type,
|
||||
arg.fra_pNum, &arg);
|
||||
}
|
||||
|
||||
if (devptr->exts_deviceClass == DEV_CSUBCKT)
|
||||
|
|
@ -3173,8 +3186,9 @@ extTransFindSubs(tile, t, mask, def, sn, layerptr)
|
|||
}
|
||||
|
||||
int
|
||||
extTransFindSubsFunc1(tile, noderecptr)
|
||||
extTransFindSubsFunc1(tile, dinfo, noderecptr)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
NodeAndType *noderecptr;
|
||||
{
|
||||
TileType type;
|
||||
|
|
@ -3193,7 +3207,7 @@ extTransFindSubsFunc1(tile, noderecptr)
|
|||
tile->ti_ll.p_x, tile->ti_ll.p_y);
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
if (type == TT_SPACE) return 0; /* Ignore space in split tiles */
|
||||
}
|
||||
else
|
||||
|
|
@ -3232,15 +3246,16 @@ extTransFindId(tile, mask, def, idtypeptr)
|
|||
}
|
||||
|
||||
int
|
||||
extTransFindIdFunc1(tile, idtypeptr)
|
||||
extTransFindIdFunc1(tile, dinfo, idtypeptr)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
TileType *idtypeptr;
|
||||
{
|
||||
/*
|
||||
* ID Layer found overlapping device area, so return 1 to halt search.
|
||||
*/
|
||||
if (IsSplit(tile))
|
||||
*idtypeptr = (SplitSide(tile)) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
*idtypeptr = (dinfo & TT_SIDE) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
else
|
||||
*idtypeptr = TiGetTypeExact(tile);
|
||||
|
||||
|
|
@ -3350,8 +3365,9 @@ extDevFindMatch(deventry, t)
|
|||
*/
|
||||
|
||||
int
|
||||
extTransTileFunc(tile, pNum, arg)
|
||||
extTransTileFunc(tile, dinfo, pNum, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
int pNum;
|
||||
FindRegion *arg;
|
||||
{
|
||||
|
|
@ -3384,7 +3400,7 @@ extTransTileFunc(tile, pNum, arg)
|
|||
*/
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
// return (0); /* Hack alert! We must properly handle diagonals! */
|
||||
}
|
||||
else
|
||||
|
|
@ -3397,7 +3413,7 @@ extTransTileFunc(tile, pNum, arg)
|
|||
/* The AMD target gcc compile works and the Intel target gcc */
|
||||
/* compile doesn't! The following code works the same on both. */
|
||||
|
||||
perim = extEnumTilePerim(tile, &mask, pNum,
|
||||
perim = extEnumTilePerim(tile, dinfo, &mask, pNum,
|
||||
extTransPerimFunc, (ClientData)NULL);
|
||||
extTransRec.tr_perim += perim;
|
||||
|
||||
|
|
@ -3610,8 +3626,9 @@ extAddSharedDevice(eapd, node)
|
|||
*/
|
||||
|
||||
int
|
||||
extTermAPFunc(tile, pNum, eapd)
|
||||
extTermAPFunc(tile, dinfo, pNum, eapd)
|
||||
Tile *tile; /* Tile extending a device terminal */
|
||||
TileType dinfo; /* Split tile information */
|
||||
int pNum; /* Plane of tile (unused, set to -1) */
|
||||
ExtAreaPerimData *eapd; /* Area and perimeter totals for terminal */
|
||||
{
|
||||
|
|
@ -3626,7 +3643,7 @@ extTermAPFunc(tile, pNum, eapd)
|
|||
if (IsSplit(tile))
|
||||
{
|
||||
int w, h, l;
|
||||
type = (SplitSide(tile)) ? SplitLeftType(tile): SplitRightType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitLeftType(tile): SplitRightType(tile);
|
||||
w = RIGHT(tile) - LEFT(tile);
|
||||
h = TOP(tile) - BOTTOM(tile);
|
||||
l = w * w + h * h;
|
||||
|
|
@ -3864,7 +3881,10 @@ extTransPerimFunc(bp)
|
|||
eapd.eapd_gatenode = (NodeRegion *)extGetRegion(bp->b_inside);
|
||||
eapd.eapd_shared = NULL;
|
||||
|
||||
DBSrConnectOnePlane(bp->b_outside, DBConnectTbl,
|
||||
/* Fix me: Set dinfo based on split tile and boundary
|
||||
* direction.
|
||||
*/
|
||||
DBSrConnectOnePlane(bp->b_outside, (TileType)0, DBConnectTbl,
|
||||
extTermAPFunc, (ClientData)&eapd);
|
||||
|
||||
shared = 1;
|
||||
|
|
@ -4005,8 +4025,9 @@ extTransPerimFunc(bp)
|
|||
*/
|
||||
|
||||
int
|
||||
extAnnularTileFunc(tile, pNum)
|
||||
extAnnularTileFunc(tile, dinfo, pNum)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
int pNum;
|
||||
{
|
||||
TileTypeBitMask mask;
|
||||
|
|
@ -4018,14 +4039,14 @@ extAnnularTileFunc(tile, pNum)
|
|||
*/
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
}
|
||||
else
|
||||
loctype = TiGetTypeExact(tile);
|
||||
|
||||
mask = ExtCurStyle->exts_deviceConn[loctype];
|
||||
TTMaskCom(&mask);
|
||||
extEnumTilePerim(tile, &mask, pNum, extSpecialPerimFunc, (ClientData) TRUE);
|
||||
extEnumTilePerim(tile, dinfo, &mask, pNum, extSpecialPerimFunc, (ClientData) TRUE);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -4054,8 +4075,9 @@ extAnnularTileFunc(tile, pNum)
|
|||
*/
|
||||
|
||||
int
|
||||
extResistorTileFunc(tile, pNum)
|
||||
extResistorTileFunc(tile, dinfo, pNum)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
int pNum;
|
||||
{
|
||||
TileTypeBitMask mask;
|
||||
|
|
@ -4068,7 +4090,7 @@ extResistorTileFunc(tile, pNum)
|
|||
*/
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile): SplitLeftType(tile);
|
||||
}
|
||||
else
|
||||
loctype = TiGetTypeExact(tile);
|
||||
|
|
@ -4083,7 +4105,7 @@ extResistorTileFunc(tile, pNum)
|
|||
TTMaskSetMask(&mask, &devptr->exts_deviceSDTypes[0]);
|
||||
TTMaskCom(&mask);
|
||||
|
||||
extEnumTilePerim(tile, &mask, pNum, extSpecialPerimFunc, (ClientData)FALSE);
|
||||
extEnumTilePerim(tile, dinfo, &mask, pNum, extSpecialPerimFunc, (ClientData)FALSE);
|
||||
|
||||
if (extSpecialBounds[0] != NULL) break;
|
||||
devptr = devptr->exts_next;
|
||||
|
|
@ -4459,13 +4481,15 @@ extLabType(text, typeMask)
|
|||
* Returns a pointer to the tile
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
* The information about which side of a split tile is the node of
|
||||
* interest is passed back in the "dinfo" pointer.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
Tile *extNodeToTile(np, et)
|
||||
Tile *extNodeToTile(np, et, dinfo)
|
||||
NodeRegion *np;
|
||||
ExtTree *et;
|
||||
TileType *dinfo; /* Pass back TT_SIDE information here */
|
||||
{
|
||||
Tile *tp;
|
||||
Plane *myplane;
|
||||
|
|
@ -4476,13 +4500,13 @@ Tile *extNodeToTile(np, et)
|
|||
GOTOPOINT(tp, &np->nreg_ll);
|
||||
PlaneSetHint(myplane, tp);
|
||||
|
||||
if (IsSplit(tp))
|
||||
if (IsSplit(tp) && (dinfo != NULL))
|
||||
{
|
||||
TileType tpt = TiGetTypeExact(tp);
|
||||
if ((tpt & TT_LEFTMASK) == (np->nreg_type & TT_LEFTMASK))
|
||||
TiSetBody(tp, tpt & ~TT_SIDE);
|
||||
*dinfo = (TileType)0;
|
||||
else
|
||||
TiSetBody(tp, tpt | TT_SIDE);
|
||||
*dinfo = (TileType)TT_SIDE;
|
||||
}
|
||||
|
||||
return tp;
|
||||
|
|
@ -4510,10 +4534,11 @@ Tile *extNodeToTile(np, et)
|
|||
*/
|
||||
|
||||
void
|
||||
extSetNodeNum(reg, plane, tile)
|
||||
extSetNodeNum(reg, plane, tile, dinfo)
|
||||
LabRegion *reg;
|
||||
int plane;
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
{
|
||||
TileType type;
|
||||
|
||||
|
|
@ -4522,14 +4547,14 @@ extSetNodeNum(reg, plane, tile)
|
|||
/* Only consider split tiles if the lower-left-hand corner */
|
||||
/* is only the type under consideration. */
|
||||
|
||||
if (!SplitSide(tile) && SplitDirection(tile))
|
||||
type = SplitSide(tile) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
if (!(dinfo & TT_SIDE) && SplitDirection(tile))
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
else
|
||||
{
|
||||
type = SplitSide(tile) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
/* (Are these type checks necessary?) */
|
||||
if ((type == TT_SPACE) || !TTMaskHasType(&DBPlaneTypes[plane], type))
|
||||
type = SplitSide(tile) ? SplitLeftType(tile) : SplitRightType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitLeftType(tile) : SplitRightType(tile);
|
||||
if ((type == TT_SPACE) || !TTMaskHasType(&DBPlaneTypes[plane], type))
|
||||
return;
|
||||
}
|
||||
|
|
@ -4583,8 +4608,9 @@ extSetNodeNum(reg, plane, tile)
|
|||
*/
|
||||
|
||||
ExtRegion *
|
||||
extTransFirst(tile, arg)
|
||||
extTransFirst(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
FindRegion *arg;
|
||||
{
|
||||
TransRegion *reg;
|
||||
|
|
@ -4597,7 +4623,7 @@ extTransFirst(tile, arg)
|
|||
reg->treg_pnum = DBNumPlanes;
|
||||
|
||||
if (IsSplit(tile))
|
||||
reg->treg_type = SplitSide(tile) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
reg->treg_type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
else
|
||||
reg->treg_type = TiGetTypeExact(tile);
|
||||
|
||||
|
|
@ -4609,8 +4635,9 @@ extTransFirst(tile, arg)
|
|||
|
||||
/*ARGSUSED*/
|
||||
int
|
||||
extTransEach(tile, pNum, arg)
|
||||
extTransEach(tile, dinfo, pNum, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* unused, should be handled */
|
||||
int pNum;
|
||||
FindRegion *arg;
|
||||
{
|
||||
|
|
@ -4631,7 +4658,7 @@ extTransEach(tile, pNum, arg)
|
|||
|
||||
if (pNum < reg->treg_pnum) reg->treg_area = 0;
|
||||
|
||||
extSetNodeNum((LabRegion *) reg, pNum, tile);
|
||||
extSetNodeNum((LabRegion *) reg, pNum, tile, dinfo);
|
||||
|
||||
if (pNum == reg->treg_pnum) reg->treg_area += area;
|
||||
|
||||
|
|
@ -4769,18 +4796,19 @@ extFindNodes(def, clipArea, subonly)
|
|||
if (!StackEmpty(extNodeStack))
|
||||
{
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
int tilePlaneNum;
|
||||
|
||||
POPTILE(tile, tilePlaneNum);
|
||||
POPTILE(tile, dinfo, tilePlaneNum);
|
||||
arg.fra_pNum = tilePlaneNum;
|
||||
extNodeAreaFunc(tile, &arg);
|
||||
extNodeAreaFunc(tile, dinfo, &arg);
|
||||
temp_subsnode = (NodeRegion *)arg.fra_region;
|
||||
}
|
||||
else if (ExtCurStyle->exts_globSubstratePlane != -1)
|
||||
{
|
||||
NodeRegion *loc_subsnode;
|
||||
|
||||
extNodeAreaFunc((Tile *)NULL, (FindRegion *)&arg);
|
||||
extNodeAreaFunc((Tile *)NULL, (TileType)0, (FindRegion *)&arg);
|
||||
loc_subsnode = (NodeRegion *)arg.fra_region;
|
||||
loc_subsnode->nreg_pnum = ExtCurStyle->exts_globSubstratePlane;
|
||||
loc_subsnode->nreg_type = TT_SPACE;
|
||||
|
|
@ -4811,8 +4839,9 @@ extFindNodes(def, clipArea, subonly)
|
|||
}
|
||||
|
||||
int
|
||||
extSubsFunc(tile, arg)
|
||||
extSubsFunc(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
FindRegion *arg;
|
||||
{
|
||||
int pNum;
|
||||
|
|
@ -4823,7 +4852,7 @@ extSubsFunc(tile, arg)
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
if (type == TT_SPACE) return 0; /* Should not happen */
|
||||
}
|
||||
|
||||
|
|
@ -4834,20 +4863,21 @@ extSubsFunc(tile, arg)
|
|||
smask = &ExtCurStyle->exts_globSubstrateShieldTypes;
|
||||
for (pNum = PL_TECHDEPBASE; pNum < DBNumPlanes; pNum++)
|
||||
if (TTMaskIntersect(&DBPlaneTypes[pNum], smask))
|
||||
if (DBSrPaintArea((Tile *) NULL, arg->fra_def->cd_planes[pNum],
|
||||
if (DBSrPaintArea((Tile *)NULL, arg->fra_def->cd_planes[pNum],
|
||||
&tileArea, smask, extSubsFunc3, (ClientData)NULL) != 0)
|
||||
return (0);
|
||||
|
||||
/* Mark this tile as pending and push it */
|
||||
PUSHTILE(tile, arg->fra_pNum);
|
||||
PUSHTILE(tile, dinfo, arg->fra_pNum);
|
||||
|
||||
/* That's all we do */
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
extSubsFunc2(tile, arg)
|
||||
extSubsFunc2(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo; // Unused
|
||||
FindRegion *arg;
|
||||
{
|
||||
int pNum;
|
||||
|
|
@ -4878,22 +4908,25 @@ extSubsFunc2(tile, arg)
|
|||
extSubsFunc3, (ClientData)NULL) == 0)
|
||||
{
|
||||
/* Mark this tile as pending and push it */
|
||||
PUSHTILE(tile, arg->fra_pNum);
|
||||
PUSHTILE(tile, dinfo, arg->fra_pNum);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
extSubsFunc3(tile)
|
||||
Tile *tile;
|
||||
extSubsFunc3(tile, dinfo, clientdata)
|
||||
Tile *tile; /* (unused) */
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
/* Stops the search because something that was not space was found */
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
extNodeAreaFunc(tile, arg)
|
||||
extNodeAreaFunc(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
FindRegion *arg;
|
||||
{
|
||||
int tilePlaneNum, pNum, len, resistClass, n, nclasses;
|
||||
|
|
@ -4910,7 +4943,7 @@ extNodeAreaFunc(tile, arg)
|
|||
|
||||
if (tile && IsSplit(tile))
|
||||
{
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
if (type == TT_SPACE) return 0; /* Should not happen */
|
||||
}
|
||||
|
||||
|
|
@ -4939,12 +4972,12 @@ extNodeAreaFunc(tile, arg)
|
|||
if (tile == NULL) return 1;
|
||||
|
||||
/* Mark this tile as pending and push it */
|
||||
PUSHTILE(tile, arg->fra_pNum);
|
||||
PUSHTILE(tile, dinfo, arg->fra_pNum);
|
||||
|
||||
/* Continue processing tiles until there are none left */
|
||||
while (!StackEmpty(extNodeStack))
|
||||
{
|
||||
POPTILE(tile, tilePlaneNum);
|
||||
POPTILE(tile, dinfo, tilePlaneNum);
|
||||
|
||||
/*
|
||||
* Since tile was pushed on the stack, we know that it
|
||||
|
|
@ -4960,7 +4993,7 @@ extNodeAreaFunc(tile, arg)
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile):
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile):
|
||||
SplitLeftType(tile);
|
||||
}
|
||||
else
|
||||
|
|
@ -4982,7 +5015,7 @@ extNodeAreaFunc(tile, arg)
|
|||
* node name that does not depend on any other nodes
|
||||
* in this cell.
|
||||
*/
|
||||
extSetNodeNum((LabRegion *) reg, tilePlaneNum, tile);
|
||||
extSetNodeNum((LabRegion *) reg, tilePlaneNum, tile, dinfo);
|
||||
|
||||
/*
|
||||
* Keep track of the total area of this node, and the
|
||||
|
|
@ -5023,7 +5056,7 @@ extNodeAreaFunc(tile, arg)
|
|||
}
|
||||
|
||||
/* Find the type on the other side of the tile */
|
||||
t = (SplitSide(tile)) ? SplitLeftType(tile):
|
||||
t = (dinfo & TT_SIDE) ? SplitLeftType(tile):
|
||||
SplitRightType(tile);
|
||||
tres = (DBIsContact(t)) ? DBPlaneToResidue(t, tilePlaneNum) : t;
|
||||
if ((capval = ExtCurStyle->exts_perimCap[residue][tres]) != (CapValue) 0)
|
||||
|
|
@ -5042,7 +5075,8 @@ extNodeAreaFunc(tile, arg)
|
|||
/* Top */
|
||||
topside:
|
||||
|
||||
if (IsSplit(tile) && (SplitSide(tile) ^ SplitDirection(tile))) goto leftside;
|
||||
if (IsSplit(tile) && (((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
|
||||
goto leftside;
|
||||
|
||||
for (tp = RT(tile); RIGHT(tp) > LEFT(tile); tp = BL(tp))
|
||||
{
|
||||
|
|
@ -5075,7 +5109,7 @@ topside:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (ticlient == extUnInit && TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, tilePlaneNum);
|
||||
PUSHTILE(tp, (TileType)0, tilePlaneNum);
|
||||
}
|
||||
}
|
||||
tres = (DBIsContact(t)) ? DBPlaneToResidue(t, tilePlaneNum) : t;
|
||||
|
|
@ -5088,7 +5122,7 @@ topside:
|
|||
/* Left */
|
||||
leftside:
|
||||
|
||||
if (IsSplit(tile) && SplitSide(tile)) goto bottomside;
|
||||
if (IsSplit(tile) && (dinfo & TT_SIDE)) goto bottomside;
|
||||
|
||||
for (tp = BL(tile); BOTTOM(tp) < TOP(tile); tp = RT(tp))
|
||||
{
|
||||
|
|
@ -5121,7 +5155,7 @@ leftside:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (ticlient == extUnInit && TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, tilePlaneNum);
|
||||
PUSHTILE(tp, (TileType)0, tilePlaneNum);
|
||||
}
|
||||
}
|
||||
tres = (DBIsContact(t)) ? DBPlaneToResidue(t, tilePlaneNum) : t;
|
||||
|
|
@ -5134,7 +5168,7 @@ leftside:
|
|||
/* Bottom */
|
||||
bottomside:
|
||||
|
||||
if (IsSplit(tile) && (!(SplitSide(tile) ^ SplitDirection(tile))))
|
||||
if (IsSplit(tile) && (!((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
|
||||
goto rightside;
|
||||
|
||||
for (tp = LB(tile); LEFT(tp) < RIGHT(tile); tp = TR(tp))
|
||||
|
|
@ -5168,7 +5202,7 @@ bottomside:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (ticlient == extUnInit && TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, tilePlaneNum);
|
||||
PUSHTILE(tp, (TileType)0, tilePlaneNum);
|
||||
}
|
||||
}
|
||||
tres = (DBIsContact(t)) ? DBPlaneToResidue(t, tilePlaneNum) : t;
|
||||
|
|
@ -5181,7 +5215,7 @@ bottomside:
|
|||
/* Right */
|
||||
rightside:
|
||||
|
||||
if (IsSplit(tile) && !SplitSide(tile)) goto donesides;
|
||||
if (IsSplit(tile) && !(dinfo & TT_SIDE)) goto donesides;
|
||||
|
||||
for (tp = TR(tile); TOP(tp) > BOTTOM(tile); tp = LB(tp))
|
||||
{
|
||||
|
|
@ -5214,7 +5248,7 @@ rightside:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (ticlient == extUnInit && TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, tilePlaneNum);
|
||||
PUSHTILE(tp, (TileType)0, tilePlaneNum);
|
||||
}
|
||||
}
|
||||
tres = (DBIsContact(t)) ? DBPlaneToResidue(t, tilePlaneNum) : t;
|
||||
|
|
@ -5248,7 +5282,7 @@ donesides:
|
|||
/* tp and tile should have the same geometry for a contact */
|
||||
if (IsSplit(tile) && IsSplit(tp))
|
||||
{
|
||||
if (SplitSide(tile))
|
||||
if (dinfo & TT_SIDE)
|
||||
{
|
||||
t = SplitRightType(tp);
|
||||
if (TTMaskHasType(mask, t))
|
||||
|
|
@ -5284,7 +5318,7 @@ donesides:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, pNum);
|
||||
PUSHTILE(tp, (TileType)0, pNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5314,7 +5348,7 @@ donesides:
|
|||
if (is_split)
|
||||
DBSrPaintNMArea((Tile *) NULL,
|
||||
arg->fra_def->cd_planes[pNum],
|
||||
TiGetTypeExact(tile) &
|
||||
(TiGetTypeExact(tile) | dinfo) &
|
||||
(TT_DIAGONAL | TT_SIDE | TT_DIRECTION),
|
||||
&biggerArea, mask, extNbrPushFunc,
|
||||
(ClientData) &pla);
|
||||
|
|
|
|||
|
|
@ -311,8 +311,9 @@ extOutputCoupling(table, outFile)
|
|||
*/
|
||||
|
||||
int
|
||||
extBasicOverlap(tile, ecs)
|
||||
extBasicOverlap(tile, dinfo, ecs)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
extCapStruct *ecs;
|
||||
{
|
||||
int thisType;
|
||||
|
|
@ -325,7 +326,7 @@ extBasicOverlap(tile, ecs)
|
|||
extCoupleStruct ecpls;
|
||||
|
||||
if (IsSplit(tile))
|
||||
thisType = (SplitSide(tile)) ? SplitRightType(tile) :
|
||||
thisType = ((dinfo & TT_SIDE)) ? SplitRightType(tile) :
|
||||
SplitLeftType(tile);
|
||||
else
|
||||
thisType = TiGetTypeExact(tile);
|
||||
|
|
@ -764,11 +765,12 @@ extSubtractSideOverlap2(tile, sov)
|
|||
*/
|
||||
|
||||
int
|
||||
extBasicCouple(tile, ecs)
|
||||
extBasicCouple(tile, dinfo, ecs)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
extCapStruct *ecs;
|
||||
{
|
||||
(void) extEnumTilePerim(tile, &ExtCurStyle->exts_sideEdges[TiGetType(tile)],
|
||||
(void) extEnumTilePerim(tile, dinfo, &ExtCurStyle->exts_sideEdges[TiGetType(tile)],
|
||||
ecs->plane, extAddCouple, (ClientData) ecs);
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -1478,11 +1480,7 @@ extWalkTop(area, mask, func, bp, esws)
|
|||
tp = tile;
|
||||
while (RIGHT(tp) > area->r_xbot)
|
||||
{
|
||||
if (IsSplit(tp))
|
||||
ttype = (SplitSide(tp)) ? SplitRightType(tp) : SplitLeftType(tp);
|
||||
else
|
||||
ttype = TiGetTypeExact(tp);
|
||||
|
||||
ttype = TiGetBottomType(tp);
|
||||
if (TTMaskHasType(mask, ttype))
|
||||
{
|
||||
bool lookLeft, lookRight;
|
||||
|
|
@ -1590,11 +1588,7 @@ extWalkBottom(area, mask, func, bp, esws)
|
|||
tp = tile;
|
||||
while (LEFT(tp) < area->r_xtop)
|
||||
{
|
||||
if (IsSplit(tp))
|
||||
ttype = (SplitSide(tp)) ? SplitRightType(tp) : SplitLeftType(tp);
|
||||
else
|
||||
ttype = TiGetTypeExact(tp);
|
||||
|
||||
ttype = TiGetTopType(tp);
|
||||
if (TTMaskHasType(mask, ttype))
|
||||
{
|
||||
bool lookLeft, lookRight;
|
||||
|
|
@ -1702,11 +1696,7 @@ extWalkRight(area, mask, func, bp, esws)
|
|||
tp = tile;
|
||||
while (TOP(tp) > area->r_ybot)
|
||||
{
|
||||
if (IsSplit(tp))
|
||||
ttype = (SplitSide(tp)) ? SplitRightType(tp) : SplitLeftType(tp);
|
||||
else
|
||||
ttype = TiGetTypeExact(tp);
|
||||
|
||||
ttype = TiGetLeftType(tp);
|
||||
if (TTMaskHasType(mask, ttype))
|
||||
{
|
||||
bool lookDown, lookUp;
|
||||
|
|
@ -1814,11 +1804,7 @@ extWalkLeft(area, mask, func, bp, esws)
|
|||
tp = tile;
|
||||
while (BOTTOM(tp) < area->r_ytop)
|
||||
{
|
||||
if (IsSplit(tp))
|
||||
ttype = (SplitSide(tp)) ? SplitRightType(tp) : SplitLeftType(tp);
|
||||
else
|
||||
ttype = TiGetTypeExact(tp);
|
||||
|
||||
ttype = TiGetRightType(tp);
|
||||
if (TTMaskHasType(mask, ttype))
|
||||
{
|
||||
bool lookDown, lookUp;
|
||||
|
|
|
|||
|
|
@ -71,8 +71,9 @@ bool extHardSetLabel();
|
|||
*/
|
||||
|
||||
ExtRegion *
|
||||
extLabFirst(tile, arg)
|
||||
extLabFirst(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
FindRegion *arg;
|
||||
{
|
||||
TransRegion *reg;
|
||||
|
|
@ -91,8 +92,9 @@ extLabFirst(tile, arg)
|
|||
|
||||
/*ARGSUSED*/
|
||||
int
|
||||
extLabEach(tile, pNum, arg)
|
||||
extLabEach(tile, dinfo, pNum, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
int pNum;
|
||||
FindRegion *arg;
|
||||
{
|
||||
|
|
@ -109,7 +111,7 @@ extLabEach(tile, pNum, arg)
|
|||
TransRegion *reg = (TransRegion *) arg->fra_region;
|
||||
|
||||
if (reg->treg_area == DBNumPlanes) reg->treg_area = pNum;
|
||||
extSetNodeNum((LabRegion *)reg, pNum, tile);
|
||||
extSetNodeNum((LabRegion *)reg, pNum, tile, dinfo);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -69,8 +69,10 @@ Node *extHierNewNode();
|
|||
/*----------------------------------------------------------------------*/
|
||||
|
||||
int
|
||||
extHierSubShieldFunc(tile)
|
||||
Tile *tile;
|
||||
extHierSubShieldFunc(tile, dinfo, clientdata)
|
||||
Tile *tile; /* (unused) */
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -325,8 +327,9 @@ extHierConnections(ha, cumFlat, oneFlat)
|
|||
*/
|
||||
|
||||
int
|
||||
extHierConnectFunc1(oneTile, ha)
|
||||
extHierConnectFunc1(oneTile, dinfo, ha)
|
||||
Tile *oneTile; /* Comes from 'oneFlat' in extHierConnections */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
HierExtractArg *ha; /* Extraction context */
|
||||
{
|
||||
CellDef *cumDef = extHierCumFlat->et_use->cu_def;
|
||||
|
|
@ -475,8 +478,9 @@ extHierConnectFunc1(oneTile, ha)
|
|||
*/
|
||||
|
||||
int
|
||||
extHierConnectFunc2(cum, ha)
|
||||
extHierConnectFunc2(cum, dinfo, ha)
|
||||
Tile *cum; /* Comes from extHierCumFlat->et_use->cu_def */
|
||||
TileType dinfo; /* Split tile information */
|
||||
HierExtractArg *ha; /* Extraction context */
|
||||
{
|
||||
HashTable *table = &ha->ha_connHash;
|
||||
|
|
@ -507,7 +511,7 @@ extHierConnectFunc2(cum, ha)
|
|||
ttype = TiGetTypeExact(cum);
|
||||
|
||||
if (IsSplit(cum))
|
||||
ttype = (ttype & TT_SIDE) ? SplitRightType(cum) : SplitLeftType(cum);
|
||||
ttype = (dinfo & TT_SIDE) ? SplitRightType(cum) : SplitLeftType(cum);
|
||||
|
||||
if (extConnectsTo(ha->hierType, ttype, ExtCurStyle->exts_nodeConn))
|
||||
{
|
||||
|
|
@ -584,8 +588,9 @@ extHierConnectFunc2(cum, ha)
|
|||
*/
|
||||
|
||||
int
|
||||
extHierConnectFunc3(cum, ha)
|
||||
extHierConnectFunc3(cum, dinfo, ha)
|
||||
Tile *cum; /* Comes from extHierCumFlat->et_use->cu_def */
|
||||
TileType dinfo; /* Split tile information */
|
||||
HierExtractArg *ha; /* Extraction context */
|
||||
{
|
||||
HashTable *table = &ha->ha_connHash;
|
||||
|
|
@ -616,7 +621,7 @@ extHierConnectFunc3(cum, ha)
|
|||
ttype = TiGetTypeExact(cum);
|
||||
|
||||
if (IsSplit(cum))
|
||||
ttype = (ttype & TT_SIDE) ? SplitRightType(cum) : SplitLeftType(cum);
|
||||
ttype = (dinfo & TT_SIDE) ? SplitRightType(cum) : SplitLeftType(cum);
|
||||
|
||||
if (extConnectsTo(ha->hierType, ttype, ExtCurStyle->exts_nodeConn))
|
||||
{
|
||||
|
|
@ -774,7 +779,7 @@ extHierAdjustments(ha, cumFlat, oneFlat, lookFlat)
|
|||
/* Ignore orphaned nodes (non-Manhattan shards outside the clip box) */
|
||||
if (np->nreg_pnum == DBNumPlanes) continue;
|
||||
|
||||
tp = extNodeToTile(np, lookFlat);
|
||||
tp = extNodeToTile(np, lookFlat, NULL);
|
||||
|
||||
/* Ignore regions that do not participate in extraction */
|
||||
if (!extHasRegion(tp, extUnInit)) continue;
|
||||
|
|
@ -946,8 +951,9 @@ extHierNewNode(he)
|
|||
|
||||
/*ARGSUSED*/
|
||||
ExtRegion *
|
||||
extHierLabFirst(tile, arg)
|
||||
extHierLabFirst(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
FindRegion *arg;
|
||||
{
|
||||
LabRegion *new;
|
||||
|
|
@ -966,15 +972,16 @@ extHierLabFirst(tile, arg)
|
|||
|
||||
/*ARGSUSED*/
|
||||
int
|
||||
extHierLabEach(tile, pNum, arg)
|
||||
extHierLabEach(tile, dinfo, pNum, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
int pNum;
|
||||
FindRegion *arg;
|
||||
{
|
||||
LabRegion *reg;
|
||||
|
||||
reg = (LabRegion *) arg->fra_region;
|
||||
extSetNodeNum(reg, pNum, tile);
|
||||
extSetNodeNum(reg, pNum, tile, dinfo);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -270,8 +270,9 @@ extInterSubtreeElement(use, trans, x, y, r)
|
|||
*/
|
||||
|
||||
int
|
||||
extInterSubtreeTile(tile, cxp)
|
||||
extInterSubtreeTile(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext newscx;
|
||||
|
|
|
|||
|
|
@ -434,8 +434,9 @@ extLengthYank(use, labList)
|
|||
*/
|
||||
|
||||
int
|
||||
extLengthLabels(tile, rootUse)
|
||||
Tile *tile; /* Some tile in extPathDef */
|
||||
extLengthLabels(tile, dinfo, rootUse)
|
||||
Tile *tile; /* Some tile in extPathDef */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
CellUse *rootUse; /* The original root cell */
|
||||
{
|
||||
char name[MAXNAMESIZE];
|
||||
|
|
@ -727,8 +728,9 @@ extPathResetClient(tile)
|
|||
*/
|
||||
|
||||
int
|
||||
extPathPairFunc(tile, epa)
|
||||
extPathPairFunc(tile, dinfo, epa)
|
||||
Tile *tile;
|
||||
TileType dinfo; // Unused
|
||||
struct extPathArg *epa;
|
||||
{
|
||||
Point startPoint;
|
||||
|
|
@ -909,8 +911,9 @@ extPathFlood(tile, p, distance, epa)
|
|||
}
|
||||
|
||||
int
|
||||
extPathFloodFunc(dstTile, epfa)
|
||||
extPathFloodFunc(dstTile, dinfo, epfa)
|
||||
Tile *dstTile;
|
||||
TileType dinfo; // Unused
|
||||
struct extPathFloodArg *epfa;
|
||||
{
|
||||
Rect srcRect, dstRect;
|
||||
|
|
|
|||
|
|
@ -209,9 +209,10 @@ extIsUsedFunc(use, clientData)
|
|||
*/
|
||||
|
||||
int
|
||||
extEnumFunc(tile, plane)
|
||||
Tile *tile;
|
||||
int *plane;
|
||||
extEnumFunc(tile, dinfo, clientdata)
|
||||
Tile *tile; /* (unused) */
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -854,7 +855,10 @@ extContainsCellFunc(
|
|||
}
|
||||
|
||||
int
|
||||
extContainsPaintFunc()
|
||||
extContainsPaintFunc(
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,8 +74,9 @@ ClientData extNbrUn;
|
|||
*/
|
||||
|
||||
int
|
||||
ExtFindNeighbors(tile, tilePlaneNum, arg)
|
||||
ExtFindNeighbors(tile, dinfo, tilePlaneNum, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
int tilePlaneNum;
|
||||
FindRegion *arg;
|
||||
{
|
||||
|
|
@ -95,15 +96,15 @@ ExtFindNeighbors(tile, tilePlaneNum, arg)
|
|||
extNodeStack = StackNew(64);
|
||||
|
||||
/* Mark this tile as pending and push it */
|
||||
PUSHTILE(tile, tilePlaneNum);
|
||||
PUSHTILE(tile, dinfo, tilePlaneNum);
|
||||
|
||||
while (!StackEmpty(extNodeStack))
|
||||
{
|
||||
POPTILE(tile, tilePlaneNum);
|
||||
POPTILE(tile, dinfo, tilePlaneNum);
|
||||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile):
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile):
|
||||
SplitLeftType(tile);
|
||||
}
|
||||
else
|
||||
|
|
@ -126,7 +127,8 @@ ExtFindNeighbors(tile, tilePlaneNum, arg)
|
|||
|
||||
/* Top */
|
||||
topside:
|
||||
if (IsSplit(tile) && (SplitSide(tile) ^ SplitDirection(tile))) goto leftside;
|
||||
if (IsSplit(tile) && ((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile))
|
||||
goto leftside;
|
||||
for (tp = RT(tile); RIGHT(tp) > LEFT(tile); tp = BL(tp))
|
||||
{
|
||||
if (IsSplit(tp))
|
||||
|
|
@ -143,14 +145,14 @@ topside:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (TiGetClient(tp) == extNbrUn && TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, tilePlaneNum);
|
||||
PUSHTILE(tp, (TileType)0, tilePlaneNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Left */
|
||||
leftside:
|
||||
if (IsSplit(tile) && SplitSide(tile)) goto bottomside;
|
||||
if (IsSplit(tile) && (dinfo & TT_SIDE)) goto bottomside;
|
||||
for (tp = BL(tile); BOTTOM(tp) < TOP(tile); tp = RT(tp))
|
||||
{
|
||||
if (IsSplit(tp))
|
||||
|
|
@ -167,14 +169,14 @@ leftside:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (TiGetClient(tp) == extNbrUn && TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, tilePlaneNum);
|
||||
PUSHTILE(tp, (TileType)0, tilePlaneNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Bottom */
|
||||
bottomside:
|
||||
if (IsSplit(tile) && (!(SplitSide(tile) ^ SplitDirection(tile))))
|
||||
if (IsSplit(tile) && (!(((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile))))
|
||||
goto rightside;
|
||||
for (tp = LB(tile); LEFT(tp) < RIGHT(tile); tp = TR(tp))
|
||||
{
|
||||
|
|
@ -192,14 +194,14 @@ bottomside:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (TiGetClient(tp) == extNbrUn && TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, tilePlaneNum);
|
||||
PUSHTILE(tp, (TileType)0, tilePlaneNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Right */
|
||||
rightside:
|
||||
if (IsSplit(tile) && !SplitSide(tile)) goto donesides;
|
||||
if (IsSplit(tile) && !(dinfo & TT_SIDE)) goto donesides;
|
||||
for (tp = TR(tile); TOP(tp) > BOTTOM(tile); tp = LB(tp))
|
||||
{
|
||||
if (IsSplit(tp))
|
||||
|
|
@ -216,7 +218,7 @@ rightside:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (TiGetClient(tp) == extNbrUn && TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, tilePlaneNum);
|
||||
PUSHTILE(tp, (TileType)0, tilePlaneNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -224,7 +226,7 @@ rightside:
|
|||
donesides:
|
||||
/* Apply the client's filter procedure if one exists */
|
||||
if (arg->fra_each)
|
||||
if ((*arg->fra_each)(tile, tilePlaneNum, arg))
|
||||
if ((*arg->fra_each)(tile, dinfo, tilePlaneNum, arg))
|
||||
goto fail;
|
||||
|
||||
/* If this is a contact, visit all the other planes */
|
||||
|
|
@ -248,7 +250,7 @@ donesides:
|
|||
/* tp and tile should have the same geometry for a contact */
|
||||
if (IsSplit(tile) && IsSplit(tp))
|
||||
{
|
||||
if (SplitSide(tile))
|
||||
if (dinfo & TT_SIDE)
|
||||
{
|
||||
t = SplitRightType(tp);
|
||||
if (TTMaskHasType(mask, t))
|
||||
|
|
@ -283,7 +285,7 @@ donesides:
|
|||
t = TiGetTypeExact(tp);
|
||||
if (TTMaskHasType(mask, t))
|
||||
{
|
||||
PUSHTILE(tp, pNum);
|
||||
PUSHTILE(tp, (TileType)0, pNum);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -319,7 +321,7 @@ fail:
|
|||
/* Flush the stack */
|
||||
while (!StackEmpty(extNodeStack))
|
||||
{
|
||||
POPTILE(tile, tilePlaneNum);
|
||||
POPTILE(tile, dinfo, tilePlaneNum);
|
||||
TiSetClientPTR(tile, arg->fra_region);
|
||||
}
|
||||
return -1;
|
||||
|
|
@ -349,8 +351,9 @@ fail:
|
|||
*/
|
||||
|
||||
int
|
||||
extNbrPushFunc(tile, pla)
|
||||
extNbrPushFunc(tile, dinfo, pla)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
PlaneAndArea *pla;
|
||||
{
|
||||
Rect *tileArea;
|
||||
|
|
@ -372,7 +375,7 @@ extNbrPushFunc(tile, pla)
|
|||
}
|
||||
|
||||
/* Push tile on the stack and mark as being visited */
|
||||
PUSHTILE(tile, pla->plane);
|
||||
PUSHTILE(tile, dinfo, pla->plane);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
|
|||
int
|
||||
extEnumTilePerim(
|
||||
Tile *tpIn,
|
||||
TileType dinfo,
|
||||
const TileTypeBitMask *maskp,
|
||||
int pNum, /* Plane of perimeter */
|
||||
int (*func)(),
|
||||
|
|
@ -100,8 +101,8 @@ extEnumTilePerim(
|
|||
/* Diagonal */
|
||||
if (IsSplit(tpIn))
|
||||
{
|
||||
TileType otype = (SplitSide(tpIn)) ? SplitLeftType(tpIn): SplitRightType(tpIn);
|
||||
TileType itype = (SplitSide(tpIn)) ? SplitRightType(tpIn): SplitLeftType(tpIn);
|
||||
TileType otype = (dinfo & TT_SIDE) ? SplitLeftType(tpIn): SplitRightType(tpIn);
|
||||
TileType itype = (dinfo & TT_SIDE) ? SplitRightType(tpIn): SplitLeftType(tpIn);
|
||||
origType = TiGetTypeExact(tpIn);
|
||||
if (TTMaskHasType(&mask, otype))
|
||||
{
|
||||
|
|
@ -110,8 +111,9 @@ extEnumTilePerim(
|
|||
perimCorrect = width * width + height * height;
|
||||
perimCorrect = (int)sqrt((double)perimCorrect);
|
||||
}
|
||||
sides = (SplitSide(tpIn)) ? BD_LEFT : BD_RIGHT;
|
||||
sides |= (SplitSide(tpIn) == SplitDirection(tpIn)) ? BD_BOTTOM : BD_TOP;
|
||||
sides = (dinfo & TT_SIDE) ? BD_LEFT : BD_RIGHT;
|
||||
sides |= (((dinfo & TT_SIDE) ? 1 : 0) == SplitDirection(tpIn)) ?
|
||||
BD_BOTTOM : BD_TOP;
|
||||
TiSetBody(tpIn, itype);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
|
|||
* ExtRegion *
|
||||
* (*first)(tile, arg)
|
||||
* Tile *tile; /# Tile is on plane arg->fra_pNum #/
|
||||
* TileType dinfo; /# Split tile information #/
|
||||
* FindRegion *arg;
|
||||
* {
|
||||
* }
|
||||
|
|
@ -62,6 +63,7 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
|
|||
*
|
||||
* (*each)(tile, planeNum, arg)
|
||||
* Tile *tile;
|
||||
* TileType dinfo; /# Split tile information #/
|
||||
* int planeNum; /# May be different than arg->fra_pNum #/
|
||||
* FindRegion *arg;
|
||||
* {
|
||||
|
|
@ -155,19 +157,20 @@ ExtFindRegions(def, area, mask, connectsTo, uninit, first, each)
|
|||
*/
|
||||
|
||||
int
|
||||
extRegionAreaFunc(tile, arg)
|
||||
extRegionAreaFunc(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
FindRegion *arg;
|
||||
{
|
||||
/* Allocate a new region */
|
||||
if (arg->fra_first)
|
||||
(void) (*arg->fra_first)(tile, arg);
|
||||
(void) (*arg->fra_first)(tile, dinfo, arg);
|
||||
|
||||
if (DebugIsSet(extDebugID, extDebAreaEnum))
|
||||
extShowTile(tile, "area enum", 0);
|
||||
|
||||
/* Recursively visit all tiles surrounding this one that we connect to */
|
||||
(void) ExtFindNeighbors(tile, arg->fra_pNum, arg);
|
||||
(void) ExtFindNeighbors(tile, dinfo, arg->fra_pNum, arg);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -345,8 +345,9 @@ done:
|
|||
|
||||
#ifdef exactinteractions
|
||||
int
|
||||
extSubtreeCopyPlane(tile, plane)
|
||||
extSubtreeCopyPlane(tile, dinfo, plane)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
Plane *plane;
|
||||
{
|
||||
Rect r;
|
||||
|
|
@ -358,8 +359,9 @@ extSubtreeCopyPlane(tile, plane)
|
|||
}
|
||||
|
||||
int
|
||||
extSubtreeShrinkPlane(tile, plane)
|
||||
extSubtreeShrinkPlane(tile, dinfo, plane)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
Plane *plane;
|
||||
{
|
||||
Rect r;
|
||||
|
|
@ -374,8 +376,9 @@ extSubtreeShrinkPlane(tile, plane)
|
|||
}
|
||||
|
||||
int
|
||||
extSubtreeInterFunc(tile, ha)
|
||||
extSubtreeInterFunc(tile, dinfo, ha)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
HierExtractArg *ha;
|
||||
{
|
||||
TITORECT(tile, &ha->ha_interArea);
|
||||
|
|
@ -690,12 +693,14 @@ extSubtreeOutputCoupling(ha)
|
|||
|
||||
ck = (CoupleKey *) he->h_key.h_words;
|
||||
|
||||
tp = extNodeToTile(ck->ck_1, &ha->ha_cumFlat);
|
||||
name = extSubtreeTileToNode(tp, ck->ck_1->nreg_pnum, &ha->ha_cumFlat, ha, TRUE);
|
||||
tp = extNodeToTile(ck->ck_1, &ha->ha_cumFlat, NULL);
|
||||
name = extSubtreeTileToNode(tp, (TileType)0, ck->ck_1->nreg_pnum,
|
||||
&ha->ha_cumFlat, ha, TRUE);
|
||||
fprintf(ha->ha_outf, "cap \"%s\" ", name);
|
||||
|
||||
tp = extNodeToTile(ck->ck_2, &ha->ha_cumFlat);
|
||||
name = extSubtreeTileToNode(tp, ck->ck_2->nreg_pnum, &ha->ha_cumFlat, ha, TRUE);
|
||||
tp = extNodeToTile(ck->ck_2, &ha->ha_cumFlat, NULL);
|
||||
name = extSubtreeTileToNode(tp, (TileType)0, ck->ck_2->nreg_pnum,
|
||||
&ha->ha_cumFlat, ha, TRUE);
|
||||
fprintf(ha->ha_outf, "\"%s\" %lg\n", name, cap);
|
||||
}
|
||||
}
|
||||
|
|
@ -713,8 +718,9 @@ extSubtreeOutputCoupling(ha)
|
|||
*/
|
||||
|
||||
int
|
||||
extFoundProc(tile, clientData)
|
||||
extFoundProc(tile, dinfo, clientData)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData clientData;
|
||||
{
|
||||
return 1;
|
||||
|
|
@ -1040,9 +1046,10 @@ extSubstrateFunc(scx, ha)
|
|||
*/
|
||||
|
||||
char *
|
||||
extSubtreeTileToNode(tp, pNum, et, ha, doHard)
|
||||
Tile *tp; /* Tile whose node name is to be found */
|
||||
int pNum; /* Plane of the tile */
|
||||
extSubtreeTileToNode(tp, dinfo, pNum, et, ha, doHard)
|
||||
Tile *tp; /* Tile whose node name is to be found */
|
||||
TileType dinfo; /* Split tile information */
|
||||
int pNum; /* Plane of the tile */
|
||||
ExtTree *et; /* Yank buffer to search */
|
||||
HierExtractArg *ha; /* Extraction context */
|
||||
bool doHard; /* If TRUE, we look up this node's name the hard way
|
||||
|
|
@ -1080,12 +1087,7 @@ extSubtreeTileToNode(tp, pNum, et, ha, doHard)
|
|||
* can cause problems.
|
||||
*/
|
||||
if (IsSplit(tp))
|
||||
{
|
||||
if (SplitSide(tp))
|
||||
ttype = SplitRightType(tp);
|
||||
else
|
||||
ttype = SplitLeftType(tp);
|
||||
}
|
||||
ttype = (dinfo & TT_SIDE) ? SplitRightType(tp) : SplitLeftType(tp);
|
||||
else
|
||||
ttype = TiGetTypeExact(tp);
|
||||
|
||||
|
|
@ -1120,7 +1122,7 @@ extSubtreeTileToNode(tp, pNum, et, ha, doHard)
|
|||
/* We have to do it the hard way */
|
||||
if (!doHard) return ((char *) NULL);
|
||||
if (extHasRegion(tp, extUnInit)
|
||||
&& (reg = extSubtreeHardNode(tp, pNum, et, ha)))
|
||||
&& (reg = extSubtreeHardNode(tp, dinfo, pNum, et, ha)))
|
||||
{
|
||||
if (ExtDoWarn & EXTWARN_LABELS)
|
||||
{
|
||||
|
|
@ -1154,13 +1156,14 @@ extSubtreeTileToNode(tp, pNum, et, ha, doHard)
|
|||
*/
|
||||
|
||||
int
|
||||
extConnFindFunc(tp, preg)
|
||||
extConnFindFunc(tp, dinfo, preg)
|
||||
Tile *tp;
|
||||
TileType dinfo; // Unused, but needs to be handled
|
||||
LabRegion **preg;
|
||||
{
|
||||
if (extHasRegion(tp, extUnInit))
|
||||
{
|
||||
*preg = (LabRegion *) extGetRegion(tp);
|
||||
*preg = (LabRegion *)extGetRegion(tp);
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
|
@ -1198,8 +1201,9 @@ extConnFindFunc(tp, preg)
|
|||
*/
|
||||
|
||||
LabRegion *
|
||||
extSubtreeHardNode(tp, pNum, et, ha)
|
||||
extSubtreeHardNode(tp, dinfo, pNum, et, ha)
|
||||
Tile *tp;
|
||||
TileType dinfo;
|
||||
int pNum;
|
||||
ExtTree *et;
|
||||
HierExtractArg *ha;
|
||||
|
|
@ -1215,7 +1219,7 @@ extSubtreeHardNode(tp, pNum, et, ha)
|
|||
|
||||
if (IsSplit(tp))
|
||||
{
|
||||
if (SplitSide(tp))
|
||||
if (dinfo & TT_SIDE)
|
||||
ttype = SplitRightType(tp);
|
||||
else
|
||||
ttype = SplitLeftType(tp);
|
||||
|
|
|
|||
|
|
@ -316,8 +316,10 @@ ExtractTest(w, cmd)
|
|||
}
|
||||
|
||||
int
|
||||
extShowInter(tile)
|
||||
extShowInter(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
Rect r;
|
||||
|
||||
|
|
|
|||
|
|
@ -396,8 +396,9 @@ extTimesCellFunc(cs)
|
|||
*/
|
||||
|
||||
int
|
||||
extCountTiles(tile, cs)
|
||||
Tile *tile; /* UNUSED */
|
||||
extCountTiles(tile, dinfo, cs)
|
||||
Tile *tile; /* (unused) */
|
||||
TileType dinfo; /* (unused) */
|
||||
struct cellStats *cs;
|
||||
{
|
||||
cs->cs_rects++;
|
||||
|
|
@ -1115,8 +1116,9 @@ extInterAreaFunc(use, f)
|
|||
}
|
||||
|
||||
int
|
||||
extInterCountFunc(tile, pArea)
|
||||
extInterCountFunc(tile, dinfo, pArea)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
int *pArea;
|
||||
{
|
||||
Rect r;
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ extern void ExtGetZAxis();
|
|||
|
||||
extern void ExtDumpCaps();
|
||||
|
||||
extern int extEnumTilePerim(Tile *tpIn, const TileTypeBitMask *maskp, int pNum, int (*func)(), ClientData cdata);
|
||||
extern int extEnumTilePerim(Tile *tpIn, TileType dinfo, const TileTypeBitMask *maskp, int pNum, int (*func)(), ClientData cdata);
|
||||
extern Plane *extPrepSubstrate();
|
||||
|
||||
/* C99 compat */
|
||||
|
|
|
|||
|
|
@ -989,44 +989,43 @@ extern ClientData extUnInit;
|
|||
/* because the search algorithm can overwrite it between the */
|
||||
/* time the tile is pushed and the time that it is popped. */
|
||||
|
||||
#define PUSHTILE(tp, pl) \
|
||||
#define PUSHTILE(tp, di, pl) \
|
||||
(tp)->ti_client = VISITPENDING; \
|
||||
STACKPUSH((ClientData)(pointertype)(pl | \
|
||||
((TileType)(spointertype)(tp)->ti_body & TT_SIDE)), extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype)pl, extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype)di, extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype)tp, extNodeStack)
|
||||
|
||||
#define POPTILE(tp, pl) \
|
||||
#define POPTILE(tp, di, pl) \
|
||||
tp = (Tile *) STACKPOP(extNodeStack); \
|
||||
pl = (spointertype) STACKPOP(extNodeStack); \
|
||||
if (pl & TT_SIDE) { \
|
||||
TiSetBody((tp), TiGetTypeExact(tp) | TT_SIDE); \
|
||||
pl &= (~TT_SIDE); \
|
||||
} \
|
||||
else \
|
||||
TiSetBody((tp), TiGetTypeExact(tp) & (~TT_SIDE))
|
||||
di = (spointertype) STACKPOP(extNodeStack); \
|
||||
pl = (spointertype) STACKPOP(extNodeStack)
|
||||
|
||||
/* Variations of "pushtile" to force a specific value on TT_SIDE */
|
||||
|
||||
#define PUSHTILEBOTTOM(tp, pl) \
|
||||
(tp)->ti_client = VISITPENDING; \
|
||||
STACKPUSH((ClientData)(pointertype)(pl | \
|
||||
((SplitDirection(tp)) ? 0 : TT_SIDE)), extNodeStack) ;\
|
||||
STACKPUSH((ClientData)(pointertype)pl, extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype) \
|
||||
((SplitDirection(tp)) ? 0 : TT_SIDE), extNodeStack) ;\
|
||||
STACKPUSH((ClientData)(pointertype)tp, extNodeStack)
|
||||
|
||||
#define PUSHTILETOP(tp, pl) \
|
||||
(tp)->ti_client = VISITPENDING; \
|
||||
STACKPUSH((ClientData)(pointertype)(pl | \
|
||||
((SplitDirection(tp)) ? TT_SIDE : 0)), extNodeStack) ;\
|
||||
STACKPUSH((ClientData)(pointertype)pl, extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype) \
|
||||
((SplitDirection(tp)) ? TT_SIDE : 0), extNodeStack) ;\
|
||||
STACKPUSH((ClientData)(pointertype)tp, extNodeStack)
|
||||
|
||||
#define PUSHTILELEFT(tp, pl) \
|
||||
(tp)->ti_client = VISITPENDING; \
|
||||
STACKPUSH((ClientData)(pointertype)(pl), extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype)0, extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype)tp, extNodeStack)
|
||||
|
||||
#define PUSHTILERIGHT(tp, pl) \
|
||||
(tp)->ti_client = VISITPENDING; \
|
||||
STACKPUSH((ClientData)(pointertype)(pl | TT_SIDE), extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype)pl, extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype)TT_SIDE, extNodeStack); \
|
||||
STACKPUSH((ClientData)(pointertype)tp, extNodeStack)
|
||||
|
||||
/* ------------------------- Region finding --------------------------- */
|
||||
|
|
@ -1058,7 +1057,7 @@ extern Tile *extNodeToTile();
|
|||
Tile *tp; \
|
||||
\
|
||||
(nnew) = (NodeRegion *) NULL; \
|
||||
tp = extNodeToTile((nold), (et)); \
|
||||
tp = extNodeToTile((nold), (et), (TileType)NULL); \
|
||||
if (tp && extHasRegion(tp, extUnInit)) \
|
||||
(nnew) = (NodeRegion *) extGetRegion(tp); \
|
||||
}
|
||||
|
|
|
|||
|
|
@ -482,8 +482,9 @@ gaPropagateBlockages(list)
|
|||
*/
|
||||
|
||||
int
|
||||
gaSetClient(tile, cdata)
|
||||
gaSetClient(tile, dinfo, cdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData cdata;
|
||||
{
|
||||
tile->ti_client = (ClientData) cdata;
|
||||
|
|
@ -511,8 +512,9 @@ gaSetClient(tile, cdata)
|
|||
*/
|
||||
|
||||
int
|
||||
gaSplitTile(tile, r)
|
||||
gaSplitTile(tile, dinfo, r)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
Rect *r;
|
||||
{
|
||||
Tile *tp;
|
||||
|
|
@ -632,7 +634,7 @@ gaInitRiverBlockages(routeUse, ch)
|
|||
}
|
||||
|
||||
int
|
||||
gaAlwaysOne()
|
||||
gaAlwaysOne(Tile *tile, TileType dinfo, ClientData clientdata)
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -572,8 +572,9 @@ gaIsClear(use, r, mask)
|
|||
*/
|
||||
|
||||
int
|
||||
gaIsClearFunc(tile, cxp)
|
||||
gaIsClearFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
TreeContext *cxp;
|
||||
{
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -322,6 +322,7 @@ overlap:
|
|||
}
|
||||
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* gaStemContainingChannelFunc --
|
||||
*
|
||||
* Called via DBSrPaintArea on behalf of gaStemContainingChannel above
|
||||
|
|
@ -341,8 +342,9 @@ overlap:
|
|||
*/
|
||||
|
||||
int
|
||||
gaStemContainingChannelFunc(tile, pCh)
|
||||
gaStemContainingChannelFunc(tile, dinfo, pCh)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
GCRChannel **pCh;
|
||||
{
|
||||
GCRChannel *ch;
|
||||
|
|
|
|||
|
|
@ -254,8 +254,9 @@ GAGenChans(chanType, area, f)
|
|||
*/
|
||||
|
||||
int
|
||||
gaSplitOut(tile, f)
|
||||
gaSplitOut(tile, dinfo, f)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
FILE *f;
|
||||
{
|
||||
Rect r;
|
||||
|
|
|
|||
|
|
@ -231,9 +231,10 @@ w3dFillDiagonal(x1, y1, x2, y2, ztop, zbot)
|
|||
}
|
||||
|
||||
void
|
||||
w3dFillOps(trans, tile, cliprect, ztop, zbot)
|
||||
w3dFillOps(trans, tile, dinfo, cliprect, ztop, zbot)
|
||||
Transform *trans;
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
Rect *cliprect;
|
||||
float ztop;
|
||||
float zbot;
|
||||
|
|
@ -254,15 +255,15 @@ w3dFillOps(trans, tile, cliprect, ztop, zbot)
|
|||
if (IsSplit(tile))
|
||||
{
|
||||
Rect fullr;
|
||||
TileType dinfo;
|
||||
TileType newdinfo;
|
||||
|
||||
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), trans);
|
||||
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, trans);
|
||||
|
||||
fullr = r;
|
||||
if (cliprect != NULL)
|
||||
GeoClip(&r, cliprect);
|
||||
|
||||
GrClipTriangle(&fullr, &r, cliprect != NULL, dinfo, p, &np);
|
||||
GrClipTriangle(&fullr, &r, cliprect != NULL, newdinfo, p, &np);
|
||||
|
||||
if (np > 0)
|
||||
{
|
||||
|
|
@ -289,7 +290,7 @@ w3dFillOps(trans, tile, cliprect, ztop, zbot)
|
|||
|
||||
/* Find tile outline and render sides */
|
||||
|
||||
if (GrBoxOutline(tile, &tilesegs))
|
||||
if (GrBoxOutline(tile, dinfo, &tilesegs))
|
||||
{
|
||||
xbot = (float)r.r_xbot;
|
||||
ybot = (float)r.r_ybot;
|
||||
|
|
@ -380,8 +381,9 @@ w3dFillOps(trans, tile, cliprect, ztop, zbot)
|
|||
}
|
||||
|
||||
void
|
||||
w3dRenderVolume(tile, trans, cliprect)
|
||||
w3dRenderVolume(tile, dinfo, trans, cliprect)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
Transform *trans;
|
||||
Rect *cliprect;
|
||||
{
|
||||
|
|
@ -403,7 +405,7 @@ w3dRenderVolume(tile, trans, cliprect)
|
|||
|
||||
if ((grCurFill == GR_STSOLID) || (grCurFill == GR_STSTIPPLE))
|
||||
{
|
||||
w3dFillOps(trans, tile, cliprect, ztop, zbot);
|
||||
w3dFillOps(trans, tile, dinfo, cliprect, ztop, zbot);
|
||||
}
|
||||
|
||||
/* To do: Outlines and contact crosses */
|
||||
|
|
@ -411,8 +413,9 @@ w3dRenderVolume(tile, trans, cliprect)
|
|||
}
|
||||
|
||||
void
|
||||
w3dRenderCIF(tile, layer, trans)
|
||||
w3dRenderCIF(tile, dinfo, layer, trans)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
CIFLayer *layer;
|
||||
Transform *trans;
|
||||
{
|
||||
|
|
@ -435,7 +438,7 @@ w3dRenderCIF(tile, layer, trans)
|
|||
|
||||
if ((grCurFill == GR_STSOLID) || (grCurFill == GR_STSTIPPLE))
|
||||
{
|
||||
w3dFillOps(trans, tile, NULL, ztop, zbot);
|
||||
w3dFillOps(trans, tile, dinfo, NULL, ztop, zbot);
|
||||
}
|
||||
|
||||
/* To do: Outlines */
|
||||
|
|
@ -543,8 +546,9 @@ w3dSetProjection(w)
|
|||
/* Magic layer tile painting function */
|
||||
|
||||
int
|
||||
w3dPaintFunc(tile, cxp)
|
||||
w3dPaintFunc(tile, dinfo, cxp)
|
||||
Tile *tile; /* Tile to be displayed */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* From DBTreeSrTiles */
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -582,15 +586,16 @@ w3dPaintFunc(tile, cxp)
|
|||
w3dNeedStyle = FALSE;
|
||||
}
|
||||
|
||||
w3dRenderVolume(tile, &scx->scx_trans, &scx->scx_area);
|
||||
w3dRenderVolume(tile, dinfo, &scx->scx_trans, &scx->scx_area);
|
||||
return 0; /* keep the search going! */
|
||||
}
|
||||
|
||||
/* CIF layer tile painting function */
|
||||
|
||||
int
|
||||
w3dCIFPaintFunc(tile, arg)
|
||||
w3dCIFPaintFunc(tile, dinfo, arg)
|
||||
Tile *tile; /* Tile to be displayed */
|
||||
TileType dinfo; /* Split tile information */
|
||||
ClientData *arg; /* is NULL */
|
||||
{
|
||||
CIFLayer *layer = (CIFLayer *)arg;
|
||||
|
|
@ -626,7 +631,7 @@ w3dCIFPaintFunc(tile, arg)
|
|||
w3dNeedStyle = FALSE;
|
||||
}
|
||||
|
||||
w3dRenderCIF(tile, layer, &GeoIdentityTransform);
|
||||
w3dRenderCIF(tile, dinfo, layer, &GeoIdentityTransform);
|
||||
return 0; /* keep the search going! */
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -571,8 +571,9 @@ grAddSegment(llx, lly, urx, ury, segments)
|
|||
*/
|
||||
|
||||
bool
|
||||
GrBoxOutline(tile, tilesegs)
|
||||
GrBoxOutline(tile, dinfo, tilesegs)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
LinkedRect **tilesegs;
|
||||
{
|
||||
Rect rect;
|
||||
|
|
@ -586,7 +587,7 @@ GrBoxOutline(tile, tilesegs)
|
|||
*tilesegs = NULL;
|
||||
TiToRect(tile, &rect);
|
||||
|
||||
if (IsSplit(tile) && SplitSide(tile))
|
||||
if (IsSplit(tile) && (dinfo & TT_SIDE))
|
||||
isolate |= 0x1;
|
||||
else
|
||||
{
|
||||
|
|
@ -620,7 +621,7 @@ GrBoxOutline(tile, tilesegs)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (IsSplit(tile) && !SplitSide(tile))
|
||||
if (IsSplit(tile) && !(dinfo & TT_SIDE))
|
||||
isolate |= 0x2;
|
||||
else
|
||||
{
|
||||
|
|
@ -656,7 +657,7 @@ GrBoxOutline(tile, tilesegs)
|
|||
}
|
||||
|
||||
if (IsSplit(tile) &&
|
||||
(SplitSide(tile) == SplitDirection(tile)))
|
||||
(((dinfo & TT_SIDE) ? 1 : 0) == SplitDirection(tile)))
|
||||
isolate |= 0x4;
|
||||
else
|
||||
{
|
||||
|
|
@ -692,7 +693,7 @@ GrBoxOutline(tile, tilesegs)
|
|||
}
|
||||
|
||||
if (IsSplit(tile) &&
|
||||
(SplitSide(tile) != SplitDirection(tile)))
|
||||
(((dinfo & TT_SIDE) ? 1 : 0) != SplitDirection(tile)))
|
||||
isolate |= 0x8;
|
||||
else
|
||||
{
|
||||
|
|
@ -773,7 +774,7 @@ GrBoxOutline(tile, tilesegs)
|
|||
*---------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
GrBox(MagWindow *mw, Transform *trans, Tile *tile)
|
||||
GrBox(MagWindow *mw, Transform *trans, Tile *tile, TileType dinfo)
|
||||
{
|
||||
Rect r, r2, clipr;
|
||||
bool needClip, needObscure, simpleBox;
|
||||
|
|
@ -813,16 +814,16 @@ GrBox(MagWindow *mw, Transform *trans, Tile *tile)
|
|||
if (IsSplit(tile))
|
||||
{
|
||||
/* Perform matrix transformations on split tiles */
|
||||
TileType dinfo;
|
||||
TileType newdinfo;
|
||||
Rect fullr;
|
||||
|
||||
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), trans);
|
||||
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, trans);
|
||||
clipr = fullr = r;
|
||||
|
||||
if (needClip)
|
||||
GeoClip(&clipr, &grCurClip);
|
||||
|
||||
GrClipTriangle(&fullr, &clipr, needClip, dinfo, polyp, &np);
|
||||
GrClipTriangle(&fullr, &clipr, needClip, newdinfo, polyp, &np);
|
||||
|
||||
if ((grCurFill == GR_STSOLID) ||
|
||||
(grCurFill == GR_STSTIPPLE) || (grCurFill == GR_STGRID) )
|
||||
|
|
@ -891,7 +892,7 @@ GrBox(MagWindow *mw, Transform *trans, Tile *tile)
|
|||
|
||||
if (grCurOutline != 0)
|
||||
{
|
||||
if (GrBoxOutline(tile, &tilesegs))
|
||||
if (GrBoxOutline(tile, dinfo, &tilesegs))
|
||||
{
|
||||
/* simple box (from GrFastBox)*/
|
||||
|
||||
|
|
|
|||
|
|
@ -235,8 +235,10 @@ glChanBuildMap(chanList)
|
|||
*/
|
||||
|
||||
int
|
||||
glChanFeedFunc(tile)
|
||||
glChanFeedFunc(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
char *mesg;
|
||||
Rect r;
|
||||
|
|
@ -342,8 +344,9 @@ glChanCheckCover(chanList, mask)
|
|||
*/
|
||||
|
||||
int
|
||||
glChanCheckFunc(tile, ch)
|
||||
glChanCheckFunc(tile, dinfo, ch)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
GCRChannel *ch;
|
||||
{
|
||||
char mesg[1024];
|
||||
|
|
@ -454,8 +457,10 @@ glChanShowTiles(mesg)
|
|||
}
|
||||
|
||||
int
|
||||
glChanShowFunc(tile)
|
||||
glChanShowFunc(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
GCRChannel *ch;
|
||||
char mesg[1024];
|
||||
|
|
@ -498,8 +503,9 @@ glChanShowFunc(tile)
|
|||
*/
|
||||
|
||||
int
|
||||
glChanClipFunc(tile, area)
|
||||
glChanClipFunc(tile, dinfo, area)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
Rect *area;
|
||||
{
|
||||
ClientData tileClient = tile->ti_client;
|
||||
|
|
@ -567,8 +573,10 @@ glChanClipFunc(tile, area)
|
|||
*/
|
||||
|
||||
int
|
||||
glChanMergeFunc(tile)
|
||||
glChanMergeFunc(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
GCRChannel *ch = (GCRChannel *) tile->ti_client;
|
||||
Tile *delayed = NULL; /* delayed free to extend lifetime */
|
||||
|
|
@ -774,8 +782,9 @@ glChanBlockDens(ch)
|
|||
}
|
||||
|
||||
int
|
||||
glChanPaintFunc(tile, type)
|
||||
glChanPaintFunc(tile, dinfo, type)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TileType type;
|
||||
{
|
||||
static TileType changeTable[4][4] = {
|
||||
|
|
@ -869,8 +878,9 @@ glChanFlood(area, type)
|
|||
}
|
||||
|
||||
int
|
||||
glChanFloodVFunc(tile, area)
|
||||
glChanFloodVFunc(tile, dinfo, area)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
Rect *area;
|
||||
{
|
||||
PaintArea *pa;
|
||||
|
|
@ -888,8 +898,9 @@ glChanFloodVFunc(tile, area)
|
|||
}
|
||||
|
||||
int
|
||||
glChanFloodHFunc(tile, area)
|
||||
glChanFloodHFunc(tile, dinfo, area)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
Rect *area;
|
||||
{
|
||||
PaintArea *pa;
|
||||
|
|
@ -928,8 +939,10 @@ glChanFloodHFunc(tile, area)
|
|||
*/
|
||||
|
||||
int
|
||||
glChanSplitRiver(tile)
|
||||
glChanSplitRiver(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
ClientData tileClient = tile->ti_client;
|
||||
Tile *tp, *newTile;
|
||||
|
|
@ -1009,8 +1022,10 @@ glChanSplitRiver(tile)
|
|||
*/
|
||||
|
||||
int
|
||||
glChanRiverBlock(tile)
|
||||
glChanRiverBlock(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
GCRPin *pin, *pinLast;
|
||||
GCRChannel *ch;
|
||||
|
|
|
|||
|
|
@ -1010,6 +1010,7 @@ DefReadNonDefaultRules(
|
|||
int
|
||||
defFoundOneFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
Tile **tret)
|
||||
{
|
||||
*tret = tile;
|
||||
|
|
|
|||
|
|
@ -668,7 +668,9 @@ defnodeVisit(
|
|||
TileType magictype;
|
||||
LinkedRect *lr;
|
||||
EFNodeName *thisnn;
|
||||
int defNetGeometryFunc(Tile *tile, int plane, DefData *defdata); /* Forward declaration */
|
||||
|
||||
/* Forward declaration */
|
||||
int defNetGeometryFunc(Tile *tile, TileType dinfo, int plane, DefData *defdata);
|
||||
|
||||
/* For regular nets, only count those nodes having port */
|
||||
/* connections. For special nets, only count those nodes */
|
||||
|
|
@ -781,7 +783,9 @@ defnodeVisit(
|
|||
|
||||
Rect rport;
|
||||
SearchContext scx;
|
||||
int defPortTileFunc(Tile *tile, TreeContext *cx); /* Fwd declaration */
|
||||
|
||||
/* Forward declaration */
|
||||
int defPortTileFunc(Tile *tile, TileType dinfo, TreeContext *cx);
|
||||
|
||||
scx.scx_area = node->efnode_loc;
|
||||
scx.scx_use = def->cd_parents;
|
||||
|
|
@ -842,6 +846,7 @@ defnodeVisit(
|
|||
int
|
||||
defMaxWireFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
int *yclip)
|
||||
{
|
||||
if (BOTTOM(tile) < (*yclip)) *yclip = BOTTOM(tile);
|
||||
|
|
@ -854,6 +859,7 @@ defMaxWireFunc(
|
|||
int
|
||||
defMinWireFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
int *yclip)
|
||||
{
|
||||
if (TOP(tile) > (*yclip)) *yclip = TOP(tile);
|
||||
|
|
@ -871,6 +877,7 @@ defMinWireFunc(
|
|||
int
|
||||
defExemptWireFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
Rect *rect)
|
||||
{
|
||||
Rect r;
|
||||
|
|
@ -896,6 +903,7 @@ defExemptWireFunc(
|
|||
int
|
||||
defPortTileFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
TreeContext *cx)
|
||||
{
|
||||
SearchContext *scx = cx->tc_scx;
|
||||
|
|
@ -921,6 +929,7 @@ defPortTileFunc(
|
|||
int
|
||||
defNetGeometryFunc(
|
||||
Tile *tile, /* Tile being visited */
|
||||
TileType dinfo, /* Split tile information (unused) */
|
||||
int plane, /* Plane of the tile being visited */
|
||||
DefData *defdata) /* Data passed to this function */
|
||||
{
|
||||
|
|
@ -1654,7 +1663,9 @@ defCountVias(
|
|||
TileType ttype, stype;
|
||||
int pNum;
|
||||
CViaData cviadata;
|
||||
int defCountViaFunc(Tile *tile, CViaData *cviadata);
|
||||
|
||||
/* Forward declaration */
|
||||
int defCountViaFunc(Tile *tile, TileType dinfo, CViaData *cviadata);
|
||||
|
||||
cviadata.scale = oscale;
|
||||
cviadata.total = 0;
|
||||
|
|
@ -1699,7 +1710,9 @@ defCountVias(
|
|||
|
||||
int
|
||||
defCheckFunc(
|
||||
Tile *tile)
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -1709,6 +1722,7 @@ defCheckFunc(
|
|||
int
|
||||
defCountViaFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
CViaData *cviadata)
|
||||
{
|
||||
TileType ttype = TiGetType(tile), ctype, rtype;
|
||||
|
|
@ -2459,7 +2473,8 @@ defWriteBlockages(
|
|||
HashEntry *he;
|
||||
TileTypeBitMask ExtraObsLayersMask;
|
||||
|
||||
int defSimpleBlockageFunc(Tile *tile, DefObsData *defobsdata); /* Forward declaration */
|
||||
/* Forward declarations */
|
||||
int defSimpleBlockageFunc(Tile *tile, TileType dinfo, DefObsData *defobsdata);
|
||||
int defblockageVisit(EFNode *node, int res, EFCapValue cap, DefObsData *defobsdata);
|
||||
|
||||
defobsdata.def = rootDef;
|
||||
|
|
@ -2680,9 +2695,10 @@ defBlockageGeometryFunc(
|
|||
int
|
||||
defSimpleBlockageFunc(
|
||||
Tile *tile, /* Tile being visited */
|
||||
TileType dinfo, /* Split tile information */
|
||||
DefObsData *defobsdata) /* Data passed to this function */
|
||||
{
|
||||
TileType ttype = TiGetTypeExact(tile);
|
||||
TileType ttype = TiGetTypeExact(tile) | dinfo;
|
||||
TileType loctype;
|
||||
Rect r;
|
||||
LinkedRect *lr;
|
||||
|
|
|
|||
|
|
@ -1156,6 +1156,7 @@ typedef struct _plane_type {
|
|||
int
|
||||
lefConnectFunc(
|
||||
Tile *tile,
|
||||
TileType dinfo, // Not handled, but should be.
|
||||
TreeContext *cxp)
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -1189,7 +1190,8 @@ lefConnectFunc(
|
|||
|
||||
int
|
||||
lefUnconnectFunc(
|
||||
Tile *tile,
|
||||
Tile *tile, /* (unused) */
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -499,6 +499,7 @@ typedef struct
|
|||
int
|
||||
lefEraseGeometry(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData cdata)
|
||||
{
|
||||
lefClient *lefdata = (lefClient *)cdata;
|
||||
|
|
@ -508,7 +509,7 @@ lefEraseGeometry(
|
|||
|
||||
TiToRect(tile, &area);
|
||||
|
||||
otype = TiGetTypeExact(tile);
|
||||
otype = TiGetTypeExact(tile) | dinfo;
|
||||
if (IsSplit(tile))
|
||||
ttype = (otype & TT_SIDE) ? SplitRightType(tile) :
|
||||
SplitLeftType(tile);
|
||||
|
|
@ -541,6 +542,7 @@ lefEraseGeometry(
|
|||
int
|
||||
lefGetBound(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData cdata)
|
||||
{
|
||||
Rect *boundary = (Rect *)cdata;
|
||||
|
|
@ -569,6 +571,7 @@ lefGetBound(
|
|||
int
|
||||
lefHasPaint(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData clientData)
|
||||
{
|
||||
return 1;
|
||||
|
|
@ -588,14 +591,18 @@ lefHasPaint(
|
|||
int
|
||||
lefAccumulateArea(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData cdata)
|
||||
{
|
||||
int *area = (int *)cdata;
|
||||
int locarea;
|
||||
Rect rarea;
|
||||
|
||||
TiToRect(tile, &rarea);
|
||||
|
||||
*area += (rarea.r_xtop - rarea.r_xbot) * (rarea.r_ytop - rarea.r_ybot);
|
||||
locarea = (rarea.r_xtop - rarea.r_xbot) * (rarea.r_ytop - rarea.r_ybot);
|
||||
if (IsSplit(tile)) locarea /= 2;
|
||||
*area += locarea;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -614,6 +621,7 @@ lefAccumulateArea(
|
|||
int
|
||||
lefFindTopmost(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData cdata)
|
||||
{
|
||||
return 1; /* Stop processing on the first tile found */
|
||||
|
|
@ -636,6 +644,7 @@ lefFindTopmost(
|
|||
int
|
||||
lefYankGeometry(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData cdata)
|
||||
{
|
||||
lefClient *lefdata = (lefClient *)cdata;
|
||||
|
|
@ -648,7 +657,7 @@ lefYankGeometry(
|
|||
/* Ignore marked tiles */
|
||||
if (TiGetClient(tile) != CLIENTDEFAULT) return 0;
|
||||
|
||||
otype = TiGetTypeExact(tile);
|
||||
otype = TiGetTypeExact(tile) | dinfo;
|
||||
if (IsSplit(tile))
|
||||
ttype = (otype & TT_SIDE) ? SplitRightType(tile) :
|
||||
SplitLeftType(tile);
|
||||
|
|
@ -727,6 +736,7 @@ lefYankGeometry(
|
|||
int
|
||||
lefYankContacts(
|
||||
Tile *tile,
|
||||
TileType dinfo, /* (unused) */
|
||||
ClientData cdata)
|
||||
{
|
||||
lefClient *lefdata = (lefClient *)cdata;
|
||||
|
|
@ -795,13 +805,14 @@ lefYankContacts(
|
|||
int
|
||||
lefWriteGeometry(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData cdata)
|
||||
{
|
||||
lefClient *lefdata = (lefClient *)cdata;
|
||||
FILE *f = lefdata->file;
|
||||
float scale = lefdata->oscale;
|
||||
char leffmt[6][16];
|
||||
TileType ttype, otype = TiGetTypeExact(tile);
|
||||
TileType ttype, otype = TiGetTypeExact(tile) | dinfo;
|
||||
LefMapping *lefMagicToLefLayer = lefdata->lefMagicMap;
|
||||
|
||||
/* Ignore tiles that have already been output */
|
||||
|
|
|
|||
|
|
@ -169,8 +169,9 @@ LispGetPoint (name,s,f)
|
|||
*-----------------------------------------------------------------------------
|
||||
*/
|
||||
static int
|
||||
lispprinttile (tile,cxp)
|
||||
lispprinttile (tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
TileType type;
|
||||
|
|
|
|||
|
|
@ -234,9 +234,9 @@ mzBuildMaskDataBlocks(buildArea)
|
|||
*/
|
||||
|
||||
int
|
||||
mzBuildBlockFunc(tile, cxp)
|
||||
|
||||
mzBuildBlockFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; // Unused
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -317,7 +317,7 @@ mzBlockSubcellsFunc(scx, cdarg)
|
|||
*/
|
||||
|
||||
int
|
||||
mzPaintSameNodeFunc(Tile *t, Rect *buildArea)
|
||||
mzPaintSameNodeFunc(Tile *t, TileType dinfo, Rect *buildArea)
|
||||
{
|
||||
Rect r;
|
||||
TileType ttype;
|
||||
|
|
@ -580,8 +580,9 @@ mzBuildFenceBlocks(buildArea)
|
|||
*/
|
||||
|
||||
int
|
||||
mzBuildFenceBlocksFunc(tile, buildArea)
|
||||
mzBuildFenceBlocksFunc(tile, dinfo, buildArea)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
Rect *buildArea; /* clip to this area before painting */
|
||||
{
|
||||
RouteType *rT;
|
||||
|
|
@ -723,8 +724,9 @@ mzExtendBlockBoundsR(rect)
|
|||
*/
|
||||
|
||||
int
|
||||
mzExtendBlockFunc(tile, cdarg)
|
||||
mzExtendBlockFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData cdarg;
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -932,8 +934,9 @@ mzBuildDestAreaBlocks()
|
|||
*/
|
||||
|
||||
int
|
||||
mzDestAreaFunc(tile, cxp)
|
||||
mzDestAreaFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -1011,8 +1014,9 @@ mzDestAreaFunc(tile, cxp)
|
|||
*/
|
||||
|
||||
int
|
||||
mzDestWalksFunc(tile, cxp)
|
||||
mzDestWalksFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -1096,8 +1100,9 @@ mzDestWalksFunc(tile, cxp)
|
|||
*/
|
||||
|
||||
int
|
||||
mzHWalksFunc(tile, cdarg)
|
||||
mzHWalksFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData cdarg;
|
||||
{
|
||||
RouteType *rT = (RouteType *) cdarg;
|
||||
|
|
@ -1184,8 +1189,9 @@ mzHWalksFunc(tile, cdarg)
|
|||
*/
|
||||
|
||||
int
|
||||
mzVWalksFunc(tile, cdarg)
|
||||
mzVWalksFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData cdarg;
|
||||
{
|
||||
RouteType *rT = (RouteType *) cdarg;
|
||||
|
|
@ -1282,8 +1288,9 @@ typedef struct walkContactFuncData
|
|||
*/
|
||||
|
||||
int
|
||||
mzLRCWalksFunc(tile, cdarg)
|
||||
mzLRCWalksFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData cdarg;
|
||||
{
|
||||
RouteType *rT = (RouteType *) cdarg; /* RouteType of this dest area */
|
||||
|
|
@ -1365,8 +1372,9 @@ mzLRCWalksFunc(tile, cdarg)
|
|||
*/
|
||||
|
||||
int
|
||||
mzUDCWalksFunc(tile, cdarg)
|
||||
mzUDCWalksFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData cdarg;
|
||||
{
|
||||
RouteType *rT = (RouteType *) cdarg; /* RouteType of this dest area */
|
||||
|
|
|
|||
|
|
@ -526,8 +526,9 @@ mzDumpTags(area)
|
|||
*/
|
||||
|
||||
int
|
||||
mzDumpTagsFunc(tile, cxp)
|
||||
mzDumpTagsFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
|
|||
|
|
@ -487,8 +487,9 @@ mzCleanEstimate()
|
|||
*/
|
||||
|
||||
int
|
||||
mzReclaimTCFunc(tile, notUsed)
|
||||
mzReclaimTCFunc(tile, dinfo, notUsed)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData notUsed;
|
||||
{
|
||||
if (tile->ti_client != (ClientData)CLIENTDEFAULT)
|
||||
|
|
@ -536,8 +537,9 @@ mzReclaimTCFunc(tile, notUsed)
|
|||
*/
|
||||
|
||||
int
|
||||
mzProcessDestEstFunc(tile, cxp)
|
||||
mzProcessDestEstFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -608,8 +610,9 @@ mzProcessDestEstFunc(tile, cxp)
|
|||
*/
|
||||
|
||||
int
|
||||
mzDestTileEstFunc(tile, cdarg)
|
||||
mzDestTileEstFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData cdarg;
|
||||
{
|
||||
Rect rect;
|
||||
|
|
@ -658,8 +661,9 @@ mzDestTileEstFunc(tile, cdarg)
|
|||
*/
|
||||
|
||||
int
|
||||
mzAddSubcellEstFunc(scx, cdarg)
|
||||
mzAddSubcellEstFunc(scx, dinfo, cdarg)
|
||||
SearchContext *scx;
|
||||
TileType dinfo;
|
||||
ClientData cdarg;
|
||||
{
|
||||
Rect r, rDest;
|
||||
|
|
@ -699,8 +703,9 @@ mzAddSubcellEstFunc(scx, cdarg)
|
|||
*/
|
||||
|
||||
int
|
||||
mzAddFenceEstFunc(tile, buildArea)
|
||||
mzAddFenceEstFunc(tile, dinfo, buildArea)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
Rect *buildArea; /* currently ignored */
|
||||
{
|
||||
Rect r;
|
||||
|
|
@ -737,8 +742,9 @@ mzAddFenceEstFunc(tile, buildArea)
|
|||
*/
|
||||
|
||||
int
|
||||
mzBuildSolidsListFunc(tile, listPtr)
|
||||
mzBuildSolidsListFunc(tile, dinfo, listPtr)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
List **listPtr; /* pointer to list to add tile to */
|
||||
{
|
||||
LIST_ADD(tile,*listPtr);
|
||||
|
|
@ -764,8 +770,9 @@ mzBuildSolidsListFunc(tile, listPtr)
|
|||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
int
|
||||
mzAssignCostsFunc(tile, spaceCosts)
|
||||
mzAssignCostsFunc(tile, dinfo, spaceCosts)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
TileCosts *spaceCosts; /* costs to assign to space tiles */
|
||||
{
|
||||
Tile *tRight, *tUp;
|
||||
|
|
@ -862,8 +869,9 @@ mzAssignCostsFunc(tile, spaceCosts)
|
|||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
int
|
||||
mzDestInitialAssignFunc(tile, cdarg)
|
||||
mzDestInitialAssignFunc(tile, dinfo, cdarg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData cdarg;
|
||||
{
|
||||
Heap *adjHeap = (Heap *) cdarg;
|
||||
|
|
@ -904,8 +912,9 @@ mzDestInitialAssignFunc(tile, cdarg)
|
|||
*/
|
||||
|
||||
int
|
||||
mzBuildEstimatesFunc(tile, notUsed)
|
||||
mzBuildEstimatesFunc(tile, dinfo, notUsed)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData notUsed;
|
||||
{
|
||||
|
||||
|
|
@ -1316,8 +1325,9 @@ AlwaysAsGood(est1, est2, tile)
|
|||
*/
|
||||
|
||||
int
|
||||
mzTrimEstimatesFunc(tile, notUsed)
|
||||
mzTrimEstimatesFunc(tile, dinfo, notUsed)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData notUsed;
|
||||
{
|
||||
TileCosts *tc = (TileCosts *) (tile->ti_client);
|
||||
|
|
@ -1966,8 +1976,9 @@ mzDumpEstimates(area,fd)
|
|||
*/
|
||||
|
||||
int
|
||||
mzDumpEstFunc(tile, fd)
|
||||
mzDumpEstFunc(tile, dinfo, fd)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
FILE *fd;
|
||||
{
|
||||
Rect r;
|
||||
|
|
|
|||
|
|
@ -141,8 +141,9 @@ mzBuildHFR(srcUse, area)
|
|||
*/
|
||||
|
||||
int
|
||||
mzBuildHFRFunc(tile, cxp)
|
||||
mzBuildHFRFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ extern bool mzAddInitialContacts();
|
|||
*/
|
||||
|
||||
int
|
||||
mzFindSamenodeFunc(Tile *tile, Point *point)
|
||||
mzFindSamenodeFunc(Tile *tile, TileType dinfo, Point *point)
|
||||
{
|
||||
*point = tile->ti_ll;
|
||||
return 1;
|
||||
|
|
|
|||
|
|
@ -412,8 +412,9 @@ mzMarkConnectedTiles(rect, type, expandType)
|
|||
*/
|
||||
|
||||
int
|
||||
mzConnectedTileFunc(tile, cxp)
|
||||
mzConnectedTileFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
/* If tile not marked, mark it, add it to marked list, and add
|
||||
|
|
|
|||
|
|
@ -122,15 +122,16 @@ NMRedrawCell(window, plane)
|
|||
}
|
||||
|
||||
int
|
||||
nmscRedrawFunc(tile, window)
|
||||
nmscRedrawFunc(tile, dinfo, window)
|
||||
Tile *tile; /* Tile to be redisplayed on highlight layer.*/
|
||||
TileType dinfo; /* Split tile information */
|
||||
MagWindow *window; /* Window in which to redisplay. */
|
||||
{
|
||||
Rect area, screenArea;
|
||||
extern int nmscAlways1(); /* Forward reference. */
|
||||
|
||||
TiToRect(tile, &area);
|
||||
if (!DBSrPaintArea((Tile *) NULL, nmscPlane, &area,
|
||||
if (!DBSrPaintNMArea((Tile *)NULL, nmscPlane, dinfo, &area,
|
||||
&DBAllButSpaceBits, nmscAlways1, (ClientData) NULL))
|
||||
return 0;
|
||||
WindSurfaceToScreen(window, &area, &screenArea);
|
||||
|
|
@ -139,7 +140,7 @@ nmscRedrawFunc(tile, window)
|
|||
}
|
||||
|
||||
int
|
||||
nmscAlways1()
|
||||
nmscAlways1(Tile *tile, TileType dinfo, ClientData clientdata)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ NMRedrawPoints(window, plane)
|
|||
}
|
||||
|
||||
int
|
||||
nmspAlways1()
|
||||
nmspAlways1(Tile *tile, TileType dinfo, ClientData clientdata)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -362,8 +362,9 @@ plotGremlinRect(rect, lineStyle)
|
|||
*/
|
||||
|
||||
int
|
||||
plotGremlinPaint(tile, cxp)
|
||||
plotGremlinPaint(tile, dinfo, cxp)
|
||||
Tile *tile; /* Tile that's of type to be output. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
TreeContext *cxp; /* Describes search in progress. */
|
||||
{
|
||||
Rect tileArea, edge, rootArea;
|
||||
|
|
|
|||
|
|
@ -311,8 +311,9 @@ pnmRenderRegion(scale, scale_over_2, normal, temp, func, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
pnmBBOX (tile,cxp)
|
||||
pnmBBOX (tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
TreeContext *cxp;
|
||||
{
|
||||
Rect targetRect, sourceRect;
|
||||
|
|
@ -368,8 +369,9 @@ pnmBBOX (tile,cxp)
|
|||
*/
|
||||
|
||||
int
|
||||
pnmTile (tile, cxp)
|
||||
pnmTile (tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -397,11 +399,11 @@ pnmTile (tile, cxp)
|
|||
/* Handle non-Manhattan geometry */
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
TileType dinfo;
|
||||
TileType newdinfo;
|
||||
int w, h, llx, lly, urx, ury;
|
||||
Rect scaledClip;
|
||||
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
if (type == TT_SPACE) return 0;
|
||||
else if (PaintStyles[type].wmask == 0) return 0;
|
||||
|
||||
|
|
@ -430,15 +432,15 @@ pnmTile (tile, cxp)
|
|||
/* The following structures could be much better */
|
||||
/* written for considerable speedup. . . */
|
||||
|
||||
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), &scx->scx_trans);
|
||||
if (((dinfo & TT_SIDE) >> 1) != (dinfo & TT_DIRECTION))
|
||||
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, &scx->scx_trans);
|
||||
if (((newdinfo & TT_SIDE) >> 1) != (newdinfo & TT_DIRECTION))
|
||||
{
|
||||
/* work top to bottom */
|
||||
for (y = ury - 1; y >= lly; y--)
|
||||
{
|
||||
if (y >= scaledClip.r_ytop) continue;
|
||||
else if (y < scaledClip.r_ybot) break;
|
||||
if (dinfo & TT_SIDE) /* work right to left */
|
||||
if (newdinfo & TT_SIDE) /* work right to left */
|
||||
{
|
||||
for (x = urx - 1; x >= llx; x--)
|
||||
{
|
||||
|
|
@ -468,7 +470,7 @@ pnmTile (tile, cxp)
|
|||
{
|
||||
if (y < scaledClip.r_ybot) continue;
|
||||
else if (y >= scaledClip.r_ytop) break;
|
||||
if (dinfo & TT_SIDE) /* work right to left */
|
||||
if (newdinfo & TT_SIDE) /* work right to left */
|
||||
{
|
||||
for (x = urx; x >= llx; x--)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -513,8 +513,9 @@ plotPSRect(rect, style)
|
|||
*/
|
||||
|
||||
int
|
||||
plotPSPaint(tile, cxp)
|
||||
plotPSPaint(tile, dinfo, cxp)
|
||||
Tile *tile; /* Tile that's of type to be output. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* Describes search in progress. */
|
||||
{
|
||||
Rect tileArea, edge, rootArea;
|
||||
|
|
@ -554,7 +555,7 @@ plotPSPaint(tile, cxp)
|
|||
if (IsSplit(tile))
|
||||
{
|
||||
int np, i, j;
|
||||
TileType dinfo;
|
||||
TileType newdinfo;
|
||||
Point polyp[5];
|
||||
|
||||
plotPSFlushRect(curStyle->grs_stipple);
|
||||
|
|
@ -563,12 +564,12 @@ plotPSPaint(tile, cxp)
|
|||
|
||||
/* Side and direction are altered by geometric transformations */
|
||||
|
||||
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), &scx->scx_trans);
|
||||
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo, &scx->scx_trans);
|
||||
|
||||
/* Use GrClipTriangle() routine to get the n-sided polygon that */
|
||||
/* results from clipping a triangle to the clip region. */
|
||||
|
||||
GrClipTriangle(&rootArea, &bbox, TRUE, dinfo, polyp, &np);
|
||||
GrClipTriangle(&rootArea, &bbox, TRUE, newdinfo, polyp, &np);
|
||||
for (i = 0; i < np; i++)
|
||||
{
|
||||
polyp[i].p_x -= bbox.r_xbot;
|
||||
|
|
@ -651,7 +652,7 @@ plotPSPaint(tile, cxp)
|
|||
* (This code is essentially a duplicate of selRedisplayFunc())
|
||||
*/
|
||||
|
||||
if (IsSplit(tile) && (!(SplitSide(tile) ^ SplitDirection(tile))))
|
||||
if (IsSplit(tile) && (!((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
|
||||
goto searchleft; /* nothing on bottom of split */
|
||||
|
||||
if (tileArea.r_ybot > TiPlaneRect.r_ybot)
|
||||
|
|
@ -676,7 +677,7 @@ plotPSPaint(tile, cxp)
|
|||
*/
|
||||
|
||||
searchleft:
|
||||
if (IsSplit(tile) && SplitSide(tile))
|
||||
if (IsSplit(tile) && (dinfo & TT_SIDE))
|
||||
goto searchtop; /* Nothing on left side of tile */
|
||||
|
||||
if (tileArea.r_xbot > TiPlaneRect.r_xbot)
|
||||
|
|
@ -699,7 +700,7 @@ searchleft:
|
|||
/* Same thing for the tile's top border. */
|
||||
|
||||
searchtop:
|
||||
if (IsSplit(tile) && (SplitSide(tile) ^ SplitDirection(tile)))
|
||||
if (IsSplit(tile) && (((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
|
||||
goto searchright; /* Nothing on top side of tile */
|
||||
|
||||
if (tileArea.r_ytop < TiPlaneRect.r_ytop)
|
||||
|
|
@ -722,7 +723,7 @@ searchtop:
|
|||
/* Finally, the right border. */
|
||||
|
||||
searchright:
|
||||
if (IsSplit(tile) && !SplitSide(tile))
|
||||
if (IsSplit(tile) && !(dinfo & TT_SIDE))
|
||||
return 0; /* Nothing on right side of tile */
|
||||
|
||||
if (tileArea.r_xtop < TiPlaneRect.r_xtop)
|
||||
|
|
|
|||
|
|
@ -525,8 +525,9 @@ plotPixRect(area, widen, style)
|
|||
*/
|
||||
|
||||
int
|
||||
plotPixTile(tile, cxp)
|
||||
Tile *tile; /* Tile that's of type to be output. */
|
||||
plotPixTile(tile, dinfo, cxp)
|
||||
Tile *tile; /* Tile that's of type to be output. */
|
||||
TileType dinfo; /* Split tile information (unhandled) */
|
||||
TreeContext *cxp; /* Describes search in progress. */
|
||||
{
|
||||
Rect tileArea, rootArea, swathArea;
|
||||
|
|
|
|||
|
|
@ -664,8 +664,9 @@ plotVersRect(area, widen, raster)
|
|||
*/
|
||||
|
||||
int
|
||||
plotVersTile(tile, cxp)
|
||||
Tile *tile; /* Tile that's of type to be output. */
|
||||
plotVersTile(tile, dinfo, cxp)
|
||||
Tile *tile; /* Tile that's of type to be output. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
TreeContext *cxp; /* Describes search in progress. */
|
||||
{
|
||||
Rect tileArea, rootArea, swathArea, edge;
|
||||
|
|
@ -701,18 +702,19 @@ plotVersTile(tile, cxp)
|
|||
if (IsSplit(tile))
|
||||
{
|
||||
int i, j;
|
||||
TileType dinfo;
|
||||
TileType newdinfo;
|
||||
Rect r;
|
||||
|
||||
dinfo = DBTransformDiagonal(TiGetTypeExact(tile), &cxp->tc_scx->scx_trans);
|
||||
newdinfo = DBTransformDiagonal(TiGetTypeExact(tile) | dinfo,
|
||||
&cxp->tc_scx->scx_trans);
|
||||
if (!(curStyle->vs_flags & VS_BORDER) && !(curStyle->vs_flags & VS_CROSS))
|
||||
PlotPolyRaster(raster, &swathArea, &swathClip, dinfo,
|
||||
PlotPolyRaster(raster, &swathArea, &swathClip, newdinfo,
|
||||
curStyle->vs_stipple);
|
||||
|
||||
/* Diagonal is always drawn (clipping handled in plotVersLine) */
|
||||
|
||||
r = rootArea;
|
||||
if (dinfo & TT_DIRECTION)
|
||||
if (newdinfo & TT_DIRECTION)
|
||||
{
|
||||
/* swap X to make diagonal go the other way */
|
||||
r.r_xbot = r.r_xtop;
|
||||
|
|
@ -740,7 +742,7 @@ plotVersTile(tile, cxp)
|
|||
* (unless it is at infinity).
|
||||
*/
|
||||
|
||||
if (IsSplit(tile) && (!(SplitSide(tile) ^ SplitDirection(tile))))
|
||||
if (IsSplit(tile) && (!((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
|
||||
goto searchleft; /* nothing on bottom of split */
|
||||
|
||||
if (tileArea.r_ybot > TiPlaneRect.r_ybot)
|
||||
|
|
@ -761,7 +763,7 @@ plotVersTile(tile, cxp)
|
|||
}
|
||||
|
||||
searchleft:
|
||||
if (IsSplit(tile) && (SplitSide(tile)))
|
||||
if (IsSplit(tile) && (dinfo & TT_SIDE))
|
||||
goto searchtop; /* Nothing on left side of split */
|
||||
|
||||
/* Now go along the tile's left border, doing the same thing. Ignore
|
||||
|
|
@ -788,7 +790,7 @@ searchleft:
|
|||
/* Same thing for the tile's top border. */
|
||||
|
||||
searchtop:
|
||||
if (IsSplit(tile) && (SplitSide(tile) ^ SplitDirection(tile)))
|
||||
if (IsSplit(tile) && (((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
|
||||
goto searchright; /* Nothing on top side of tile */
|
||||
|
||||
if (tileArea.r_ytop < TiPlaneRect.r_ytop)
|
||||
|
|
@ -811,7 +813,7 @@ searchtop:
|
|||
/* Finally, the right border. */
|
||||
|
||||
searchright:
|
||||
if (IsSplit(tile) && !(SplitSide(tile)))
|
||||
if (IsSplit(tile) && !(dinfo & TT_SIDE))
|
||||
return 0; /* Nothing on right side of tile */
|
||||
|
||||
if (tileArea.r_xtop < TiPlaneRect.r_xtop)
|
||||
|
|
|
|||
|
|
@ -305,7 +305,7 @@ PlowRedrawBound(window, plane)
|
|||
}
|
||||
|
||||
int
|
||||
plowBoundAlways1()
|
||||
plowBoundAlways1(Tile *tile, TileType dinfo, ClientData clientdata)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -189,7 +189,7 @@ PlowRandomTest(def)
|
|||
*/
|
||||
|
||||
int
|
||||
plowFindFirstError()
|
||||
plowFindFirstError(Tile *tile, TileType dinfo, ClientData clientdata)
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -962,8 +962,9 @@ prCell(edge)
|
|||
*/
|
||||
|
||||
int
|
||||
plowCellDragPaint(tile, ar)
|
||||
plowCellDragPaint(tile, dinfo, ar)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
struct applyRule *ar;
|
||||
{
|
||||
Edge *movingEdge = ar->ar_moving;
|
||||
|
|
|
|||
|
|
@ -111,8 +111,9 @@ prInSliver(edge)
|
|||
}
|
||||
|
||||
int
|
||||
plowInSliverProc(tile, inarg)
|
||||
plowInSliverProc(tile, dinfo, inarg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
struct inarg *inarg;
|
||||
{
|
||||
Edge *movingEdge = inarg->ina_moving;
|
||||
|
|
|
|||
|
|
@ -168,11 +168,12 @@ plowFindWidth(
|
|||
*/
|
||||
|
||||
int
|
||||
plowInitWidthFunc(tile, wc)
|
||||
plowInitWidthFunc(tile, dinfo, wc)
|
||||
Tile *tile; /* Tile whose type is not among the types
|
||||
* passed to plowFindWidth(), whose LHS will
|
||||
* provide the right-hand boundary.
|
||||
*/
|
||||
TileType dinfo; /* (unused) */
|
||||
struct wclip *wc; /* Contains original edge and area to clip */
|
||||
{
|
||||
Edge *edge = wc->wc_edge;
|
||||
|
|
@ -217,13 +218,14 @@ plowInitWidthFunc(tile, wc)
|
|||
*/
|
||||
|
||||
int
|
||||
plowWidthFunc(tile, wc)
|
||||
plowWidthFunc(tile, dinfo, wc)
|
||||
Tile *tile; /* Tile whose type is not among the types
|
||||
* passed to plowFindWidth(), which will be
|
||||
* clipped out of the area wc->wc_area in
|
||||
* such a way that the original edge will
|
||||
* remain a part of wc->wc_area.
|
||||
*/
|
||||
TileType dinfo; /* (unused) */
|
||||
struct wclip *wc; /* Contains original edge and area to clip */
|
||||
{
|
||||
Edge *edge = wc->wc_edge;
|
||||
|
|
@ -423,11 +425,12 @@ plowFindWidthBack(
|
|||
*/
|
||||
|
||||
int
|
||||
plowInitWidthBackFunc(tile, wc)
|
||||
plowInitWidthBackFunc(tile, dinfo, wc)
|
||||
Tile *tile; /* Tile whose type is not among the types
|
||||
* passed to plowFindWidthBack(), whose RHS will
|
||||
* provide the left-hand boundary.
|
||||
*/
|
||||
TileType dinfo; /* (unused) */
|
||||
struct wclip *wc; /* Contains original edge and area to clip */
|
||||
{
|
||||
Edge *edge = wc->wc_edge;
|
||||
|
|
@ -472,13 +475,14 @@ plowInitWidthBackFunc(tile, wc)
|
|||
*/
|
||||
|
||||
int
|
||||
plowWidthBackFunc(tile, wc)
|
||||
plowWidthBackFunc(tile, dinfo, wc)
|
||||
Tile *tile; /* Tile whose type is not among the types
|
||||
* passed to plowFindWidth(), which will be
|
||||
* clipped out of the area wc->wc_area in
|
||||
* such a way that the original edge will
|
||||
* remain a part of wc->wc_area.
|
||||
*/
|
||||
TileType dinfo; /* (unused) */
|
||||
struct wclip *wc; /* Contains original edge and area to clip */
|
||||
{
|
||||
Edge *edge = wc->wc_edge;
|
||||
|
|
|
|||
|
|
@ -280,8 +280,9 @@ plowYankUpdateCell(yankChildUse)
|
|||
*/
|
||||
|
||||
int
|
||||
plowYankUpdatePaint(yankTp, pNum)
|
||||
plowYankUpdatePaint(yankTp, dinfo, pNum)
|
||||
Tile *yankTp;
|
||||
TileType dinfo; /* (unused) */
|
||||
int pNum;
|
||||
{
|
||||
Tile *spareTp;
|
||||
|
|
@ -399,8 +400,9 @@ plowUpdateLabels(yankDef, origDef, origArea)
|
|||
}
|
||||
|
||||
int
|
||||
plowCheckLabel(tile, lu)
|
||||
plowCheckLabel(tile, dinfo, lu)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
struct labelUpdate *lu;
|
||||
{
|
||||
int adjust;
|
||||
|
|
@ -532,12 +534,13 @@ plowUpdateCell(use, origDef)
|
|||
*/
|
||||
|
||||
int
|
||||
plowUpdatePaintTile(tile, ui)
|
||||
plowUpdatePaintTile(tile, dinfo, ui)
|
||||
Tile *tile; /* Tile in yanked, plowed def */
|
||||
TileType dinfo; /* Split tile information */
|
||||
PaintUndoInfo *ui; /* Identifies original cell and plane being searched */
|
||||
{
|
||||
Rect r, rtrans;
|
||||
TileType type = TiGetTypeExact(tile);
|
||||
TileType type = TiGetTypeExact(tile) | dinfo;
|
||||
int pNum, pMask;
|
||||
|
||||
r.r_ybot = BOTTOM(tile);
|
||||
|
|
@ -553,7 +556,7 @@ plowUpdatePaintTile(tile, ui)
|
|||
if (PlaneMaskHasPlane(pMask, pNum))
|
||||
{
|
||||
ui->pu_pNum = pNum;
|
||||
DBPaintPlane(ui->pu_def->cd_planes[pNum],
|
||||
DBNMPaintPlane(ui->pu_def->cd_planes[pNum], type,
|
||||
&rtrans, DBWriteResultTbl[type], ui);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,8 +127,10 @@ resAllPortNodes(tile, list)
|
|||
*/
|
||||
|
||||
int
|
||||
ResMultiPlaneFunc(tile, tpptr)
|
||||
Tile *tile, **tpptr;
|
||||
ResMultiPlaneFunc(tile, dinfo, tpptr)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* Not used, but needs to be handled */
|
||||
Tile **tpptr;
|
||||
{
|
||||
Tile *tp = *tpptr;
|
||||
int xj, yj;
|
||||
|
|
@ -158,8 +160,10 @@ ResMultiPlaneFunc(tile, tpptr)
|
|||
*/
|
||||
|
||||
int
|
||||
ResSubstrateFunc(tile, tpptr)
|
||||
Tile *tile, **tpptr;
|
||||
ResSubstrateFunc(tile, dinfo, tpptr)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
Tile **tpptr;
|
||||
{
|
||||
Tile *tp = *tpptr;
|
||||
int xj, yj;
|
||||
|
|
@ -188,9 +192,10 @@ ResSubstrateFunc(tile, tpptr)
|
|||
*/
|
||||
|
||||
bool
|
||||
ResEachTile(tile, startpoint)
|
||||
ResEachTile(tile, dinfo, startpoint)
|
||||
Tile *tile;
|
||||
Point *startpoint;
|
||||
TileType dinfo;
|
||||
Point *startpoint;
|
||||
|
||||
{
|
||||
Tile *tp;
|
||||
|
|
@ -209,7 +214,7 @@ ResEachTile(tile, startpoint)
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
t1 = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
t1 = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
}
|
||||
else
|
||||
t1 = TiGetTypeExact(tile);
|
||||
|
|
@ -473,7 +478,7 @@ ResEachTile(tile, startpoint)
|
|||
|
||||
resAllPortNodes(tile, &ResNodeQueue);
|
||||
|
||||
merged = ResCalcTileResistance(tile, tstructs, &ResNodeQueue,
|
||||
merged = ResCalcTileResistance(tile, dinfo, tstructs, &ResNodeQueue,
|
||||
&ResNodeList);
|
||||
|
||||
return(merged);
|
||||
|
|
|
|||
|
|
@ -351,8 +351,9 @@ ResMakeLabelBreakpoints(def, goodies)
|
|||
*/
|
||||
|
||||
int
|
||||
ResAddBreakpointFunc(tile, node)
|
||||
ResAddBreakpointFunc(tile, dinfo, node)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ResSimNode *node;
|
||||
{
|
||||
tileJunk *junk;
|
||||
|
|
@ -741,8 +742,9 @@ ResCalcPerimOverlap(tile, dev)
|
|||
*/
|
||||
|
||||
int
|
||||
resMakeDevFunc(tile, cx)
|
||||
resMakeDevFunc(tile, dinfo, cx)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
TreeContext *cx;
|
||||
{
|
||||
ResDevTile *thisDev = (ResDevTile *)cx->tc_filter->tf_arg;
|
||||
|
|
@ -753,7 +755,7 @@ resMakeDevFunc(tile, cx)
|
|||
GeoTransRect(&cx->tc_scx->scx_trans, &devArea, &thisDev->area);
|
||||
|
||||
if (IsSplit(tile))
|
||||
ttype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
ttype = ((dinfo & TT_SIDE)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
else
|
||||
ttype = TiGetType(tile);
|
||||
|
||||
|
|
@ -795,8 +797,9 @@ resMakeDevFunc(tile, cx)
|
|||
#define DEV_PROCESSED 1
|
||||
|
||||
int
|
||||
resExpandDevFunc(tile, cx)
|
||||
resExpandDevFunc(tile, dinfo, cx)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
TreeContext *cx;
|
||||
{
|
||||
ResDevTile *thisDev = (ResDevTile *)cx->tc_filter->tf_arg;
|
||||
|
|
@ -918,8 +921,9 @@ resExpandDevFunc(tile, cx)
|
|||
*/
|
||||
|
||||
int
|
||||
ResShaveContacts(tile, def)
|
||||
ResShaveContacts(tile, dinfo, def)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused, see comment below) */
|
||||
CellDef *def;
|
||||
{
|
||||
TileType ttype;
|
||||
|
|
@ -1287,8 +1291,10 @@ ResCleanUpEverything()
|
|||
*/
|
||||
|
||||
int
|
||||
ResGetTileFunc(tile, tpptr)
|
||||
Tile *tile, **tpptr;
|
||||
ResGetTileFunc(tile, dinfo, tpptr)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
Tile **tpptr;
|
||||
{
|
||||
if (TiGetType(tile) != TT_SPACE)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -52,8 +52,9 @@ bool ResCalcEastWest();
|
|||
*/
|
||||
|
||||
bool
|
||||
ResCalcTileResistance(tile, junk, pendingList, doneList)
|
||||
ResCalcTileResistance(tile, dinfo, junk, pendingList, doneList)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
tileJunk *junk;
|
||||
resNode **pendingList, **doneList;
|
||||
|
||||
|
|
@ -87,15 +88,15 @@ ResCalcTileResistance(tile, junk, pendingList, doneList)
|
|||
|
||||
if (device)
|
||||
{
|
||||
merged |= ResCalcNearDevice(tile, pendingList, doneList, &ResResList);
|
||||
merged |= ResCalcNearDevice(tile, dinfo, pendingList, doneList, &ResResList);
|
||||
}
|
||||
else if (MaxY-MinY > MaxX-MinX)
|
||||
{
|
||||
merged |= ResCalcNorthSouth(tile, pendingList, doneList, &ResResList);
|
||||
merged |= ResCalcNorthSouth(tile, dinfo, pendingList, doneList, &ResResList);
|
||||
}
|
||||
else
|
||||
{
|
||||
merged |= ResCalcEastWest(tile, pendingList, doneList, &ResResList);
|
||||
merged |= ResCalcEastWest(tile, dinfo, pendingList, doneList, &ResResList);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -120,8 +121,9 @@ ResCalcTileResistance(tile, junk, pendingList, doneList)
|
|||
*/
|
||||
|
||||
bool
|
||||
ResCalcEastWest(tile, pendingList, doneList, resList)
|
||||
ResCalcEastWest(tile, dinfo, pendingList, doneList, resList)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
resNode **pendingList, **doneList;
|
||||
resResistor **resList;
|
||||
{
|
||||
|
|
@ -243,7 +245,7 @@ ResCalcEastWest(tile, pendingList, doneList, resList)
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
resistor->rr_tt = (SplitSide(tile)) ? SplitRightType(tile)
|
||||
resistor->rr_tt = (dinfo & TT_SIDE) ? SplitRightType(tile)
|
||||
: SplitLeftType(tile);
|
||||
resistor->rr_status = RES_DIAGONAL;
|
||||
resistor->rr_status |= (SplitDirection(tile)) ? RES_NS
|
||||
|
|
@ -291,8 +293,9 @@ ResCalcEastWest(tile, pendingList, doneList, resList)
|
|||
*/
|
||||
|
||||
bool
|
||||
ResCalcNorthSouth(tile, pendingList, doneList, resList)
|
||||
ResCalcNorthSouth(tile, dinfo, pendingList, doneList, resList)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
resNode **pendingList, **doneList;
|
||||
resResistor **resList;
|
||||
{
|
||||
|
|
@ -411,7 +414,7 @@ ResCalcNorthSouth(tile, pendingList, doneList, resList)
|
|||
resistor->rr_width = width;
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
resistor->rr_tt = (SplitSide(tile)) ? SplitRightType(tile)
|
||||
resistor->rr_tt = (dinfo & TT_SIDE) ? SplitRightType(tile)
|
||||
: SplitLeftType(tile);
|
||||
resistor->rr_status = RES_DIAGONAL;
|
||||
resistor->rr_status |= (SplitDirection(tile)) ? RES_NS
|
||||
|
|
@ -463,8 +466,9 @@ ResCalcNorthSouth(tile, pendingList, doneList, resList)
|
|||
*/
|
||||
|
||||
bool
|
||||
ResCalcNearDevice(tile, pendingList, doneList, resList)
|
||||
ResCalcNearDevice(tile, dinfo, pendingList, doneList, resList)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
resNode **pendingList, **doneList;
|
||||
resResistor **resList;
|
||||
|
||||
|
|
@ -642,11 +646,11 @@ ResCalcNearDevice(tile, pendingList, doneList, resList)
|
|||
}
|
||||
if (deltay > deltax)
|
||||
{
|
||||
return ResCalcNorthSouth(tile, pendingList, doneList, resList);
|
||||
return ResCalcNorthSouth(tile, dinfo, pendingList, doneList, resList);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ResCalcEastWest(tile, pendingList, doneList, resList);
|
||||
return ResCalcEastWest(tile, dinfo, pendingList, doneList, resList);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -712,7 +716,7 @@ ResCalcNearDevice(tile, pendingList, doneList, resList)
|
|||
}
|
||||
}
|
||||
}
|
||||
return ResCalcNorthSouth(tile, pendingList, doneList, resList);
|
||||
return ResCalcNorthSouth(tile, dinfo, pendingList, doneList, resList);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -752,7 +756,7 @@ ResCalcNearDevice(tile, pendingList, doneList, resList)
|
|||
}
|
||||
}
|
||||
}
|
||||
return ResCalcEastWest(tile, pendingList, doneList, resList);
|
||||
return ResCalcEastWest(tile, dinfo, pendingList, doneList, resList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,8 +45,9 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/
|
|||
*/
|
||||
|
||||
ExtRegion *
|
||||
ResFirst(tile, arg)
|
||||
ResFirst(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
FindRegion *arg;
|
||||
{
|
||||
ResContactPoint *reg;
|
||||
|
|
@ -55,7 +56,7 @@ ResFirst(tile, arg)
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
t = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
t = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
}
|
||||
else
|
||||
t = TiGetType(tile);
|
||||
|
|
@ -98,7 +99,10 @@ ResFirst(tile, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
resMultiPlaneTerm(Tile *tile, tileJunk *junk2)
|
||||
resMultiPlaneTerm(
|
||||
Tile *tile,
|
||||
TileType dinfo, // Unused (but should be handled)
|
||||
tileJunk *junk2)
|
||||
{
|
||||
tileJunk *Junk;
|
||||
|
||||
|
|
@ -119,7 +123,10 @@ resMultiPlaneTerm(Tile *tile, tileJunk *junk2)
|
|||
*/
|
||||
|
||||
int
|
||||
resSubstrateTerm(Tile *tile)
|
||||
resSubstrateTerm(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData clientdata) /* (unused) */
|
||||
{
|
||||
tileJunk *Junk;
|
||||
|
||||
|
|
@ -144,15 +151,16 @@ resSubstrateTerm(Tile *tile)
|
|||
*/
|
||||
|
||||
int
|
||||
ResEach(tile, pNum, arg)
|
||||
ResEach(tile, dinfo, pNum, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
int pNum;
|
||||
FindRegion *arg;
|
||||
{
|
||||
|
||||
if (((ResContactPoint *)(arg->fra_region))->cp_contactTile != tile)
|
||||
{
|
||||
ResFirst(tile, arg);
|
||||
ResFirst(tile, dinfo, arg);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
|
@ -175,8 +183,9 @@ ResEach(tile, pNum, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
ResAddPlumbing(tile, arg)
|
||||
ResAddPlumbing(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
ClientData *arg;
|
||||
{
|
||||
tileJunk *Junk, *junk2;
|
||||
|
|
@ -193,7 +202,7 @@ ResAddPlumbing(tile, arg)
|
|||
if (TiGetClient(tile) == CLIENTDEFAULT)
|
||||
{
|
||||
if (IsSplit(tile))
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile) :
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) :
|
||||
SplitLeftType(tile);
|
||||
else
|
||||
loctype = TiGetTypeExact(tile);
|
||||
|
|
@ -220,7 +229,7 @@ ResAddPlumbing(tile, arg)
|
|||
*/
|
||||
nterms += 2;
|
||||
|
||||
resDev = (resDevice *) mallocMagic((unsigned)(sizeof(resDevice)));
|
||||
resDev = (resDevice *)mallocMagic((unsigned)(sizeof(resDevice)));
|
||||
resDev->rd_nterms = nterms;
|
||||
resDev->rd_terminals = (resNode **) mallocMagic(nterms * sizeof(resNode *));
|
||||
for (i = 0; i != nterms; i++)
|
||||
|
|
@ -238,7 +247,7 @@ ResAddPlumbing(tile, arg)
|
|||
resDev->rd_perim = 0;
|
||||
resDev->rd_area = 0;
|
||||
resDev->rd_status = 0;
|
||||
resDev->rd_nextDev = (resDevice *) *arg;
|
||||
resDev->rd_nextDev = (resDevice *)*arg;
|
||||
*arg = (ClientData)resDev;
|
||||
junk2->deviceList = resDev;
|
||||
junk2->tj_status |= RES_TILE_DEV;
|
||||
|
|
@ -340,7 +349,7 @@ ResAddPlumbing(tile, arg)
|
|||
tp1 = (Tile *) STACKPOP(resDevStack);
|
||||
if (IsSplit(tp1))
|
||||
{
|
||||
t1 = (SplitSide(tp1)) ? SplitRightType(tp1) :
|
||||
t1 = (dinfo & TT_SIDE) ? SplitRightType(tp1) :
|
||||
SplitLeftType(tp1);
|
||||
}
|
||||
else
|
||||
|
|
@ -426,11 +435,11 @@ ResAddPlumbing(tile, arg)
|
|||
tp1 = (Tile *) STACKPOP(resDevStack);
|
||||
if (IsSplit(tp1))
|
||||
{
|
||||
t1 = (SplitSide(tp1)) ? SplitRightType(tp1) :
|
||||
t1 = (dinfo & TT_SIDE) ? SplitRightType(tp1) :
|
||||
SplitLeftType(tp1);
|
||||
/* Check in case this is the wrong side */
|
||||
if (ExtCurStyle->exts_device[t1] == NULL)
|
||||
t1 = (SplitSide(tp1)) ? SplitLeftType(tp1) :
|
||||
t1 = (dinfo & TT_SIDE) ? SplitLeftType(tp1) :
|
||||
SplitRightType(tp1);
|
||||
}
|
||||
else
|
||||
|
|
@ -574,7 +583,7 @@ ResAddPlumbing(tile, arg)
|
|||
tp1 = (Tile *) STACKPOP(resDevStack);
|
||||
if (IsSplit(tp1))
|
||||
{
|
||||
t1 = (SplitSide(tp1)) ? SplitRightType(tp1) :
|
||||
t1 = (dinfo & TT_SIDE) ? SplitRightType(tp1) :
|
||||
SplitLeftType(tp1);
|
||||
}
|
||||
else
|
||||
|
|
@ -651,8 +660,9 @@ ResAddPlumbing(tile, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
ResRemovePlumbing(tile, arg)
|
||||
ResRemovePlumbing(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo; // Unused, but should be handled.
|
||||
ClientData *arg;
|
||||
|
||||
{
|
||||
|
|
|
|||
|
|
@ -412,8 +412,9 @@ rtrChannelObstaclePins(ch)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrChannelObstacleMark(tile, cxp)
|
||||
rtrChannelObstacleMark(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
short **mcol, *mrow, *mrowend, mask;
|
||||
|
|
|
|||
|
|
@ -227,8 +227,10 @@ CmdChannel(w, cmd)
|
|||
}
|
||||
|
||||
int
|
||||
cmdChannelFunc(tile)
|
||||
cmdChannelFunc(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
Rect area, rootArea;
|
||||
|
||||
|
|
|
|||
|
|
@ -522,8 +522,9 @@ rtrSplitToArea(area, def)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrSrClear(tile, area)
|
||||
rtrSrClear(tile, dinfo, area)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
Rect *area;
|
||||
{
|
||||
/* Clear all */
|
||||
|
|
@ -580,8 +581,9 @@ rtrSrClear(tile, area)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrSrFunc(tile, plane)
|
||||
rtrSrFunc(tile, dinfo, plane)
|
||||
Tile *tile; /* Candidate cell tile */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
Plane *plane; /* Plane in which searches take place */
|
||||
{
|
||||
Tile *tiles[3];
|
||||
|
|
|
|||
|
|
@ -171,11 +171,12 @@ done:
|
|||
*/
|
||||
|
||||
int
|
||||
rtrMakeChannel(tile, clipBox)
|
||||
rtrMakeChannel(tile, dinfo, clipBox)
|
||||
Tile *tile; /* Potential channel tile; we create a channel whose
|
||||
* area is equal to that of this tile if the type of
|
||||
* this tile is TT_SPACE.
|
||||
*/
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
Rect *clipBox; /* If non-NULL, clip the channel area to this box */
|
||||
{
|
||||
int length, width;
|
||||
|
|
|
|||
|
|
@ -285,8 +285,9 @@ rtrSideProcess(use, side, area, trans)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrSideInitClient(tile, client)
|
||||
rtrSideInitClient(tile, dinfo, client)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData client;
|
||||
{
|
||||
TiSetClient(tile, client);
|
||||
|
|
@ -315,8 +316,10 @@ rtrSideInitClient(tile, client)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrEnumSidesFunc(tile)
|
||||
rtrEnumSidesFunc(tile, dinfo, clientdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
int ybot, ytop, yprev, sep, x, origin;
|
||||
Tile *tp, *tpB;
|
||||
|
|
|
|||
|
|
@ -403,7 +403,7 @@ fail:
|
|||
/* Routine to expand rectangle into touching tiles of a label's type. */
|
||||
|
||||
int
|
||||
rtrStemExpandFunc(Tile *t, TreeContext *cxp)
|
||||
rtrStemExpandFunc(Tile *t, TileType dinfo, TreeContext *cxp)
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
Rect rsrc;
|
||||
|
|
@ -518,8 +518,9 @@ rtrStemTip(loc, si, use)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrAbort(tile)
|
||||
Tile *tile;
|
||||
rtrAbort(Tile *tile,
|
||||
TileType dinfo,
|
||||
ClientData cliendata)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -197,8 +197,9 @@ rtrSrTraverse(def, startArea, mask, connect, bounds, func, clientData)
|
|||
}
|
||||
|
||||
int
|
||||
rtrSrTraverseStartFunc(tile, pTile)
|
||||
rtrSrTraverseStartFunc(tile, dinfo, pTile)
|
||||
Tile *tile; /* This will be the starting tile. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
Tile **pTile; /* We store tile's address here. */
|
||||
{
|
||||
*pTile = tile;
|
||||
|
|
@ -238,8 +239,9 @@ rtrSrTraverseStartFunc(tile, pTile)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrSrTraverseFunc(tile, ts)
|
||||
rtrSrTraverseFunc(tile, dinfo, ts)
|
||||
Tile *tile; /* Tile that is connected. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
struct rtrTileStack *ts; /* Contains information about the search. */
|
||||
{
|
||||
Tile *t2;
|
||||
|
|
@ -401,8 +403,9 @@ rtrSrTraverseFunc(tile, ts)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrExamineTile(tile, cdata)
|
||||
rtrExamineTile(tile, dinfo, cdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData cdata;
|
||||
{
|
||||
if ( TiGetType(tile) == rtrTarget )
|
||||
|
|
@ -439,8 +442,9 @@ rtrExamineTile(tile, cdata)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrExamineStack(tile, ts)
|
||||
rtrExamineStack(tile, dinfo, ts)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
struct rtrTileStack *ts;
|
||||
{
|
||||
int i;
|
||||
|
|
|
|||
|
|
@ -182,8 +182,9 @@ rtrFollowName(name, firstInNet, area)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrCheckTypes(tile, cdata)
|
||||
rtrCheckTypes(tile, dinfo, cdata)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ClientData cdata;
|
||||
{
|
||||
int type;
|
||||
|
|
@ -259,8 +260,9 @@ rtrExtend(tile,area,stub)
|
|||
*/
|
||||
|
||||
int
|
||||
rtrStubGen(tile, si)
|
||||
rtrStubGen(tile, dinfo, si)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
struct srinfo *si;
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -305,8 +307,9 @@ rtrStubGen(tile, si)
|
|||
|
||||
|
||||
int
|
||||
rtrReferenceTile(tile, si)
|
||||
rtrReferenceTile(tile, dinfo, si)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
struct srinfo *si;
|
||||
{
|
||||
si->si_tile = tile;
|
||||
|
|
|
|||
|
|
@ -265,15 +265,17 @@ selClearFunc(scx)
|
|||
*/
|
||||
|
||||
int
|
||||
selIntersectPaintFunc2(tile, rect)
|
||||
selIntersectPaintFunc2(tile, dinfo, rect)
|
||||
Tile *tile; /* The tile to copy paint from. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
Rect *rect; /* Area to clip to */
|
||||
{
|
||||
Rect r;
|
||||
|
||||
TiToRect(tile, &r);
|
||||
GEOCLIP(&r, rect); /* Clip out the intersection area */
|
||||
DBPaint(SelectDef, &r, TiGetTypeExact(tile)); /* Paint back into SelectDef */
|
||||
/* Paint back into SelectDef */
|
||||
DBPaint(SelectDef, &r, TiGetTypeExact(tile) | dinfo);
|
||||
return 0; /* Keep the search going. */
|
||||
}
|
||||
|
||||
|
|
@ -288,8 +290,10 @@ selIntersectPaintFunc2(tile, rect)
|
|||
*/
|
||||
|
||||
int
|
||||
selIntersectPaintFunc(tile)
|
||||
selIntersectPaintFunc(tile, dinfo, clientdata)
|
||||
Tile *tile; /* The tile to copy paint from. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
ClientData clientdata; /* (unused) */
|
||||
{
|
||||
TileTypeBitMask tMask;
|
||||
Rect r;
|
||||
|
|
@ -299,9 +303,10 @@ selIntersectPaintFunc(tile)
|
|||
|
||||
for (pNum = 0; pNum < DBNumPlanes; pNum++)
|
||||
{
|
||||
DBSrPaintArea((Tile *)NULL, Select2Def->cd_planes[pNum], &r,
|
||||
&DBAllButSpaceAndDRCBits, selIntersectPaintFunc2,
|
||||
(ClientData)&r);
|
||||
DBSrPaintNMArea((Tile *)NULL, Select2Def->cd_planes[pNum],
|
||||
TiGetTypeExact(tile) | dinfo, &r,
|
||||
&DBAllButSpaceAndDRCBits, selIntersectPaintFunc2,
|
||||
(ClientData)&r);
|
||||
}
|
||||
return 0; /* Keep the search going. */
|
||||
}
|
||||
|
|
@ -628,8 +633,9 @@ selFindChunk(plane, wrongTypes, searchArea, containedArea, bestMin,
|
|||
*/
|
||||
|
||||
int
|
||||
selSplitFunc(tile, cxp)
|
||||
selSplitFunc(tile, dinfo, cxp)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
TreeContext *cxp;
|
||||
{
|
||||
SearchContext *scx = cxp->tc_scx;
|
||||
|
|
@ -651,8 +657,9 @@ selSplitFunc(tile, cxp)
|
|||
*/
|
||||
|
||||
int
|
||||
selChunkFunc(tile, wrong)
|
||||
selChunkFunc(tile, dinfo, wrong)
|
||||
Tile *tile; /* The offending tile. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
Rect *wrong; /* Place to store the tile's area. */
|
||||
{
|
||||
TiToRect(tile, wrong);
|
||||
|
|
@ -1323,8 +1330,9 @@ typedef struct {
|
|||
*/
|
||||
|
||||
int
|
||||
selACPaintFunc(tile, plane)
|
||||
selACPaintFunc(tile, dinfo, plane)
|
||||
Tile *tile; /* Tile in Select2Def. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
int plane; /* Index of plane this tile came from. */
|
||||
{
|
||||
Rect area, editArea;
|
||||
|
|
@ -1336,7 +1344,7 @@ selACPaintFunc(tile, plane)
|
|||
selACarg.editClip = &area;
|
||||
GeoTransRect(&RootToEditTransform, &area, &editArea);
|
||||
|
||||
selACarg.ttype = TiGetTypeExact(tile);
|
||||
selACarg.ttype = TiGetTypeExact(tile) | dinfo;
|
||||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
|
|
@ -1361,23 +1369,24 @@ selACPaintFunc(tile, plane)
|
|||
*/
|
||||
|
||||
int
|
||||
selACPaintFunc2(tile, selACarg)
|
||||
selACPaintFunc2(tile, dinfo, selACarg)
|
||||
Tile *tile; /* Tile in edit cell. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
acparg *selACarg; /* Contains edit-cell area to clip to
|
||||
* before painting into selection.
|
||||
*/
|
||||
{
|
||||
Rect *editClip = selACarg->editClip;
|
||||
Rect area, selArea;
|
||||
TileType type = TiGetTypeExact(tile);
|
||||
TileType type = TiGetTypeExact(tile) | dinfo;
|
||||
TileTypeBitMask tmask, *rmask;
|
||||
TileType ttype, rtype;
|
||||
TileType dinfo = selACarg->ttype & (TT_DIAGONAL | TT_DIRECTION | TT_SIDE);
|
||||
TileType newdinfo = selACarg->ttype & (TT_DIAGONAL | TT_DIRECTION | TT_SIDE);
|
||||
|
||||
TiToRect(tile, &area);
|
||||
GeoTransRect(&EditToRootTransform, &area, &selArea);
|
||||
|
||||
if ((dinfo & TT_DIAGONAL) || (type & TT_DIAGONAL))
|
||||
if ((newdinfo & TT_DIAGONAL) || (type & TT_DIAGONAL))
|
||||
{
|
||||
/* If the select area is triangular, then we need to */
|
||||
/* clip in a more complicated manner. */
|
||||
|
|
@ -1406,11 +1415,11 @@ selACPaintFunc2(tile, selACarg)
|
|||
|
||||
TTMaskSetOnlyType(&tmask, rtype);
|
||||
|
||||
type = (dinfo & TT_SIDE) ? (rtype << 14) : rtype;
|
||||
type |= dinfo;
|
||||
type = (newdinfo & TT_SIDE) ? (rtype << 14) : rtype;
|
||||
type |= newdinfo;
|
||||
|
||||
if (dinfo & TT_DIAGONAL)
|
||||
GrClipTriangle(editClip, &selArea, TRUE, dinfo, points, &np);
|
||||
if (newdinfo & TT_DIAGONAL)
|
||||
GrClipTriangle(editClip, &selArea, TRUE, newdinfo, points, &np);
|
||||
else
|
||||
GrClipTriangle(&selArea, editClip, TRUE, type, points, &np);
|
||||
|
||||
|
|
|
|||
|
|
@ -195,7 +195,7 @@ SelRedisplay(window, plane)
|
|||
*/
|
||||
|
||||
int
|
||||
selAlways1()
|
||||
selAlways1(Tile *tile, TileType dinfo, ClientData clientdata)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -206,8 +206,9 @@ selAlways1()
|
|||
*/
|
||||
|
||||
int
|
||||
selRedisplayFunc(tile, window)
|
||||
selRedisplayFunc(tile, dinfo, window)
|
||||
Tile *tile; /* Tile to be drawn on highlight layer. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
MagWindow *window; /* Window in which to redisplay. */
|
||||
{
|
||||
Rect area, edge, screenEdge, tmpr;
|
||||
|
|
@ -245,13 +246,13 @@ selRedisplayFunc(tile, window)
|
|||
WindSurfaceToScreenNoClip(window, &tmpr, &screenEdge);
|
||||
if (screenEdge.r_ll.p_x != screenEdge.r_ur.p_x &&
|
||||
screenEdge.r_ll.p_y != screenEdge.r_ur.p_y)
|
||||
GrDrawTriangleEdge(&screenEdge, TiGetTypeExact(tile));
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
GrDrawTriangleEdge(&screenEdge, TiGetTypeExact(tile) | dinfo);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
}
|
||||
else
|
||||
loctype = TiGetTypeExact(tile);
|
||||
|
||||
if (IsSplit(tile) && (!(SplitSide(tile) ^ SplitDirection(tile))))
|
||||
if (IsSplit(tile) && (!((dinfo & TT_SIDE) ? 1 : 0) ^ SplitDirection(tile)))
|
||||
goto searchleft; /* nothing on bottom of split */
|
||||
|
||||
if (area.r_ybot > TiPlaneRect.r_ybot)
|
||||
|
|
@ -278,7 +279,7 @@ selRedisplayFunc(tile, window)
|
|||
*/
|
||||
|
||||
searchleft:
|
||||
if (IsSplit(tile) && SplitSide(tile)) return 0;
|
||||
if (IsSplit(tile) && (dinfo & TT_SIDE)) return 0;
|
||||
|
||||
if (area.r_xbot > TiPlaneRect.r_xbot)
|
||||
{
|
||||
|
|
@ -452,17 +453,19 @@ SelCopyToFeedback(celldef, seluse, style, text)
|
|||
/*----------------------------------------------------------------------*/
|
||||
|
||||
int
|
||||
selFeedbackFunc(tile, fld)
|
||||
selFeedbackFunc(tile, dinfo, fld)
|
||||
Tile *tile;
|
||||
TileType dinfo;
|
||||
FeedLayerData *fld;
|
||||
{
|
||||
Rect area;
|
||||
|
||||
TiToRect(tile, &area);
|
||||
|
||||
/* (preserve information about the geometry of a diagonal tile) */
|
||||
DBWFeedbackAdd(&area, fld->text, selDisRoot, 1, fld->style |
|
||||
(TiGetTypeExact(tile) & (TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
|
||||
/* (preserve information about the geometry of a diagonal tile) */
|
||||
((TiGetTypeExact(tile) | dinfo) &
|
||||
(TT_DIAGONAL | TT_DIRECTION | TT_SIDE)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -180,8 +180,9 @@ SelEnumPaint(layers, editOnly, foundNonEdit, func, clientData)
|
|||
*/
|
||||
|
||||
int
|
||||
selEnumPFunc1(tile, arg)
|
||||
selEnumPFunc1(tile, dinfo, arg)
|
||||
Tile *tile; /* Tile of matching type. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
struct searg *arg; /* Describes the current search. */
|
||||
{
|
||||
Rect editRect, rootRect;
|
||||
|
|
@ -193,8 +194,9 @@ selEnumPFunc1(tile, arg)
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
arg->sea_type = TiGetTypeExact(tile) & (TT_DIAGONAL | TT_SIDE | TT_DIRECTION);
|
||||
if (SplitSide(tile))
|
||||
arg->sea_type = (TiGetTypeExact(tile) | dinfo) &
|
||||
(TT_DIAGONAL | TT_SIDE | TT_DIRECTION);
|
||||
if (dinfo & TT_SIDE)
|
||||
loctype = SplitRightType(tile);
|
||||
else
|
||||
loctype = SplitLeftType(tile);
|
||||
|
|
@ -273,8 +275,9 @@ selEnumPFunc1(tile, arg)
|
|||
*/
|
||||
|
||||
int
|
||||
selEnumPFunc2(tile, arg)
|
||||
selEnumPFunc2(tile, dinfo, arg)
|
||||
Tile *tile; /* Tile found in the edit cell */
|
||||
TileType dinfo; /* Split tile information */
|
||||
struct searg *arg; /* Describes our search */
|
||||
{
|
||||
ExtRectList *lr;
|
||||
|
|
@ -282,7 +285,7 @@ selEnumPFunc2(tile, arg)
|
|||
TileType seltype;
|
||||
|
||||
if (IsSplit(tile))
|
||||
ttype = SplitSide(tile) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
ttype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
else
|
||||
ttype = TiGetTypeExact(tile);
|
||||
seltype = arg->sea_type & TT_LEFTMASK;
|
||||
|
|
@ -480,7 +483,8 @@ topbottom:
|
|||
/* purposes, it suffices to copy the tile if the */
|
||||
/* triangles are similar and to compute the */
|
||||
/* rectangular union are if opposite. */
|
||||
if ((arg->sea_type & TT_SIDE) == (TiGetTypeExact(tile) & TT_SIDE))
|
||||
|
||||
if ((arg->sea_type & TT_SIDE) == (dinfo & TT_SIDE))
|
||||
lr->r_type = ttype | (arg->sea_type &
|
||||
(TT_DIAGONAL | TT_SIDE | TT_DIRECTION));
|
||||
else
|
||||
|
|
|
|||
|
|
@ -410,8 +410,9 @@ typedef struct _shortsearchdata {
|
|||
*/
|
||||
|
||||
int
|
||||
selShortTileProc(tile, ssd)
|
||||
selShortTileProc(tile, dinfo, ssd)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
ShortSearchData *ssd;
|
||||
{
|
||||
const int curr = (int)TiGetClientINT(tile);
|
||||
|
|
@ -1629,8 +1630,9 @@ SelectStretch(x, y)
|
|||
*/
|
||||
|
||||
int
|
||||
selStretchEraseFunc(tile, plane)
|
||||
selStretchEraseFunc(tile, dinfo, plane)
|
||||
Tile *tile; /* Tile being moved in a stretch operation. */
|
||||
TileType dinfo; /* Split tile information */
|
||||
int *plane; /* Plane of tiles being searched */
|
||||
{
|
||||
Rect area, editArea;
|
||||
|
|
@ -1643,7 +1645,7 @@ selStretchEraseFunc(tile, plane)
|
|||
extern int selStretchEraseFunc2();
|
||||
|
||||
if (IsSplit(tile))
|
||||
type = (SplitSide(tile)) ? SplitRightType(tile) :
|
||||
type = (dinfo & TT_SIDE) ? SplitRightType(tile) :
|
||||
SplitLeftType(tile);
|
||||
else
|
||||
type = TiGetType(tile);
|
||||
|
|
@ -1763,8 +1765,9 @@ selStretchEraseFunc(tile, plane)
|
|||
}
|
||||
|
||||
int
|
||||
selStretchEraseFunc2(tile, pa)
|
||||
selStretchEraseFunc2(tile, dinfo, pa)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
planeAndArea *pa;
|
||||
{
|
||||
TileType type = TT_SPACE;
|
||||
|
|
@ -1805,8 +1808,9 @@ selStretchEraseFunc2(tile, pa)
|
|||
*/
|
||||
|
||||
int
|
||||
selStretchFillFunc(tile, plane)
|
||||
selStretchFillFunc(tile, dinfo, plane)
|
||||
Tile *tile; /* Tile in the old selection. */
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
int *plane; /* Plane of tile being searched */
|
||||
{
|
||||
Rect area;
|
||||
|
|
@ -1873,10 +1877,11 @@ selStretchFillFunc(tile, plane)
|
|||
*/
|
||||
|
||||
int
|
||||
selStretchFillFunc2(tile, area)
|
||||
selStretchFillFunc2(tile, dinfo, area)
|
||||
Tile *tile; /* Space tile that borders selected
|
||||
* paint.
|
||||
*/
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
Rect *area; /* A one-unit wide strip along the
|
||||
* border (i.e. the area in which
|
||||
* we're interested in space).
|
||||
|
|
@ -1921,10 +1926,11 @@ selStretchFillFunc2(tile, area)
|
|||
*/
|
||||
|
||||
int
|
||||
selStretchFillFunc3(tile, area)
|
||||
selStretchFillFunc3(tile, dinfo, area)
|
||||
Tile *tile; /* Tile of edit material that's about to
|
||||
* be left behind selection.
|
||||
*/
|
||||
TileType dinfo; /* Split tile information (unused) */
|
||||
Rect *area; /* The border area we're interested in,
|
||||
* in root coords.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -44,8 +44,9 @@
|
|||
*/
|
||||
|
||||
int
|
||||
selUnselFunc(tile, arg)
|
||||
selUnselFunc(tile, dinfo, arg)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* unused, but should be handled */
|
||||
ClientData *arg;
|
||||
{
|
||||
TileType type;
|
||||
|
|
@ -210,8 +211,9 @@ SelRemoveArea(area, mask, globmatch)
|
|||
*/
|
||||
|
||||
int
|
||||
selRemoveLabelPaintFunc(tile, label)
|
||||
selRemoveLabelPaintFunc(tile, dinfo, label)
|
||||
Tile *tile;
|
||||
TileType dinfo; /* (unused) */
|
||||
Label *label;
|
||||
{
|
||||
(void) DBPutFontLabel(Select2Def, &label->lab_rect, label->lab_font,
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ static char bestName[256];
|
|||
int
|
||||
SimConnectFunc(
|
||||
Tile *tile, /* Tile found. */
|
||||
TileType dinfo, /* Split tile information */
|
||||
TreeContext *cx) /* Describes context of search. The client
|
||||
* data is a pointer to the list head of
|
||||
* the conSrArg2's describing the areas
|
||||
|
|
@ -90,7 +91,7 @@ SimConnectFunc(
|
|||
TileTypeBitMask notConnectMask;
|
||||
const TileTypeBitMask *connectMask;
|
||||
TileType loctype, ctype;
|
||||
TileType dinfo = 0;
|
||||
TileType newdinfo = 0;
|
||||
int i, pNum;
|
||||
static char nodeName[256];
|
||||
CellDef *def;
|
||||
|
|
@ -132,7 +133,7 @@ SimConnectFunc(
|
|||
char c = *n;
|
||||
|
||||
SigDisableInterrupts();
|
||||
strcpy(nodeName, SimGetNodeName(cx->tc_scx, tile, tpath->tp_first));
|
||||
strcpy(nodeName, SimGetNodeName(cx->tc_scx, tile, dinfo, tpath->tp_first));
|
||||
SigEnableInterrupts();
|
||||
|
||||
*n = c;
|
||||
|
|
@ -149,8 +150,8 @@ SimConnectFunc(
|
|||
|
||||
if (IsSplit(tile))
|
||||
{
|
||||
dinfo = DBTransformDiagonal(loctype, &scx->scx_trans);
|
||||
loctype = (SplitSide(tile)) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
newdinfo = DBTransformDiagonal(loctype | dinfo, &scx->scx_trans);
|
||||
loctype = (dinfo & TT_SIDE) ? SplitRightType(tile) : SplitLeftType(tile);
|
||||
}
|
||||
|
||||
/* See if the destination cell contains stuff over the whole
|
||||
|
|
@ -197,13 +198,13 @@ SimConnectFunc(
|
|||
|
||||
def = csa2->csa2_use->cu_def;
|
||||
if (DBSrPaintNMArea((Tile *) NULL, def->cd_planes[pNum],
|
||||
dinfo, &newarea, ¬ConnectMask, dbcUnconnectFunc,
|
||||
newdinfo, &newarea, ¬ConnectMask, dbcUnconnectFunc,
|
||||
(ClientData) connectMask) == 0)
|
||||
return 0;
|
||||
|
||||
/* Paint this tile into the destination cell. */
|
||||
|
||||
DBNMPaintPlane(def->cd_planes[pNum], dinfo, &newarea,
|
||||
DBNMPaintPlane(def->cd_planes[pNum], newdinfo, &newarea,
|
||||
DBStdPaintTbl(loctype, pNum), (PaintUndoInfo *) NULL);
|
||||
|
||||
/* Since the whole area of this tile hasn't been recorded,
|
||||
|
|
@ -217,14 +218,14 @@ SimConnectFunc(
|
|||
|
||||
/* Only extend those sides bordering the diagonal tile */
|
||||
|
||||
if (dinfo & TT_DIAGONAL)
|
||||
if (newdinfo & TT_DIAGONAL)
|
||||
{
|
||||
if (dinfo & TT_SIDE) /* right */
|
||||
if (newdinfo & TT_SIDE) /* right */
|
||||
newarea.r_xtop += 1;
|
||||
else /* left */
|
||||
newarea.r_xbot -= 1;
|
||||
if (((dinfo & TT_SIDE) >> 1)
|
||||
== (dinfo & TT_DIRECTION)) /* top */
|
||||
if (((newdinfo & TT_SIDE) >> 1)
|
||||
== (newdinfo & TT_DIRECTION)) /* top */
|
||||
newarea.r_ytop += 1;
|
||||
else /* bottom */
|
||||
newarea.r_ybot -= 1;
|
||||
|
|
@ -277,7 +278,7 @@ SimConnectFunc(
|
|||
|
||||
csa2->csa2_list[csa2->csa2_top].area = newarea;
|
||||
csa2->csa2_list[csa2->csa2_top].connectMask = connectMask;
|
||||
csa2->csa2_list[csa2->csa2_top].dinfo = dinfo;
|
||||
csa2->csa2_list[csa2->csa2_top].dinfo = newdinfo;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -527,6 +528,7 @@ efPreferredName(
|
|||
* int
|
||||
* func(tile, clientData)
|
||||
* Tile *tile;
|
||||
* TileType dinfo;
|
||||
* ClientData clientData;
|
||||
* {
|
||||
* }
|
||||
|
|
@ -574,7 +576,7 @@ SimSrConnect(
|
|||
{
|
||||
struct conSrArg csa;
|
||||
int startPlane, result;
|
||||
Tile *startTile; /* Starting tile for search. */
|
||||
TileAndDinfo tad;
|
||||
|
||||
result = 0;
|
||||
csa.csa_def = def;
|
||||
|
|
@ -585,14 +587,14 @@ SimSrConnect(
|
|||
* the tile address and returns.
|
||||
*/
|
||||
|
||||
startTile = NULL;
|
||||
tad.tad_tile = NULL;
|
||||
for (startPlane = PL_TECHDEPBASE; startPlane < DBNumPlanes; startPlane++)
|
||||
{
|
||||
if (DBSrPaintArea((Tile *) NULL,
|
||||
def->cd_planes[startPlane], startArea, mask,
|
||||
dbSrConnectStartFunc, PTR2CD(&startTile)) != 0) break;
|
||||
dbSrConnectStartFunc, PTR2CD(&tad)) != 0) break;
|
||||
}
|
||||
if (startTile == NULL) return 0;
|
||||
if (tad.tad_tile == NULL) return 0;
|
||||
|
||||
/* Pass 1. During this pass the client function gets called. */
|
||||
|
||||
|
|
@ -601,7 +603,7 @@ SimSrConnect(
|
|||
csa.csa_clear = FALSE;
|
||||
csa.csa_connect = connect;
|
||||
csa.csa_pNum = startPlane;
|
||||
if (dbSrConnectFunc(startTile, PTR2CD(&csa)) != 0) result = 1;
|
||||
if (dbSrConnectFunc(tad.tad_tile, tad.tad_dinfo, PTR2CD(&csa)) != 0) result = 1;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -622,6 +624,7 @@ SimSrConnect(
|
|||
* int
|
||||
* func(tile, cxp)
|
||||
* Tile *tile;
|
||||
* TileType dinfo;
|
||||
* TreeContext *cxp;
|
||||
* {
|
||||
* }
|
||||
|
|
|
|||
140
sim/SimExtract.c
140
sim/SimExtract.c
|
|
@ -63,7 +63,6 @@ typedef struct def_list_elt
|
|||
* finished.
|
||||
*/
|
||||
|
||||
|
||||
static DefListElt *DefList = (DefListElt *) NULL;
|
||||
/* list of cell defs used in the node name search */
|
||||
|
||||
|
|
@ -168,7 +167,7 @@ SimInitDefList(void)
|
|||
DefListElt *p, *q;
|
||||
|
||||
p = q = DefList;
|
||||
while (p != (DefListElt *) NULL) {
|
||||
while (p != (DefListElt *)NULL) {
|
||||
q = p;
|
||||
p = p->dl_next;
|
||||
ExtResetTiles(q->dl_def, extUnInit);
|
||||
|
|
@ -197,7 +196,7 @@ void
|
|||
SimAddNodeList(
|
||||
NodeRegion *newnode)
|
||||
{
|
||||
if( NodeRegList != (NodeRegion *) NULL )
|
||||
if (NodeRegList != (NodeRegion *)NULL)
|
||||
newnode->nreg_next = NodeRegList;
|
||||
NodeRegList = newnode;
|
||||
}
|
||||
|
|
@ -224,10 +223,10 @@ SimFreeNodeRegs(void)
|
|||
{
|
||||
NodeRegion *p, *q;
|
||||
|
||||
if( NodeRegList != (NodeRegion *) NULL ) /* sanity */
|
||||
ExtFreeLabRegions((LabRegion *) NodeRegList );
|
||||
if (NodeRegList != (NodeRegion *) NULL) /* sanity */
|
||||
ExtFreeLabRegions((LabRegion *)NodeRegList);
|
||||
|
||||
NodeRegList = (NodeRegion *) NULL;
|
||||
NodeRegList = (NodeRegion *)NULL;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -239,6 +238,7 @@ SimFreeNodeRegs(void)
|
|||
* to the region being searched.
|
||||
*----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
int
|
||||
SimInitConnTables(void)
|
||||
{
|
||||
|
|
@ -247,15 +247,15 @@ SimInitConnTables(void)
|
|||
|
||||
SimTransMask = ExtCurStyle->exts_deviceMask;
|
||||
|
||||
TTMaskZero( &SimSDMask );
|
||||
for( t = TT_TECHDEPBASE; t < DBNumTypes; t++ )
|
||||
TTMaskZero(&SimSDMask);
|
||||
for (t = TT_TECHDEPBASE; t < DBNumTypes; t++)
|
||||
{
|
||||
devptr = ExtCurStyle->exts_device[t];
|
||||
for (i = 0; !TTMaskHasType(&devptr->exts_deviceSDTypes[i],
|
||||
TT_SPACE); i++)
|
||||
{
|
||||
TTMaskSetMask( &SimSDMask, &devptr->exts_deviceSDTypes[i] );
|
||||
TTMaskZero( &SimFetMask[t] );
|
||||
TTMaskSetMask(&SimSDMask, &devptr->exts_deviceSDTypes[i]);
|
||||
TTMaskZero(&SimFetMask[t]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -283,8 +283,8 @@ SimInitConnTables(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define IsTransGate( T ) ( TTMaskHasType( &SimTransMask, T ) )
|
||||
#define IsTransTerm( T ) ( TTMaskHasType( &SimSDMask, T ) )
|
||||
#define IsTransGate(T) (TTMaskHasType(&SimTransMask, T))
|
||||
#define IsTransTerm(T) (TTMaskHasType(&SimSDMask, T))
|
||||
|
||||
|
||||
typedef struct
|
||||
|
|
@ -307,14 +307,18 @@ typedef struct
|
|||
} SimTrans;
|
||||
|
||||
|
||||
/* NOTE: This is lazy; these should not be global variables */
|
||||
|
||||
static Tile *gateTile; /* Set to point to a transistor tile
|
||||
* whose gate is connected to the
|
||||
* node being searched
|
||||
*/
|
||||
static TileType gateDinfo; /* Split tile information, if needed */
|
||||
static Tile *sdTile; /* Set to point to a transistor tile
|
||||
* whose source/drain is connected
|
||||
* to the node being searched
|
||||
*/
|
||||
static TileType sdDinfo; /* Split tile information, if needed */
|
||||
static SimTrans transistor; /* Transistor being extracted */
|
||||
|
||||
|
||||
|
|
@ -351,20 +355,22 @@ SimTxtorLabel(
|
|||
r1.r_xtop = r1.r_xbot + 1;
|
||||
r1.r_ytop = r1.r_ybot + 1;
|
||||
GeoTransRect( tm, &r1, &r2 );
|
||||
if( nterm > 1 )
|
||||
if (nterm > 1)
|
||||
nterm = 1;
|
||||
sprintf( name, "@=%c%d,%d", "gsd"[nterm+1], r2.r_xbot, r2.r_ybot );
|
||||
sprintf(name, "@=%c%d,%d", "gsd"[nterm+1], r2.r_xbot, r2.r_ybot);
|
||||
|
||||
return( name );
|
||||
return name;
|
||||
}
|
||||
|
||||
int
|
||||
SimSDTransFunc(
|
||||
Tile *tile,
|
||||
Tile **ptile)
|
||||
TileType dinfo)
|
||||
{
|
||||
*ptile = tile;
|
||||
return( 1 );
|
||||
/* See above; these should not be global variables! */
|
||||
sdTile = tile;
|
||||
sdDinfo = dinfo;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -477,6 +483,7 @@ SimTermNum(
|
|||
int
|
||||
SimTransistorTile(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
int pNum,
|
||||
FindRegion *arg)
|
||||
{
|
||||
|
|
@ -484,15 +491,15 @@ SimTransistorTile(
|
|||
TileType t;
|
||||
ExtDevice *devptr;
|
||||
|
||||
extSetNodeNum((LabRegion *)&transistor, pNum, tile);
|
||||
extSetNodeNum((LabRegion *)&transistor, pNum, tile, dinfo);
|
||||
if (transistor.t_do_terms)
|
||||
{
|
||||
t = TiGetType(tile);
|
||||
devptr = ExtCurStyle->exts_device[t];
|
||||
for (i = 0; !TTMaskHasType(&devptr->exts_deviceSDTypes[i],
|
||||
TT_SPACE); i++)
|
||||
extEnumTilePerim(tile, &devptr->exts_deviceSDTypes[i], pNum,
|
||||
SimTransTerms, (ClientData) &transistor );
|
||||
extEnumTilePerim(tile, dinfo, &devptr->exts_deviceSDTypes[i],
|
||||
pNum, SimTransTerms, (ClientData) &transistor );
|
||||
}
|
||||
|
||||
return (0);
|
||||
|
|
@ -502,39 +509,41 @@ SimTransistorTile(
|
|||
int
|
||||
SimFindTxtor(
|
||||
Tile *tile,
|
||||
TileType dinfo,
|
||||
int pNum,
|
||||
FindRegion *arg)
|
||||
{
|
||||
TileType type;
|
||||
|
||||
extSetNodeNum( (LabRegion *) arg->fra_region, pNum, tile );
|
||||
extSetNodeNum((LabRegion *)arg->fra_region, pNum, tile, dinfo);
|
||||
|
||||
if( ! SimUseCoords ) /* keep searching, forget transistors */
|
||||
return( 0 );
|
||||
if (!SimUseCoords) /* keep searching, forget transistors */
|
||||
return 0;
|
||||
|
||||
type = TiGetType( tile );
|
||||
type = TiGetType(tile);
|
||||
|
||||
if( IsTransGate( type ) )
|
||||
if (IsTransGate(type))
|
||||
{
|
||||
gateTile = tile; /* found a transistor gate, stop searching */
|
||||
gateDinfo = dinfo;
|
||||
return( 1 );
|
||||
}
|
||||
else if( IsTransTerm( type ) && sdTile == (Tile *) NULL )
|
||||
else if (IsTransTerm(type) && (sdTile == (Tile *)NULL))
|
||||
{
|
||||
Rect area;
|
||||
|
||||
TITORECT( tile, &area );
|
||||
GEO_EXPAND( &area, 1, &area );
|
||||
for( pNum = PL_TECHDEPBASE; pNum < DBNumPlanes; pNum++ )
|
||||
if( PlaneMaskHasPlane( SimFetPlanes, pNum ) )
|
||||
TITORECT(tile, &area);
|
||||
GEO_EXPAND(&area, 1, &area);
|
||||
for (pNum = PL_TECHDEPBASE; pNum < DBNumPlanes; pNum++)
|
||||
if (PlaneMaskHasPlane(SimFetPlanes, pNum))
|
||||
{
|
||||
if( DBSrPaintArea((Tile *) NULL,
|
||||
arg->fra_def->cd_planes[pNum], &area, &SimFetMask[type],
|
||||
SimSDTransFunc, (ClientData) &sdTile ) )
|
||||
if (DBSrPaintArea((Tile *)NULL,
|
||||
arg->fra_def->cd_planes[pNum], &area, &SimFetMask[type],
|
||||
SimSDTransFunc, (ClientData)NULL))
|
||||
break;
|
||||
}
|
||||
}
|
||||
return( 0 );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -557,7 +566,8 @@ SimFindTxtor(
|
|||
NodeSpec *
|
||||
SimFindOneNode(
|
||||
SearchContext *sx,
|
||||
Tile *tile)
|
||||
Tile *tile,
|
||||
TileType dinfo)
|
||||
{
|
||||
CellDef *def = sx->scx_use->cu_def;
|
||||
NodeRegion *reg;
|
||||
|
|
@ -565,7 +575,7 @@ SimFindOneNode(
|
|||
TileType type, loctype;
|
||||
static NodeSpec ret;
|
||||
|
||||
/* Allocate a new node */
|
||||
/* Allocate a new node */
|
||||
reg = (NodeRegion *) mallocMagic((unsigned) (sizeof(NodeRegion) ));
|
||||
reg->nreg_labels = (LabelList *) NULL;
|
||||
reg->nreg_cap = 0;
|
||||
|
|
@ -573,14 +583,15 @@ SimFindOneNode(
|
|||
reg->nreg_pnum = DBNumPlanes;
|
||||
reg->nreg_next = (NodeRegion *) NULL;
|
||||
|
||||
gateTile = sdTile = (Tile *) NULL;
|
||||
gateTile = sdTile = (Tile *)NULL;
|
||||
gateDinfo = sdDinfo = (TileType)0;
|
||||
|
||||
/* Find all connected paint in this cell */
|
||||
/* Find all connected paint in this cell */
|
||||
arg.fra_connectsTo = ExtCurStyle->exts_nodeConn;
|
||||
arg.fra_def = def;
|
||||
|
||||
if (IsSplit(tile))
|
||||
type = SplitSide(tile) ? TiGetRightType(tile) : TiGetLeftType(tile);
|
||||
type = (dinfo & TT_SIDE) ? TiGetRightType(tile) : TiGetLeftType(tile);
|
||||
else
|
||||
type = TiGetTypeExact(tile);
|
||||
|
||||
|
|
@ -588,9 +599,9 @@ SimFindOneNode(
|
|||
arg.fra_uninit = (ClientData) extUnInit;
|
||||
arg.fra_region = (ExtRegion *) reg;
|
||||
arg.fra_each = SimFindTxtor;
|
||||
(void) ExtFindNeighbors( tile, arg.fra_pNum, &arg );
|
||||
(void) ExtFindNeighbors(tile, dinfo, arg.fra_pNum, &arg);
|
||||
|
||||
if( gateTile != (Tile *) NULL )
|
||||
if (gateTile != (Tile *)NULL)
|
||||
{
|
||||
/* Determine the transistor position (leftmost-lowest tile) */
|
||||
transistor.t_pnum = DBNumPlanes;
|
||||
|
|
@ -600,7 +611,7 @@ SimFindOneNode(
|
|||
arg.fra_connectsTo = &SimTransMask;
|
||||
|
||||
if (IsSplit(tile))
|
||||
loctype = SplitSide(gateTile) ? TiGetRightType(gateTile)
|
||||
loctype = (gateDinfo & TT_SIDE) ? TiGetRightType(gateTile)
|
||||
: TiGetLeftType(gateTile);
|
||||
else
|
||||
loctype = TiGetTypeExact(gateTile);
|
||||
|
|
@ -609,7 +620,7 @@ SimFindOneNode(
|
|||
arg.fra_uninit = (ClientData) extUnInit;
|
||||
arg.fra_region = (ExtRegion *) reg;
|
||||
arg.fra_each = SimTransistorTile;
|
||||
(void) ExtFindNeighbors( gateTile, arg.fra_pNum, &arg );
|
||||
(void) ExtFindNeighbors(gateTile, gateDinfo, arg.fra_pNum, &arg);
|
||||
|
||||
/* Unmark current region since not all paint was traced */
|
||||
arg.fra_connectsTo = ExtCurStyle->exts_nodeConn;
|
||||
|
|
@ -617,19 +628,19 @@ SimFindOneNode(
|
|||
arg.fra_uninit = (ClientData) reg;
|
||||
arg.fra_region = (ExtRegion *) extUnInit;
|
||||
arg.fra_each = (int (*)()) NULL;
|
||||
(void) ExtFindNeighbors( tile, arg.fra_pNum, &arg );
|
||||
(void) ExtFindNeighbors(tile, dinfo, arg.fra_pNum, &arg);
|
||||
|
||||
freeMagic( reg );
|
||||
|
||||
ret.nd_name = SimTxtorLabel( -1, &sx->scx_trans, &transistor );
|
||||
ret.nd_name = SimTxtorLabel(-1, &sx->scx_trans, &transistor);
|
||||
ret.nd_what = ND_NAME;
|
||||
}
|
||||
else if( sdTile != (Tile *) NULL )
|
||||
else if (sdTile != (Tile *)NULL)
|
||||
{
|
||||
int tNum;
|
||||
|
||||
SimAddNodeList( reg );
|
||||
SimAddDefList( def );
|
||||
SimAddNodeList(reg);
|
||||
SimAddDefList(def);
|
||||
|
||||
transistor.t_pnum = DBNumPlanes;
|
||||
transistor.t_nterm = 0;
|
||||
|
|
@ -638,44 +649,44 @@ SimFindOneNode(
|
|||
/* collect the transistor position, and its terminals */
|
||||
arg.fra_connectsTo = &SimTransMask;
|
||||
|
||||
if (IsSplit(tile))
|
||||
loctype = SplitSide(sdTile) ? TiGetRightType(sdTile)
|
||||
if (IsSplit(sdTile))
|
||||
loctype = (sdDinfo & TT_SIDE) ? TiGetRightType(sdTile)
|
||||
: TiGetLeftType(sdTile);
|
||||
else
|
||||
loctype = TiGetTypeExact(sdTile);
|
||||
|
||||
arg.fra_pNum = DBPlane(loctype);
|
||||
arg.fra_uninit = TiGetClient(sdTile);
|
||||
arg.fra_region = (ExtRegion *) &ret;
|
||||
arg.fra_region = (ExtRegion *)&ret;
|
||||
arg.fra_each = SimTransistorTile;
|
||||
(void) ExtFindNeighbors( sdTile, arg.fra_pNum, &arg );
|
||||
(void) ExtFindNeighbors(sdTile, sdDinfo, arg.fra_pNum, &arg);
|
||||
|
||||
/* Unmark the transitor, since its not part of this region */
|
||||
arg.fra_region = (ExtRegion *) arg.fra_uninit;
|
||||
arg.fra_uninit = (ClientData) &ret;
|
||||
arg.fra_each = (int (*)()) NULL;
|
||||
(void) ExtFindNeighbors( sdTile, arg.fra_pNum, &arg );
|
||||
(void) ExtFindNeighbors(sdTile, sdDinfo, arg.fra_pNum, &arg);
|
||||
|
||||
if( (tNum = SimTermNum( &transistor, reg )) < 0 )
|
||||
if ((tNum = SimTermNum(&transistor, reg)) < 0)
|
||||
{
|
||||
TxPrintf( "\tSimFindOneNode: bad transistor terminal number\n" );
|
||||
TxPrintf("\tSimFindOneNode: bad transistor terminal number\n");
|
||||
goto use_name;
|
||||
}
|
||||
|
||||
ret.nd_name = SimTxtorLabel( tNum, &sx->scx_trans, &transistor );
|
||||
ret.nd_name = SimTxtorLabel(tNum, &sx->scx_trans, &transistor);
|
||||
ret.nd_what = ND_NAME;
|
||||
}
|
||||
else /* no transistors found, get the regions labels */
|
||||
{
|
||||
SimAddNodeList( reg );
|
||||
SimAddDefList( def );
|
||||
SimAddNodeList(reg);
|
||||
SimAddDefList(def);
|
||||
|
||||
use_name:
|
||||
ExtLabelOneRegion( def, ExtCurStyle->exts_nodeConn, reg );
|
||||
ExtLabelOneRegion(def, ExtCurStyle->exts_nodeConn, reg);
|
||||
ret.nd_region = reg;
|
||||
ret.nd_what = ND_REGION;
|
||||
}
|
||||
return( &ret );
|
||||
return &ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -707,6 +718,7 @@ SimGetNodeName(
|
|||
Tile *tp, /* tile in this cell which is part
|
||||
* of the node
|
||||
*/
|
||||
TileType dinfo, /* Split tile information */
|
||||
const char *path) /* path name of hierarchy of search */
|
||||
{
|
||||
CellDef *def = sx->scx_use->cu_def;
|
||||
|
|
@ -719,7 +731,7 @@ SimGetNodeName(
|
|||
|
||||
SimSawAbortString = FALSE;
|
||||
|
||||
if( SimUseCoords && simExtStyle != ExtCurStyle )
|
||||
if (SimUseCoords && simExtStyle != ExtCurStyle)
|
||||
SimInitConnTables();
|
||||
|
||||
/* check to see if this tile has been extracted before */
|
||||
|
|
@ -728,11 +740,11 @@ SimGetNodeName(
|
|||
{
|
||||
NodeSpec *ns;
|
||||
|
||||
ns = SimFindOneNode(sx, tp);
|
||||
ns = SimFindOneNode(sx, tp, dinfo);
|
||||
if( ns->nd_what == ND_NAME )
|
||||
{
|
||||
SimSawAbortString = TRUE;
|
||||
return( ns->nd_name );
|
||||
return ns->nd_name;
|
||||
}
|
||||
nodeList = ns->nd_region;
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue