<> <> <<>> DIRECTORY Convert, Rope, SC, SCInstUtil, SCInitialPlace, SCPlaceUtil, SCPrivate, SCRowUtil, TerminalIO; SCInitialPlaceImpl: CEDAR PROGRAM IMPORTS Convert, Rope, SC, SCInstUtil, SCPlaceUtil, SCRowUtil, TerminalIO EXPORTS SCInitialPlace SHARES SC = { <> PosInitBp: PROCEDURE[handle: SC.Handle, side: SC.Side] = { PreAssign: SCRowUtil.EachInstProc = { Check: SCRowUtil.EachInstProc = { otherPos: SCPrivate.ZMaxPosSr _ instance.fnlPos; IF curPos = otherPos THEN { TerminalIO.WriteRope[Rope.Cat[" Two instances have same position: ", firstInst.name, " and ", instance.name]]; TerminalIO.WriteRope[Rope.Cat["\n pos = ", Convert.RopeFromInt[firstPos], "\n"]]}}; firstInst: SCPrivate.Instance _ instance; firstPos: SCPrivate.ZMaxPosSr _ pos; curPos: SCPrivate.ZMaxPosSr _ firstInst.fnlPos; IF curPos > 0 THEN [] _ SCRowUtil.EnumerateInstsOnSide[handle, side, firstPos +1, bpRow.nBpsOnSide, Check]}; Sort: SCRowUtil.EachInstProc = { InnerSort: SCRowUtil.EachInstProc = { IF instance.fnlPos < firstInst.fnlPos THEN { bpRow.bpsOnSide[firstPos] _ instance; bpRow.bpsOnSide[pos] _ firstInst}}; firstInst: SCPrivate.Instance _ instance; firstPos: SCPrivate.ZMaxPosSr _ pos; [] _ SCRowUtil.EnumerateInstsOnSide[handle, side, firstPos +1, bpRow.nBpsOnSide, InnerSort]}; FixUp: SCRowUtil.EachInstProc = { instance _ bpRow.bpsOnSide[pos]; instance.curPos _ pos}; layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; bpRow: SCPrivate.BpRow _ layoutData.bpRows[side]; <> IF bpRow.fnlBpFxd OR bpRow.initBpFxd THEN { <> [] _ SCRowUtil.EnumerateAllInstsOnSide[handle, side, PreAssign]; <<>> <> [] _ SCRowUtil.EnumerateAllInstsOnSide[handle, side, Sort]; <> [] _ SCRowUtil.EnumerateAllInstsOnSide[handle, side, FixUp]} ELSE {-- positions on side were not specified assign positions <<>> <> [] _ SCRowUtil.EnumerateAllInstsOnSide[handle, side, FixUp]}; SCInstUtil.BpOffsets[handle, side, 0, 0]}; <> PosInitLg: PROCEDURE[handle: SC.Handle, row: SCPrivate.MaxRowSr] = { PreAssign: SCRowUtil.EachInstProc = { Check: SCRowUtil.EachInstProc = { otherPos: SCPrivate.ZMaxPosSr _ instance.fnlPos; IF curPos = otherPos THEN { TerminalIO.WriteRope[Rope.Cat[" Two instances have same position: ", firstInst.name, " and ", instance.name]]; TerminalIO.WriteRope[Rope.Cat["\n pos = ", Convert.RopeFromInt[curPos], "\n"]]}}; firstInst: SCPrivate.Instance _ instance; firstPos: SCPrivate.ZMaxPosSr _ pos; curPos: SCPrivate.ZMaxPosSr _ firstInst.fnlPos; IF curPos > 0 THEN [] _ SCRowUtil.EnumerateInstsOnRow[handle, row, firstPos +1, lgRow.nLgsOnRow, Check]}; Sort: SCRowUtil.EachInstProc = { InnerSort: SCRowUtil.EachInstProc = { IF instance.fnlPos < firstInst.fnlPos THEN { lgRow.lgsOnRow[firstPos] _ instance; lgRow.lgsOnRow[pos] _ firstInst}}; firstInst: SCPrivate.Instance _ instance; firstPos: SCPrivate.ZMaxPosSr _ pos; [] _ SCRowUtil.EnumerateInstsOnRow[handle, row, firstPos +1, lgRow.nLgsOnRow, InnerSort]}; FixUp: SCRowUtil.EachInstProc = { instance _ lgRow.lgsOnRow[pos]; instance.curPos _ pos}; layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; lgRow: SCPrivate.LgRow _ layoutData.lgRows.rows[row]; <> IF lgRow.fnlLgFxd OR lgRow.initLgFxd THEN { <> [] _ SCRowUtil.EnumerateAllInstsOnRow[handle, row, PreAssign]; <> [] _ SCRowUtil.EnumerateAllInstsOnRow[handle, row, Sort]; <<>> <> [] _ SCRowUtil.EnumerateAllInstsOnRow[handle, row, FixUp]} ELSE { -- positions on row were not specified assign positions <<>> <> [] _ SCRowUtil.EnumerateAllInstsOnRow[handle, row, FixUp]}; SCInstUtil.LgOffsets[handle, row, 0, 0]}; PosInit: PUBLIC PROCEDURE [handle: SC.Handle] = { <> DoRow: SCRowUtil.EachRowProc = { PosInitLg[handle, row]}; [] _ SCRowUtil.EnumerateRows[handle, DoRow]; <> <> PosInitBp[handle, bottom]; PosInitBp[handle, top]}; RowInit: PUBLIC PROCEDURE [handle: SC.Handle] = { NextUnplaced: PROCEDURE [handle: SC.Handle] RETURNS [inst: SCPrivate.Instance _ NIL] = { EachInstance: SCInstUtil.EachInstanceProc = { SELECT instance.whichClass FROM logic => IF instance.curRow = 0 THEN inst _ instance; io => IF instance.curSide = none THEN inst _ instance; ENDCASE; quit _ inst = instance}; [] _ SCInstUtil.EnumerateAllInstances[handle, EachInstance]}; RowPlacInit: PROCEDURE [handle: SC.Handle, instance: SCPrivate.Instance] = { PutRow: SCRowUtil.EachRowProc = { IF lgRow.size.p <= minRowLength THEN IF ~lgRow.fnlLgFxd THEN {minRow _ row; minRowLength _ lgRow.size.p; useRow _ row}}; minRow, useRow: SCPrivate.ZMaxRowSr _ 0; minRowLength: SC.Number _ LAST[INT]; [] _ SCRowUtil.EnumerateRows[handle, PutRow]; IF useRow = 0 THEN {SC.Signal[callingError, Rope.Cat["no valid row to place instance: ", instance.name, "\n"]]; useRow _ 1}; SCPlaceUtil.PutLgRow[handle, instance, useRow]}; SidePlacInit: PROCEDURE [handle: SC.Handle, instance: SCPrivate.Instance] = { PutSide: SCRowUtil.EachSideProc = { IF bpRow.nBpsOnSide <= minSideLength THEN IF ~bpRow.fnlBpFxd AND bpRow.nBpsOnSide < bpRow.maxBpsOnSide THEN {minSide _ side; minSideLength _ bpRow.nBpsOnSide; useSide _ side}}; minSide, useSide: SC.SideOrNone _ none; minSideLength: SC.Number _ LAST[INT]; [] _ SCRowUtil.EnumerateSides[handle, PutSide]; IF useSide = none THEN {SC.Signal[callingError, Rope.Cat["no valid side to place instance: ", instance.name, "\n"]]; useSide _ left}; SCPlaceUtil.PutBpSide[handle, instance, useSide]}; <> <> FOR instance: SCPrivate.Instance _ NextUnplaced[handle], NextUnplaced[handle] WHILE instance # NIL DO IF instance.whichClass = logic THEN RowPlacInit[handle, instance] ELSE IF instance.whichClass = io THEN SidePlacInit[handle, instance]; ENDLOOP; <> PosInitBp[handle, left]; PosInitBp[handle, right]}; }.