diff --git a/VERSION b/VERSION index 70e23b87..6635c799 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.2.202 +8.2.203 diff --git a/lef/lefWrite.c b/lef/lefWrite.c index 93fe30de..5c1074e4 100644 --- a/lef/lefWrite.c +++ b/lef/lefWrite.c @@ -1103,10 +1103,14 @@ lefWriteMacro(def, f, scale, hide) for (thislll = lll; thislll; thislll = thislll->lll_next) { - int lspacex, lspacey, lwidth; + int lspacex, lspacey, lwidth, mspace; lab = thislll->lll_label; + mspace = DRCGetDefaultWideLayerSpacing(lab->lab_type, 1E6); + if (mspace == 0) + mspace = DRCGetDefaultLayerSpacing(lab->lab_type, lab->lab_type); + /* Look for wide spacing rules. If there are no wide spacing */ /* rules, then fall back on the default spacing rule. */ lwidth = thislll->lll_area.r_xtop - thislll->lll_area.r_xbot; @@ -1118,12 +1122,29 @@ lefWriteMacro(def, f, scale, hide) if (lspacey == 0) lspacey = DRCGetDefaultLayerSpacing(lab->lab_type, lab->lab_type); - thislll->lll_area.r_xbot -= lspacex; - thislll->lll_area.r_ybot -= lspacey; - thislll->lll_area.r_xtop += lspacex; - thislll->lll_area.r_ytop += lspacey; - DBErase(lc.lefYank, &thislll->lll_area, lab->lab_type); + /* Is the label touching the boundary? If so, then use the */ + /* maximum space from the inside edge. */ + if (thislll->lll_area.r_xtop >= boundary.r_xtop) + thislll->lll_area.r_xbot -= mspace; + else + thislll->lll_area.r_xbot -= lspacex; + if (thislll->lll_area.r_ytop >= boundary.r_ytop) + thislll->lll_area.r_ybot -= mspace; + else + thislll->lll_area.r_ybot -= lspacey; + + if (thislll->lll_area.r_xbot <= boundary.r_xbot) + thislll->lll_area.r_xtop += mspace; + else + thislll->lll_area.r_xtop += lspacex; + + if (thislll->lll_area.r_ybot <= boundary.r_ybot) + thislll->lll_area.r_ytop += mspace; + else + thislll->lll_area.r_ytop += lspacey; + + DBErase(lc.lefYank, &thislll->lll_area, lab->lab_type); freeMagic(thislll); } }