DIRECTORY Rope, RTSets, SC, SCInstUtil, SCPrivate, SCRowUtil; SCRowUtilImpl: CEDAR PROGRAM IMPORTS RTSets, SC, SCInstUtil, SCRowUtil EXPORTS SCRowUtil SHARES SC = BEGIN sideName: PUBLIC ARRAY SC.SideOrNone OF Rope.ROPE _ ["bottom", "top", "left", "right", "none"]; FindMaxRow: PUBLIC PROCEDURE [handle: SC.Handle] RETURNS [ maxRowWidth : SC.Number _ 0, numMaxRows : SCPrivate.ZMaxRowSr _ 0] = { RowProc: SCRowUtil.EachRowProc = { IF lgRow.size.p > maxRowWidth THEN {maxRowWidth _ lgRow.size.p; numMaxRows _ 1} ELSE IF lgRow.size.p = maxRowWidth THEN numMaxRows _ numMaxRows + 1}; [] _ SCRowUtil.EnumerateRows[handle, RowProc]}; AuditRowLengths: PUBLIC PROCEDURE [handle: SC.Handle] = { RowProc: SCRowUtil.EachRowProc = { InstProc: SCRowUtil.EachInstProc = { SELECT instance.whichClass FROM ft => NULL; logic => { instance.offset _ offset; offset _ offset + SCInstUtil.InstWidth[instance]}; ENDCASE => SC.Error[programmingError, "Invalid Instance on Row"]}; offset: INT _ lgRow.nFtsOnRow*ftObject.size.p; [] _ SCRowUtil.EnumerateAllInstsOnRow[handle, row, InstProc]; IF offset # lgRow.size.p THEN SC.Error[programmingError, "Invalid row length"]}; parms: SCPrivate.Parms _ NARROW[handle.parms]; ftObject: SCPrivate.Object _ parms.ftObject; [] _ SCRowUtil.EnumerateRows[handle, RowProc]}; ComputeRowHeight: PUBLIC PROCEDURE[handle: SC.Handle, row: SCPrivate.MaxRowSr] = { RowProc: SCRowUtil.EachInstProc = { maxHeight _ MAX[maxHeight, SCInstUtil.InstHeight[instance]]}; layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; lgRow: SCPrivate.LgRow _ layoutData.lgRows.rows[row]; maxHeight: SC.Number _ 0; [] _ SCRowUtil.EnumerateAllInstsOnRow[handle, row, RowProc]; lgRow.size.q _ maxHeight; lgRow.dimInvalid _ FALSE}; ComputeSideHeight: PUBLIC PROCEDURE[handle: SC.Handle, side: SC.Side] = { SideProc: SCRowUtil.EachInstProc = { maxHeight _ MAX[maxHeight, SCInstUtil.BpHeight[instance]]}; layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; bpRow: SCPrivate.BpRow _ layoutData.bpRows[side]; maxHeight: SC.Number _ 0; [] _ SCRowUtil.EnumerateAllInstsOnSide[handle, side, SideProc]; bpRow.size.q _ maxHeight; bpRow.dimInvalid _ FALSE}; RowsForInsts: PUBLIC PROCEDURE[insts: SCPrivate.InstanceList] RETURNS [ onSide: SCPrivate.SideSet _ RTSets.RTSmSetEmpty, onRow: SCPrivate.RowSet _ RTSets.RTMdSetEmpty] = { FOR instList: SCPrivate.InstanceList _ insts, instList.rest WHILE instList # NIL DO inst: SCPrivate.Instance _ instList.first; SELECT inst.whichClass FROM ft, logic => {IF inst.curRow > 0 THEN onRow _ RTSets.RTMdSetUnion[onRow, RTSets.RTMdSetGenerateElement[(inst.curRow)-1]]}; io => {IF inst.curSide # none THEN onSide _ RTSets.RTSmSetUnion[onSide, RTSets.RTSmSetGenerateElement[LOOPHOLE[SC.Side[inst.curSide], INTEGER]]]}; ENDCASE; ENDLOOP}; EnumerateRows: PUBLIC PROC [handle: SC.Handle, eachRow: SCRowUtil.EachRowProc] RETURNS [quit: BOOL _ FALSE] = { layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; lgRows: SCPrivate.LgRows _ layoutData.lgRows; FOR row: SCPrivate.MaxRowSr IN [1 .. lgRows.count] WHILE ~quit DO quit _ eachRow[row, lgRows.rows[row]]; ENDLOOP}; EnumerateSides: PUBLIC PROC [handle: SC.Handle, eachSide: SCRowUtil.EachSideProc] RETURNS [quit: BOOL _ FALSE] = { layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; bpRows: SCPrivate.BpRows _ layoutData.bpRows; FOR side: SC.Side IN SC.Side WHILE ~quit DO quit _ eachSide[side, bpRows[side]]; ENDLOOP}; EnumerateAllInstsOnRow: PUBLIC PROC [handle: SC.Handle, row: SCPrivate.MaxRowSr, eachInstance: SCRowUtil.EachInstProc] RETURNS [quit: BOOL _ FALSE] = { layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; lgRow: SCPrivate.LgRow _ layoutData.lgRows.rows[row]; quit _ SCRowUtil.EnumerateInstsOnRow[handle, row, 1, lgRow.nLgsOnRow, eachInstance]}; EnumerateInstsOnRow: PUBLIC PROC [handle: SC.Handle, row: SCPrivate.MaxRowSr, startPos, endPos: SCPrivate.ZMaxPosSr, eachInstance: SCRowUtil.EachInstProc] RETURNS [quit: BOOL _ FALSE] = { layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; lgRow: SCPrivate.LgRow _ layoutData.lgRows.rows[row]; FOR inst: NAT IN [startPos .. endPos] WHILE ~quit DO quit _ eachInstance[inst, lgRow.lgsOnRow[inst]]; ENDLOOP}; EnumerateInstsOnRowDecreasing: PUBLIC PROC [handle: SC.Handle, row: SCPrivate.MaxRowSr, startPos, endPos: SCPrivate.ZMaxPosSr, eachInstance: SCRowUtil.EachInstProc] RETURNS [quit: BOOL _ FALSE] = { layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; lgRow: SCPrivate.LgRow _ layoutData.lgRows.rows[row]; FOR inst: NAT DECREASING IN [startPos .. endPos] WHILE ~quit DO quit _ eachInstance[inst, lgRow.lgsOnRow[inst]]; ENDLOOP}; EnumerateAllInstsOnSide: PUBLIC PROC [handle: SC.Handle, side: SC.Side, eachInstance: SCRowUtil.EachInstProc] RETURNS [quit: BOOL _ FALSE] = { layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; bpRow: SCPrivate.BpRow _ layoutData.bpRows[side]; quit _ SCRowUtil.EnumerateInstsOnSide[handle, side, 1, bpRow.nBpsOnSide, eachInstance]}; EnumerateInstsOnSide: PUBLIC PROC [handle: SC.Handle, side: SC.Side, startPos, endPos: SCPrivate.ZMaxPosSr, eachInstance: SCRowUtil.EachInstProc] RETURNS [quit: BOOL _ FALSE] = { layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; bpRow: SCPrivate.BpRow _ layoutData.bpRows[side]; FOR inst: NAT IN [startPos .. endPos] WHILE ~quit DO quit _ eachInstance[inst, bpRow.bpsOnSide[inst]]; ENDLOOP}; EnumerateInstsOnSideDecreasing: PUBLIC PROC [handle: SC.Handle, side: SC.Side, startPos, endPos: SCPrivate.ZMaxPosSr, eachInstance: SCRowUtil.EachInstProc] RETURNS [quit: BOOL _ FALSE] = { layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; bpRow: SCPrivate.BpRow _ layoutData.bpRows[side]; FOR inst: NAT DECREASING IN [startPos .. endPos] WHILE ~quit DO quit _ eachInstance[inst, bpRow.bpsOnSide[inst]]; ENDLOOP}; END. file ///StdCell/SCRowUtilImpl.mesa row utility routines find the max row length audit the row lengths compute height of row - height is max of component heights on row compute height of side - height is max of component heights on side find rows that these comps are on Κj˜Jšœ"™"J˜Jšœ™J™šΟk ˜ J˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ J˜—šœœ˜Jšœœ˜*Jšœ ˜Jšœœ˜ J˜Jš˜Jš œ œœœ œœ.˜_J˜Jšœ™š Οn œœ œ œ œ˜:Jšœœ7˜HJ˜šœ"˜"šœ˜"Jšœ,˜,—šœœ˜'Jšœ˜J˜——Jšœ/˜/—J˜Jšœ™šžœœ œ œ ˜9J˜šœ"˜"šœ$˜$šœ˜Jšœœ˜ šœ ˜ Jšœ˜Jšœ2˜2—šœ˜ Jšœ5˜7——J˜—Jšœœ#˜.Jšœ=˜=Jšœœœ0˜P—Icode˜Kšœœ˜.Jšœ,˜,Jšœ/˜/—K˜JšœB™Bš žœœ œ œœ ˜RJ˜šœ#˜#Jšœ œ.˜=J˜—Jšœ#œ˜=Jšœ5˜5Jšœ œ ˜Jšœ<˜