mirror of
https://github.com/RTimothyEdwards/magic.git
synced 2026-09-03 16:29:09 +02:00
Additional work to incorporate handling of split tiles throughout
the extraction, especially for routines like ExtFindNeighbors where it was previously not handled at all. A new method was introduced in which split tiles with neither side TT_SPACE will get an extra allocated structure that contains pointers to two regions representing the nodes on the tile's left and right sides, independently. The fix (as yet not fully tested) should resolve problems with extracting the sky130 I/O cells, which contain a FET with 45 degree angles on the gate, where a split tile is divided between the gate and the source or drain, and therefore represents two different nodes. Also, there were extraction errors related to incorrect handling of split tiles having only one node, where a split tile became connected to the wrong node.
This commit is contained in:
+78
-1
@@ -659,7 +659,7 @@ DBResetTilePlane(plane, cdata)
|
||||
/* Each iteration visits another tile on the LHS of the search area */
|
||||
while (TOP(tp) > rect->r_ybot)
|
||||
{
|
||||
/* Each iteration frees another tile */
|
||||
/* Each iteration resets another tile */
|
||||
enumerate:
|
||||
tp->ti_client = cdata;
|
||||
|
||||
@@ -695,6 +695,83 @@ enumerate:
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------
|
||||
*
|
||||
* DBResetTilePlaneSpecial --
|
||||
*
|
||||
* This routine works like DBResetTilePlane(), but is designed
|
||||
* specifically to be run after extFindNodes() or ExtFindRegions()
|
||||
* to check for split tiles that have an allocated ExtSplitRegion
|
||||
* structure in the ClientData; this needs to be freed before
|
||||
* resetting the ClientData value to "cdata". It is not necessary
|
||||
* to know anything about the ExtSplitRegion structure other than
|
||||
* the condition under which it can be expected to be present,
|
||||
* which is a split tile with neither side having type TT_SPACE.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* Resets the ti_client fields of all tiles.
|
||||
*
|
||||
* --------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
DBResetTilePlaneSpecial(plane, cdata)
|
||||
Plane *plane; /* Plane whose tiles are to be reset */
|
||||
ClientData cdata;
|
||||
{
|
||||
Tile *tp, *tpnew;
|
||||
const Rect *rect = &TiPlaneRect;
|
||||
|
||||
/* Start with the leftmost non-infinity tile in the plane */
|
||||
tp = TR(plane->pl_left);
|
||||
|
||||
/* Each iteration visits another tile on the LHS of the search area */
|
||||
while (TOP(tp) > rect->r_ybot)
|
||||
{
|
||||
/* Each iteration resets another tile */
|
||||
enumerate:
|
||||
if (IsSplit(tp))
|
||||
if ((TiGetLeftType(tp) != TT_SPACE) && (TiGetRightType(tp) != TT_SPACE))
|
||||
freeMagic(tp->ti_client);
|
||||
|
||||
tp->ti_client = cdata;
|
||||
|
||||
/* Move along to the next tile */
|
||||
tpnew = TR(tp);
|
||||
if (LEFT(tpnew) < rect->r_xtop)
|
||||
{
|
||||
while (BOTTOM(tpnew) >= rect->r_ytop) tpnew = LB(tpnew);
|
||||
if (BOTTOM(tpnew) >= BOTTOM(tp) || BOTTOM(tp) <= rect->r_ybot)
|
||||
{
|
||||
tp = tpnew;
|
||||
goto enumerate;
|
||||
}
|
||||
}
|
||||
|
||||
/* Each iteration returns one tile further to the left */
|
||||
while (LEFT(tp) > rect->r_xbot)
|
||||
{
|
||||
if (BOTTOM(tp) <= rect->r_ybot)
|
||||
return;
|
||||
tpnew = LB(tp);
|
||||
tp = BL(tp);
|
||||
if (BOTTOM(tpnew) >= BOTTOM(tp) || BOTTOM(tp) <= rect->r_ybot)
|
||||
{
|
||||
tp = tpnew;
|
||||
goto enumerate;
|
||||
}
|
||||
}
|
||||
|
||||
/* At left edge -- walk down to next tile along the left edge */
|
||||
for (tp = LB(tp); RIGHT(tp) <= rect->r_xbot; tp = TR(tp))
|
||||
/* Nothing */;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* --------------------------------------------------------------------
|
||||
*
|
||||
|
||||
@@ -978,6 +978,7 @@ extern int dbIsPrimary();
|
||||
extern void dbTechMatchResidues();
|
||||
extern void DBUndoInit();
|
||||
extern void DBResetTilePlane();
|
||||
extern void DBResetTilePlaneSpecial();
|
||||
extern void DBNewYank();
|
||||
extern int DBSrPaintClient();
|
||||
extern int DBSrConnect();
|
||||
|
||||
Reference in New Issue
Block a user