diff --git a/VERSION b/VERSION index af4f7017..6c99b1c5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.3.273 +8.3.274 diff --git a/extract/ExtHard.c b/extract/ExtHard.c index 32b12c96..9d23237d 100644 --- a/extract/ExtHard.c +++ b/extract/ExtHard.c @@ -169,6 +169,7 @@ extHardProc(scx, arg) CellDef *def = scx->scx_use->cu_def; TransRegion *reg; TransRegion *labRegList; + LabelList *subList; char *savenext; int ret = 0; @@ -221,15 +222,32 @@ extHardProc(scx, arg) * will have uninitialized region pointers, and so will not have labels * assigned to them. */ - // ExtLabelRegions(def, ExtCurStyle->exts_nodeConn, &labRegList, - // &scx->scx_area); - ExtLabelRegions(def, ExtCurStyle->exts_nodeConn, NULL, NULL); + subList = ExtLabelRegions(def, ExtCurStyle->exts_nodeConn, NULL, NULL); /* Now try to find a region with a node label */ for (reg = labRegList; reg; reg = reg->treg_next) if (reg->treg_labels && extHardSetLabel(scx, reg, arg)) 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 */ extHardFreeAll(def, labRegList); } diff --git a/extract/ExtRegion.c b/extract/ExtRegion.c index 87c43384..37e71d37 100644 --- a/extract/ExtRegion.c +++ b/extract/ExtRegion.c @@ -185,7 +185,9 @@ extRegionAreaFunc(tile, arg) * on the boundary between two tiles of different types. * * 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: * Each LabRegion has labels added to its label list. @@ -193,7 +195,7 @@ extRegionAreaFunc(tile, arg) * ---------------------------------------------------------------------------- */ -void +LabelList * ExtLabelRegions(def, connTo, nodeList, clipArea) CellDef *def; /* Cell definition being labelled */ TileTypeBitMask *connTo; /* Connectivity table (see above) */ @@ -209,6 +211,7 @@ ExtLabelRegions(def, connTo, nodeList, clipArea) Point p; bool found; TileType extSubType = 0; + LabelList *retList = NULL; for (lab = def->cd_labels; lab; lab = lab->lab_next) { @@ -253,7 +256,7 @@ ExtLabelRegions(def, connTo, nodeList, clipArea) break; } } - if ((found == FALSE) && (nodeList != NULL)) + if (found == FALSE) { /* Handle unconnected node label. */ @@ -266,7 +269,7 @@ ExtLabelRegions(def, connTo, nodeList, clipArea) TTMaskHasType(&ExtCurStyle->exts_globSubstrateTypes, lab->lab_type)) { - if (temp_subsnode != NULL) + if ((temp_subsnode != NULL) || (nodeList == NULL)) { ll = (LabelList *)mallocMagic(sizeof(LabelList)); ll->ll_label = lab; @@ -274,8 +277,18 @@ ExtLabelRegions(def, connTo, nodeList, clipArea) ll->ll_attr = LL_PORTATTR; else 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 * 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)) && (lab->lab_type != TT_SPACE)) { @@ -317,6 +331,7 @@ ExtLabelRegions(def, connTo, nodeList, clipArea) } } } + return retList; } /* diff --git a/extract/extractInt.h b/extract/extractInt.h index ab27be87..ca3e80b5 100644 --- a/extract/extractInt.h +++ b/extract/extractInt.h @@ -1016,6 +1016,7 @@ extern ClientData extUnInit; /* ------------------------- Region finding --------------------------- */ extern Region *ExtFindRegions(); +extern LabelList *ExtLabelRegions(); /* Filter functions for ExtFindRegions() */ extern Region *extTransFirst(); extern int extTransEach();