<> <> <> DIRECTORY IO, RTBasic, SC, SCChanUtil, SCInstUtil, SCNetUtil, SCPrivate, SCRowUtil, SCPlaceUtil, Rope, RTSets, SCSmash, SCUtil, SCWidthUtil, TerminalIO; SCSmashImpl: CEDAR PROGRAM IMPORTS IO, RTBasic, SC, SCChanUtil, SCInstUtil, SCNetUtil, SCWidthUtil, SCPlaceUtil, SCRowUtil, SCSmash, SCUtil, RTSets, TerminalIO EXPORTS SCSmash SHARES SC = { debug: BOOLEAN _ FALSE; GetGoodFtPos: PROC [net: SCPrivate.Net, row: SCPrivate.MaxRowSr, nLgsOnRow: SCPrivate.ZMaxPosSr] RETURNS [midPos: SCPrivate.MaxPosSr] = { minPos: SC.Number _ LAST[SC.Number]; maxPos: SC.Number _ FIRST[SC.Number]; EachPin: SCNetUtil.EachPinProc = { instance: SCPrivate.Instance _ netPin.instance; SELECT instance.whichClass FROM ft, logic => { SELECT instance.curRow FROM row, row+1, row-1 => { minPos _ MIN[minPos, instance.curPos]; maxPos _ MAX[maxPos, instance.curPos]}; ENDCASE; }; ENDCASE }; [] _ SCNetUtil.EnumeratePinsOnNet[net, EachPin]; IF minPos = LAST[SC.Number] AND maxPos = FIRST[SC.Number] THEN midPos _ (1+ nLgsOnRow)/2 -- no instances in channels near row ELSE { minPos _ SELECT minPos FROM < 1 => 1, > nLgsOnRow => nLgsOnRow+1, ENDCASE => minPos; maxPos _ SELECT maxPos FROM < 1 => 1, > nLgsOnRow => nLgsOnRow+1, ENDCASE => maxPos; midPos _ (minPos + maxPos)/2; }; }; AddFt: PROCEDURE[handle: SC.Handle, lgRow: SCPrivate.LgRow, net: SCPrivate.Net, leftOnChan, rightOnChan: SCPrivate.ChanSet] RETURNS [ftInst: SCPrivate.Instance] = { <> <> <> <<>> <> <> <> <