<> <<-- Copyright (C) 1984, 1985 by Xerox Corporation. All rights reserved.>> <> <> <> DIRECTORY Rope, Route, SC, SCPrivate, SCRowUtil, TerminalIO; SCSetUpLayoutImpl: CEDAR PROGRAM IMPORTS SCRowUtil EXPORTS SCPrivate SHARES SC = BEGIN SetUpLayout: PUBLIC PROCEDURE[handle: SC.Handle] RETURNS [canContinue: BOOL _ TRUE] = BEGIN GetRopeProp: PROCEDURE[key: Rope.ROPE, default: Rope.ROPE _ NIL] RETURNS [val: Rope.ROPE] = { RETURN[default]}; GetRopeListProp: PROCEDURE[key: Rope.ROPE, default: LIST OF Rope.ROPE _ NIL] RETURNS [val: LIST OF Rope.ROPE] = { RETURN[default]}; GetIntProp: PROCEDURE[key: Rope.ROPE, default: INT _ 0] RETURNS [val: INT] = { RETURN[default]}; GetBoolProp: PROCEDURE[key: Rope.ROPE, default: BOOL _ FALSE] RETURNS [val: BOOL] = { RETURN[default]}; GetFomProp: PROCEDURE[key: Rope.ROPE, default: SCPrivate.FomType] RETURNS [val: SCPrivate.FomType] = { RETURN[default]}; <> ProcClocks: PROCEDURE [descName: Rope.ROPE, lRSide: SCPrivate.LRSide] RETURNS [acSide: SCPrivate.AcBusSides] = BEGIN clockSignalNames: LIST OF Rope.ROPE _ GetRopeListProp[descName]; acSide _ NEW[SCPrivate.AcBusSidesRec]; FOR nameList: LIST OF Rope.ROPE _ clockSignalNames, nameList.rest WHILE nameList # NIL DO acSide.count _ acSide.count + 1 ENDLOOP; IF acSide.count > 0 THEN { index: NAT _ 0; acSide.sigs _ NEW[SCPrivate.AcBusSigsRec[acSide.count]]; FOR nameList: LIST OF Rope.ROPE _ clockSignalNames, nameList.rest WHILE nameList # NIL DO acSide.sigs[index].name _ nameList.first; acSide.sigs[index].onSide _ lRSide; index _ index + 1; ENDLOOP}; END; <> ProcPower: PROCEDURE [descName: Rope.ROPE, lRSide: SCPrivate.LRSide] RETURNS [powerSide: SCPrivate.PowerBus] = BEGIN powerSide _ NEW[SCPrivate.PowerBusRec]; powerSide.name _ descName; powerSide.onSide _ lRSide; END; layoutData: SCPrivate.LayoutData _ NARROW[NEW[SCPrivate.LayoutDataRec], SCPrivate.LayoutData]; layoutParms: SCPrivate.LayoutParms _ NEW[SCPrivate.LayoutParmsRec]; sideRules: Route.DesignRules _ handle.rules.sideRules; rowRules: Route.DesignRules _ handle.rules.rowRules; bottomRow: SCPrivate.BpRow _ NEW[SCPrivate.BpRowRec]; rightRow: SCPrivate.BpRow _ NEW[SCPrivate.BpRowRec]; topRow: SCPrivate.BpRow _ NEW[SCPrivate.BpRowRec]; leftRow: SCPrivate.BpRow _ NEW[SCPrivate.BpRowRec]; layoutData.bpRows _ NEW[SCPrivate.BpRowsRec]; layoutData.lgRows _ NEW[SCPrivate.LgRowsRec]; layoutData.sideChans[left] _ NEW[SCPrivate.SideChanRec]; layoutData.sideChans[right] _ NEW[SCPrivate.SideChanRec]; layoutData.rowChans _ NEW[SCPrivate.RowChansRec]; layoutData.layoutParms _ layoutParms; handle.layoutData _ layoutData; <> layoutParms.whichFom _ GetFomProp["FomType", wlFom]; <> layoutParms.useMaxRouteExits _ GetBoolProp["UseMaxRouteExits", TRUE]; layoutParms.useInteriorChanExits _ GetBoolProp["UseInteriorChanExits", TRUE]; <> layoutParms.numRows _ GetIntProp["NumRows", 0]; layoutParms.rowDirection _ handle.rules.rowRules.trunkDirection; <<-- do the power buses>> layoutData.powerBuses[left] _ ProcPower[GetRopeProp["LeftPowerName", "Vdd"], left]; layoutData.powerBuses[right] _ ProcPower[GetRopeProp["RightPowerName", "Gnd"], right]; <<>> <<-- do the ac buses>> layoutData.acBuses[left] _ ProcClocks["LeftClocks", left]; layoutData.acBuses[right] _ ProcClocks["RightClocks", right]; <> FOR chan: SCPrivate.MaxChanSr IN SCPrivate.MaxChanSr DO channel: SCPrivate.RowChan _ NEW[SCPrivate.RowChanRec]; channel.exits _ NEW[SCPrivate.ExitArrayOb _ ALL []]; channel.chanNum _ chan; layoutData.rowChans.chans[chan] _ channel; IF SCRowUtil.FindRouteType[chan] = minRoute THEN {channel.initChanWidth _ rowRules.trunkToTrunk*15; channel.routeType _ minRoute} ELSE {channel.initChanWidth _ rowRules.trunkToTrunk*30; channel.routeType _ maxRoute} ENDLOOP; <> FOR side: SCPrivate.LRSide IN SCPrivate.LRSide DO channel: SCPrivate.SideChan _ NEW[SCPrivate.SideChanRec]; channel.side _ side; layoutData.sideChans[side] _ channel; channel.initSideChanWidth _ sideRules.trunkToTrunk*10; ENDLOOP; <> FOR row: NAT IN SCPrivate.MaxRowSr DO layoutData.lgRows.rows[row] _ NEW[SCPrivate.LgRowRec]; layoutData.lgRows.rows[row].rowNum _ row; ENDLOOP; layoutData.bpRows[bottom] _ bottomRow; bottomRow.bpSpacing _ GetIntProp["BottomBPSpacing", rowRules.branchToBranch]; bottomRow.initMaxBpsOnSide _ GetIntProp["BottomMaxBPs", 0]; bottomRow.routeSideChans _ GetBoolProp["BottomChanRoute", FALSE]; layoutData.bpRows[right] _ rightRow; rightRow.bpSpacing _ GetIntProp["RightBPSpacing", sideRules.trunkToTrunk]; rightRow.initMaxBpsOnSide _ GetIntProp["RightMaxBPs", 0]; rightRow.routeSideChans _ GetBoolProp["RightChanRoute", FALSE]; layoutData.bpRows[top] _ topRow; topRow.bpSpacing _ GetIntProp["TopBPSpacing", rowRules.branchToBranch]; topRow.initMaxBpsOnSide _ GetIntProp["TopMaxBPs", 0]; topRow.routeSideChans _ GetBoolProp["TopChanRoute", FALSE]; layoutData.bpRows[left] _ leftRow; leftRow.bpSpacing _ GetIntProp["LeftBPSpacing", sideRules.trunkToTrunk]; leftRow.initMaxBpsOnSide _ GetIntProp["LeftMaxBPs", 0]; leftRow.routeSideChans _ GetBoolProp["LeftChanRoute", FALSE]; RETURN[canContinue]; END; END.