Additional corrections to the wiring for some code changes that

were made where contacts are placed when shifting up on metal
layer but not made for the reverse case.  Also corrected one
inconsistency with non-minimum width wires.
This commit is contained in:
Tim Edwards 2019-06-04 12:13:47 -04:00
parent e4bfe864ba
commit 8170dbe01f
2 changed files with 104 additions and 35 deletions

View File

@ -1348,7 +1348,7 @@ CmdWire(w, cmd)
case DECREMENT: case DECREMENT:
if (cmd->tx_argc != 3 && cmd->tx_argc != 4) if (cmd->tx_argc != 3 && cmd->tx_argc != 4)
goto badargs; goto badargs;
if (!strcmp(cmd->tx_argv[2], "type")) if (!strcmp(cmd->tx_argv[2], "type") || !strcmp(cmd->tx_argv[2], "layer"))
{ {
Contact *contact; Contact *contact;
type = TT_SPACE; type = TT_SPACE;
@ -1371,7 +1371,7 @@ CmdWire(w, cmd)
else else
{ {
width = DRCGetDefaultLayerWidth(type); width = DRCGetDefaultLayerWidth(type);
WireAddContact(type, width); WireAddContact(type, (WireWidth < width) ? width : WireWidth);
} }
} }
else if (!strcmp(cmd->tx_argv[2], "width")) else if (!strcmp(cmd->tx_argv[2], "width"))

View File

@ -706,6 +706,9 @@ WireShowLeg()
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
*/ */
#define WIRING_CONTACT_UP 1
#define WIRING_CONTACT_DOWN 0
void void
WireAddContact(newType, newWidth) WireAddContact(newType, newWidth)
TileType newType; /* New type of material to use for wiring. TileType newType; /* New type of material to use for wiring.
@ -723,8 +726,9 @@ WireAddContact(newType, newWidth)
CellDef *boxRootDef; CellDef *boxRootDef;
TileType oldType; TileType oldType;
TileTypeBitMask mask, allmask; TileTypeBitMask mask, allmask;
int oldOverlap, newOverlap, oldExtend, newExtend; int conSurround1, conSurround2, conExtend1, conExtend2, conSize;
int i, totalSize, oldDir; int oldOverlap, newOverlap;
int i, totalSize, oldDir, updown;
Contact *contact; Contact *contact;
SearchContext scx; SearchContext scx;
@ -768,19 +772,39 @@ WireAddContact(newType, newWidth)
if ((contact->con_layer1 == oldType) && if ((contact->con_layer1 == oldType) &&
(contact->con_layer2 == WireType)) (contact->con_layer2 == WireType))
{ {
oldOverlap = contact->con_surround1 / WireUnits; conSurround1 = contact->con_surround1 / WireUnits;
newOverlap = contact->con_surround2 / WireUnits; if ((contact->con_surround1 % WireUnits) != 0) conSurround1++;
oldExtend = contact->con_extend1 / WireUnits; conSurround2 = contact->con_surround2 / WireUnits;
newExtend = contact->con_extend2 / WireUnits; if ((contact->con_surround2 % WireUnits) != 0) conSurround2++;
conExtend1 = contact->con_extend1 / WireUnits;
if ((contact->con_extend1 % WireUnits) != 0) conExtend1++;
conExtend2 = contact->con_extend2 / WireUnits;
if ((contact->con_extend2 % WireUnits) != 0) conExtend2++;
conSize = contact->con_size / WireUnits;
if ((contact->con_size % WireUnits) != 0) conSize++;
oldOverlap = conSurround1;
newOverlap = conSurround2;
updown = WIRING_CONTACT_UP;
goto gotContact; goto gotContact;
} }
if ((contact->con_layer2 == oldType) && if ((contact->con_layer2 == oldType) &&
(contact->con_layer1 == WireType)) (contact->con_layer1 == WireType))
{ {
oldOverlap = contact->con_surround2 / WireUnits; conSurround1 = contact->con_surround1 / WireUnits;
newOverlap = contact->con_surround1 / WireUnits; if ((contact->con_surround1 % WireUnits) != 0) conSurround1++;
oldExtend = contact->con_extend2 / WireUnits; conSurround2 = contact->con_surround2 / WireUnits;
newExtend = contact->con_extend1 / WireUnits; if ((contact->con_surround2 % WireUnits) != 0) conSurround2++;
conExtend1 = contact->con_extend1 / WireUnits;
if ((contact->con_extend1 % WireUnits) != 0) conExtend1++;
conExtend2 = contact->con_extend2 / WireUnits;
if ((contact->con_extend2 % WireUnits) != 0) conExtend2++;
conSize = contact->con_size / WireUnits;
if ((contact->con_size % WireUnits) != 0) conSize++;
oldOverlap = conSurround2;
newOverlap = conSurround1;
updown = WIRING_CONTACT_DOWN;
goto gotContact; goto gotContact;
} }
} }
@ -798,7 +822,8 @@ WireAddContact(newType, newWidth)
*/ */
gotContact: gotContact:
totalSize = (contact->con_size / WireUnits) + 2 * oldOverlap; totalSize = conSize + 2 * oldOverlap;
if (totalSize < WireWidth) totalSize = WireWidth;
contactArea = oldLeg; contactArea = oldLeg;
if ((contactArea.r_xtop - contactArea.r_xbot) < totalSize) if ((contactArea.r_xtop - contactArea.r_xbot) < totalSize)
{ {
@ -816,22 +841,22 @@ WireAddContact(newType, newWidth)
switch (oldDir) switch (oldDir)
{ {
case GEO_NORTH: case GEO_NORTH:
i = contactArea.r_ytop - WireWidth; i = contactArea.r_ytop - totalSize;
if (i > contactArea.r_ybot) if (i > contactArea.r_ybot)
contactArea.r_ybot = i; contactArea.r_ybot = i;
break; break;
case GEO_SOUTH: case GEO_SOUTH:
i = contactArea.r_ybot + WireWidth; i = contactArea.r_ybot + totalSize;
if (i < contactArea.r_ytop) if (i < contactArea.r_ytop)
contactArea.r_ytop = i; contactArea.r_ytop = i;
break; break;
case GEO_EAST: case GEO_EAST:
i = contactArea.r_xtop - WireWidth; i = contactArea.r_xtop - totalSize;
if (i > contactArea.r_xbot) if (i > contactArea.r_xbot)
contactArea.r_xbot = i; contactArea.r_xbot = i;
break; break;
case GEO_WEST: case GEO_WEST:
i = contactArea.r_xbot + WireWidth; i = contactArea.r_xbot + totalSize;
if (i < contactArea.r_xtop) if (i < contactArea.r_xtop)
contactArea.r_xtop = i; contactArea.r_xtop = i;
break; break;
@ -844,23 +869,23 @@ WireAddContact(newType, newWidth)
TTMaskSetOnlyType(&mask, contact->con_type); TTMaskSetOnlyType(&mask, contact->con_type);
TTMaskSetOnlyType(&allmask, contact->con_type); TTMaskSetOnlyType(&allmask, contact->con_type);
DBPaintValid(EditCellUse->cu_def, &tmp, &mask, 0); DBPaintValid(EditCellUse->cu_def, &tmp, &mask, 0);
if (contact->con_surround1 != 0) if (conSurround1 != 0)
{ {
TTMaskSetOnlyType(&mask, contact->con_layer1); TTMaskSetOnlyType(&mask, contact->con_layer1);
TTMaskSetType(&allmask, contact->con_layer1); TTMaskSetType(&allmask, contact->con_layer1);
GEO_EXPAND(&tmp, contact->con_surround1 / WireUnits, &tmp2); GEO_EXPAND(&tmp, conSurround1, &tmp2);
(void) GeoInclude(&tmp2, &editArea); (void) GeoInclude(&tmp2, &editArea);
DBPaintValid(EditCellUse->cu_def, &tmp2, &mask, 0); DBPaintValid(EditCellUse->cu_def, &tmp2, &mask, 0);
} }
if (contact->con_surround2 != 0) if (conSurround2 != 0)
{ {
TTMaskSetOnlyType(&mask, contact->con_layer2); TTMaskSetOnlyType(&mask, contact->con_layer2);
TTMaskSetType(&allmask, contact->con_layer2); TTMaskSetType(&allmask, contact->con_layer2);
GEO_EXPAND(&tmp, contact->con_surround2 / WireUnits, &tmp2); GEO_EXPAND(&tmp, conSurround2, &tmp2);
(void) GeoInclude(&tmp2, &editArea); (void) GeoInclude(&tmp2, &editArea);
DBPaintValid(EditCellUse->cu_def, &tmp2, &mask, 0); DBPaintValid(EditCellUse->cu_def, &tmp2, &mask, 0);
} }
if (contact->con_extend1 != 0) if (conExtend1 != 0)
{ {
TTMaskSetOnlyType(&mask, contact->con_layer1); TTMaskSetOnlyType(&mask, contact->con_layer1);
TTMaskSetType(&allmask, contact->con_layer1); TTMaskSetType(&allmask, contact->con_layer1);
@ -869,19 +894,41 @@ WireAddContact(newType, newWidth)
{ {
case GEO_NORTH: case GEO_NORTH:
case GEO_SOUTH: case GEO_SOUTH:
tmp2.r_ybot -= contact->con_extend1 / WireUnits; if (updown == WIRING_CONTACT_UP)
tmp2.r_ytop += contact->con_extend1 / WireUnits; {
tmp2.r_ybot -= conExtend1;
tmp2.r_ytop += conExtend1;
tmp2.r_xbot -= conSurround1;
tmp2.r_xtop += conSurround1;
}
else {
tmp2.r_xbot -= conExtend1;
tmp2.r_xtop += conExtend1;
tmp2.r_ybot -= conSurround1;
tmp2.r_ytop += conSurround1;
}
break; break;
case GEO_EAST: case GEO_EAST:
case GEO_WEST: case GEO_WEST:
tmp2.r_xbot -= contact->con_extend1 / WireUnits; if (updown == WIRING_CONTACT_UP)
tmp2.r_xtop += contact->con_extend1 / WireUnits; {
tmp2.r_xbot -= conExtend1;
tmp2.r_xtop += conExtend1;
tmp2.r_ybot -= conSurround1;
tmp2.r_ytop += conSurround1;
}
else {
tmp2.r_ybot -= conExtend1;
tmp2.r_ytop += conExtend1;
tmp2.r_xbot -= conSurround1;
tmp2.r_xtop += conSurround1;
}
break; break;
} }
(void) GeoInclude(&tmp2, &editArea); (void) GeoInclude(&tmp2, &editArea);
DBPaintValid(EditCellUse->cu_def, &tmp2, &mask, 0); DBPaintValid(EditCellUse->cu_def, &tmp2, &mask, 0);
} }
if (contact->con_extend2 != 0) if (conExtend2 != 0)
{ {
TTMaskSetOnlyType(&mask, contact->con_layer2); TTMaskSetOnlyType(&mask, contact->con_layer2);
TTMaskSetType(&allmask, contact->con_layer2); TTMaskSetType(&allmask, contact->con_layer2);
@ -890,13 +937,35 @@ WireAddContact(newType, newWidth)
{ {
case GEO_NORTH: case GEO_NORTH:
case GEO_SOUTH: case GEO_SOUTH:
tmp2.r_xbot -= contact->con_extend2 / WireUnits; if (updown == WIRING_CONTACT_UP)
tmp2.r_xtop += contact->con_extend2 / WireUnits; {
tmp2.r_xbot -= conExtend2;
tmp2.r_xtop += conExtend2;
tmp2.r_ybot -= conSurround2;
tmp2.r_ytop += conSurround2;
}
else {
tmp2.r_ybot -= conExtend2;
tmp2.r_ytop += conExtend2;
tmp2.r_xbot -= conSurround2;
tmp2.r_xtop += conSurround2;
}
break; break;
case GEO_EAST: case GEO_EAST:
case GEO_WEST: case GEO_WEST:
tmp2.r_ybot -= contact->con_extend2 / WireUnits; if (updown == WIRING_CONTACT_UP)
tmp2.r_ytop += contact->con_extend2 / WireUnits; {
tmp2.r_ybot -= conExtend2;
tmp2.r_ytop += conExtend2;
tmp2.r_xbot -= conSurround2;
tmp2.r_xtop += conSurround2;
}
else {
tmp2.r_xbot -= conExtend2;
tmp2.r_xtop += conExtend2;
tmp2.r_ybot -= conSurround2;
tmp2.r_ytop += conSurround2;
}
break; break;
} }
(void) GeoInclude(&tmp2, &editArea); (void) GeoInclude(&tmp2, &editArea);
@ -921,15 +990,15 @@ WireAddContact(newType, newWidth)
scx.scx_area = tmp; scx.scx_area = tmp;
TTMaskSetOnlyType(&mask, contact->con_type); TTMaskSetOnlyType(&mask, contact->con_type);
SelectArea(&scx, &mask, 0); SelectArea(&scx, &mask, 0);
if (contact->con_surround1 != 0) if (conSurround1 != 0)
{ {
GEO_EXPAND(&tmp, contact->con_surround1 / WireUnits, &scx.scx_area); GEO_EXPAND(&tmp, conSurround1, &scx.scx_area);
TTMaskSetOnlyType(&mask, contact->con_layer1); TTMaskSetOnlyType(&mask, contact->con_layer1);
SelectArea(&scx, &mask, 0); SelectArea(&scx, &mask, 0);
} }
if (contact->con_surround2 != 0) if (conSurround2 != 0)
{ {
GEO_EXPAND(&tmp, contact->con_surround2 / WireUnits, &scx.scx_area); GEO_EXPAND(&tmp, conSurround2, &scx.scx_area);
TTMaskSetOnlyType(&mask, contact->con_layer2); TTMaskSetOnlyType(&mask, contact->con_layer2);
SelectArea(&scx, &mask, 0); SelectArea(&scx, &mask, 0);
} }