Debugged an issue where a label on the default substrate node may
not be seen during hierarchical processing, causing the substrate to get split into several names that may conflict in the netlist. At issue is the fact that ExtLabelRegions() will not attach a default substrate label to a default substrate region. This may need further untangling, as extFindNodes() will set the default substrate node and is sometimes followed by ExtLabelRegions(), which will label it. Any place ExtFindRegions() is called, this could be an issue.
This commit is contained in:
parent
b1b986cbe4
commit
47df9da0d3
|
|
@ -169,6 +169,7 @@ extHardProc(scx, arg)
|
||||||
CellDef *def = scx->scx_use->cu_def;
|
CellDef *def = scx->scx_use->cu_def;
|
||||||
TransRegion *reg;
|
TransRegion *reg;
|
||||||
TransRegion *labRegList;
|
TransRegion *labRegList;
|
||||||
|
LabelList *subList;
|
||||||
char *savenext;
|
char *savenext;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
|
@ -221,15 +222,32 @@ extHardProc(scx, arg)
|
||||||
* will have uninitialized region pointers, and so will not have labels
|
* will have uninitialized region pointers, and so will not have labels
|
||||||
* assigned to them.
|
* assigned to them.
|
||||||
*/
|
*/
|
||||||
// ExtLabelRegions(def, ExtCurStyle->exts_nodeConn, &labRegList,
|
subList = ExtLabelRegions(def, ExtCurStyle->exts_nodeConn, NULL, NULL);
|
||||||
// &scx->scx_area);
|
|
||||||
ExtLabelRegions(def, ExtCurStyle->exts_nodeConn, NULL, NULL);
|
|
||||||
|
|
||||||
/* Now try to find a region with a node label */
|
/* Now try to find a region with a node label */
|
||||||
for (reg = labRegList; reg; reg = reg->treg_next)
|
for (reg = labRegList; reg; reg = reg->treg_next)
|
||||||
if (reg->treg_labels && extHardSetLabel(scx, reg, arg))
|
if (reg->treg_labels && extHardSetLabel(scx, reg, arg))
|
||||||
goto success;
|
goto success;
|
||||||
|
|
||||||
|
/* If a label was found attached to the default substrate, then
|
||||||
|
* check if any region has a substrate type. If that region does
|
||||||
|
* not reach the substrate plane (e.g., is not connected to an
|
||||||
|
* isolated substrate region), then it connects to the default
|
||||||
|
* substrate and takes the substrate label.
|
||||||
|
*/
|
||||||
|
if (ExtCurStyle->exts_globSubstrateDefaultType != -1)
|
||||||
|
for (reg = labRegList; reg; reg = reg->treg_next)
|
||||||
|
if (TTMaskHasType(&ExtCurStyle->exts_globSubstrateTypes, reg->treg_type))
|
||||||
|
if (reg->treg_pnum != ExtCurStyle->exts_globSubstratePlane)
|
||||||
|
{
|
||||||
|
reg->treg_labels = subList;
|
||||||
|
if (extHardSetLabel(scx, reg, arg))
|
||||||
|
goto success;
|
||||||
|
reg->treg_labels = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subList != NULL) freeMagic(subList);
|
||||||
|
|
||||||
/* No luck; it's as though there was no geometry at all */
|
/* No luck; it's as though there was no geometry at all */
|
||||||
extHardFreeAll(def, labRegList);
|
extHardFreeAll(def, labRegList);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,9 @@ extRegionAreaFunc(tile, arg)
|
||||||
* on the boundary between two tiles of different types.
|
* on the boundary between two tiles of different types.
|
||||||
*
|
*
|
||||||
* Results:
|
* Results:
|
||||||
* None.
|
* When called with a NULL nodeList, any default substrate
|
||||||
|
* label found will be returned (in a pointer to a LabelList
|
||||||
|
* structure). This feature is used by extHardProc().
|
||||||
*
|
*
|
||||||
* Side effects:
|
* Side effects:
|
||||||
* Each LabRegion has labels added to its label list.
|
* Each LabRegion has labels added to its label list.
|
||||||
|
|
@ -193,7 +195,7 @@ extRegionAreaFunc(tile, arg)
|
||||||
* ----------------------------------------------------------------------------
|
* ----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
LabelList *
|
||||||
ExtLabelRegions(def, connTo, nodeList, clipArea)
|
ExtLabelRegions(def, connTo, nodeList, clipArea)
|
||||||
CellDef *def; /* Cell definition being labelled */
|
CellDef *def; /* Cell definition being labelled */
|
||||||
TileTypeBitMask *connTo; /* Connectivity table (see above) */
|
TileTypeBitMask *connTo; /* Connectivity table (see above) */
|
||||||
|
|
@ -209,6 +211,7 @@ ExtLabelRegions(def, connTo, nodeList, clipArea)
|
||||||
Point p;
|
Point p;
|
||||||
bool found;
|
bool found;
|
||||||
TileType extSubType = 0;
|
TileType extSubType = 0;
|
||||||
|
LabelList *retList = NULL;
|
||||||
|
|
||||||
for (lab = def->cd_labels; lab; lab = lab->lab_next)
|
for (lab = def->cd_labels; lab; lab = lab->lab_next)
|
||||||
{
|
{
|
||||||
|
|
@ -253,7 +256,7 @@ ExtLabelRegions(def, connTo, nodeList, clipArea)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((found == FALSE) && (nodeList != NULL))
|
if (found == FALSE)
|
||||||
{
|
{
|
||||||
/* Handle unconnected node label. */
|
/* Handle unconnected node label. */
|
||||||
|
|
||||||
|
|
@ -266,7 +269,7 @@ ExtLabelRegions(def, connTo, nodeList, clipArea)
|
||||||
TTMaskHasType(&ExtCurStyle->exts_globSubstrateTypes,
|
TTMaskHasType(&ExtCurStyle->exts_globSubstrateTypes,
|
||||||
lab->lab_type))
|
lab->lab_type))
|
||||||
{
|
{
|
||||||
if (temp_subsnode != NULL)
|
if ((temp_subsnode != NULL) || (nodeList == NULL))
|
||||||
{
|
{
|
||||||
ll = (LabelList *)mallocMagic(sizeof(LabelList));
|
ll = (LabelList *)mallocMagic(sizeof(LabelList));
|
||||||
ll->ll_label = lab;
|
ll->ll_label = lab;
|
||||||
|
|
@ -274,8 +277,18 @@ ExtLabelRegions(def, connTo, nodeList, clipArea)
|
||||||
ll->ll_attr = LL_PORTATTR;
|
ll->ll_attr = LL_PORTATTR;
|
||||||
else
|
else
|
||||||
ll->ll_attr = LL_NOATTR;
|
ll->ll_attr = LL_NOATTR;
|
||||||
ll->ll_next = glob_subsnode->nreg_labels;
|
|
||||||
temp_subsnode->nreg_labels = ll;
|
if (nodeList != NULL)
|
||||||
|
{
|
||||||
|
ll->ll_next = temp_subsnode->nreg_labels;
|
||||||
|
temp_subsnode->nreg_labels = ll;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ll->ll_next = (LabelList *)NULL;
|
||||||
|
if (retList != NULL) freeMagic(retList);
|
||||||
|
retList = ll;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -283,7 +296,8 @@ ExtLabelRegions(def, connTo, nodeList, clipArea)
|
||||||
* TT_SPACE, then create a new node region for it. The
|
* TT_SPACE, then create a new node region for it. The
|
||||||
* label must be within the clip area.
|
* label must be within the clip area.
|
||||||
*/
|
*/
|
||||||
else if ((GEO_SURROUND(&lab->lab_rect, clipArea) ||
|
else if ((nodeList != NULL) &&
|
||||||
|
(GEO_SURROUND(&lab->lab_rect, clipArea) ||
|
||||||
GEO_TOUCH(&lab->lab_rect, clipArea))
|
GEO_TOUCH(&lab->lab_rect, clipArea))
|
||||||
&& (lab->lab_type != TT_SPACE))
|
&& (lab->lab_type != TT_SPACE))
|
||||||
{
|
{
|
||||||
|
|
@ -317,6 +331,7 @@ ExtLabelRegions(def, connTo, nodeList, clipArea)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return retList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -1016,6 +1016,7 @@ extern ClientData extUnInit;
|
||||||
/* ------------------------- Region finding --------------------------- */
|
/* ------------------------- Region finding --------------------------- */
|
||||||
|
|
||||||
extern Region *ExtFindRegions();
|
extern Region *ExtFindRegions();
|
||||||
|
extern LabelList *ExtLabelRegions();
|
||||||
|
|
||||||
/* Filter functions for ExtFindRegions() */
|
/* Filter functions for ExtFindRegions() */
|
||||||
extern Region *extTransFirst(); extern int extTransEach();
|
extern Region *extTransFirst(); extern int extTransEach();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue