Modified the configure scripts and makefile per Proppy's comments

in github issue #149.  This causes magic to no longer write log files
for "make" and "make install" but will properly exit with a non-zero
return code on any error during compile.

Also:  Corrected the command "tech drc surround <type1> <type2>" so
that it now returns the correct value when <type1> and <type2> are in
the same plane.  Added new command "tech drc directional <type1> <type2>"
which works the same way as "tech drc surround" except for directional
surround rules.  Used this to generate vias from "def write" with the
correct metal surround amounts included in the via definiton.  The
route analysis then ignores tile slivers that make up the surrounding
material around contacts.  Also implemented a method that handles
routes that are made of multiple thin tiles due to the maximum horizontal
stripes rule.  Now magic handles "def write" well except for not dealing
with non-minimum-width routes unless they're specifically called out as
"special" nets.
This commit is contained in:
Tim Edwards
2022-03-29 16:52:01 -04:00
parent 3bc80a9869
commit 0c584f9e77
8 changed files with 392 additions and 43 deletions
+76 -1
View File
@@ -4115,7 +4115,7 @@ DRCGetDefaultLayerSurround(ttype1, ttype2)
{
int layerSurround = 0;
DRCCookie *cptr;
TileTypeBitMask *set;
TileTypeBitMask *set, *cset;
for (cptr = DRCCurStyle->DRCRulesTbl[ttype1][TT_SPACE]; cptr != (DRCCookie *) NULL;
cptr = cptr->drcc_next)
@@ -4137,6 +4137,81 @@ DRCGetDefaultLayerSurround(ttype1, ttype2)
}
}
}
if (layerSurround > 0) return layerSurround;
for (cptr = DRCCurStyle->DRCRulesTbl[TT_SPACE][ttype1]; cptr != (DRCCookie *) NULL;
cptr = cptr->drcc_next)
{
if ((cptr->drcc_flags & DRC_REVERSE) == 0) /* FORWARD only */
{
set = &cptr->drcc_mask;
cset = &cptr->drcc_corner;
if (TTMaskHasType(set, TT_SPACE) && !TTMaskHasType(set, ttype1))
if ((TTMaskHasType(cset, ttype2)) &&
(cptr->drcc_flags && DRC_BOTHCORNERS) &&
(cptr->drcc_edgeplane == cptr->drcc_plane) &&
(cptr->drcc_dist == cptr->drcc_cdist))
{
layerSurround = cptr->drcc_dist;
/* Diagnostic */
/*
TxPrintf("DRC: Layer %s has default surround %d over layer %s\n",
DBTypeLongNameTbl[ttype2], layerSurround,
DBTypeLongNameTbl[ttype1]);
*/
}
}
}
return layerSurround;
}
/*
*-----------------------------------------------------------------------------
* DRCGetDirectionalLayerSurround ---
*
* Determine the minimum required surround amount of layer type 2
* around layer type 1 for a directional surround rule (rule
* applies for two opposing sides of layer type 1).
*
* Results:
* The minimum spacing between the specified magic layer types,
* in magic internal units
*
* Side effects:
* None.
*
*-----------------------------------------------------------------------------
*/
int
DRCGetDirectionalLayerSurround(ttype1, ttype2)
TileType ttype1, ttype2;
{
int layerSurround = 0;
DRCCookie *cptr, *cnext;
TileTypeBitMask *set, *cset;
for (cptr = DRCCurStyle->DRCRulesTbl[ttype1][TT_SPACE]; cptr != (DRCCookie *) NULL;
cptr = cptr->drcc_next)
{
if (cptr->drcc_flags & DRC_TRIGGER)
{
set = &cptr->drcc_mask;
if (!TTMaskHasType(set, TT_SPACE) && TTMaskHasType(set, ttype2))
if ((cptr->drcc_plane == cptr->drcc_edgeplane) &&
(cptr->drcc_cdist == 0))
{
layerSurround = cptr->drcc_dist;
/* Diagnostic */
/*
TxPrintf("DRC: Layer %s has default surround %d over layer %s\n",
DBTypeLongNameTbl[ttype2], layerSurround,
DBTypeLongNameTbl[ttype1]);
*/
}
cnext = cptr->drcc_next;
}
}
return layerSurround;
}