<> <> <> <> <> DIRECTORY CD, CDSimpleRules, Core, CoreFlat, CoreGeometry, CoreOps, CoreProperties, CoreRoute, Process, PWCore, Rope, Route, RTCoreUtil, SC, SCChanUtil, SCInitialPlace, SCInstUtil, SCPlaceUtil, SCPrivate, SCRowUtil, SCSmash, SCUtil, Sinix, Sisyph, TWOps; SCImpl: CEDAR PROGRAM IMPORTS CD, CDSimpleRules, CoreFlat, CoreGeometry, CoreOps, CoreProperties, CoreRoute, Process, PWCore, Rope, Route, RTCoreUtil, SC, SCChanUtil, SCInitialPlace, SCInstUtil, SCPlaceUtil, SCPrivate, SCRowUtil, SCSmash, SCUtil, Sisyph, TWOps EXPORTS SC SHARES SC = { debug: BOOLEAN _ FALSE; <> Error: PUBLIC ERROR[errorType: SC.ErrorType _ callingError, explanation: Rope.ROPE _ NIL] = CODE; Signal: PUBLIC SIGNAL[signalType: SC.ErrorType _ callingError, explanation: Rope.ROPE _ NIL] = CODE; <> CreateDesignRules: PUBLIC PROC [technologyKey: ATOM, horizLayer, vertLayer: Rope.ROPE, rowDirection: SC.Direction] RETURNS [designRules: SC.DesignRules] = <> BEGIN hLayer: CD.Layer _ CDSimpleRules.GetLayer[technologyKey, horizLayer]; vLayer: CD.Layer _ CDSimpleRules.GetLayer[technologyKey, vertLayer]; technology: CD.Technology _ CD.FetchTechnology[technologyKey]; designRules _ NEW[SC.DesignRulesRec _ [horizLayer: horizLayer, vertLayer: vertLayer, rowParms: Route.DefaultDesignRulesParameters[technology, hLayer, vLayer, rowDirection], sideParms: Route.DefaultDesignRulesParameters[technology, hLayer, vLayer, rowDirection]]]; designRules.rowRules _ Route.DefaultDesignRules[designRules.rowParms]; designRules.sideRules _ Route.DefaultDesignRules[designRules.sideParms]; END; <> CreateHandle: PUBLIC PROC [cellType: Core.CellType, flattenCellType: RTCoreUtil.FlattenCellTypeProc, libName: Rope.ROPE, designRules: SC.DesignRules, name: Rope.ROPE, decoration: CoreGeometry.Decoration] RETURNS [handle: SC.Handle] = <> BEGIN parms: SCPrivate.Parms _ NARROW[NEW[SCPrivate.ParmsRec], SCPrivate.Parms]; IF designRules = NIL THEN SC.Signal[callingError, "No design rules."]; IF cellType = NIL THEN SC.Signal[callingError, "No Core cell type."]; handle _ NEW[SC.HandleRec]; handle.name _ IF name # NIL THEN name ELSE CoreOps.GetCellTypeName[cellType]; handle.rules _ designRules; handle.coreCellType _ cellType; parms.libName _ libName; handle.parms _ parms; <> IF ~SCPrivate.SetUpLayout[handle, cellType] THEN SC.Signal[callingError, "Unable to construct layout data"]; <<>> <> IF ~SCPrivate.GetStructure[handle, cellType, flattenCellType, decoration] THEN SC.Signal[callingError, "Unable to construct structure data"]; END; <> InitialPlace: PUBLIC PROC [handle: SC.Handle, numRows: NAT _ 0] = { <> <<>> layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCSmash.RemoveSmash[handle]; SCPlaceUtil.ClrCurPlac[handle, TRUE]; SCInitialPlace.PrePlace[handle: handle, numRows: numRows, routingFactor: 2.5, initialized: TRUE]; SCInitialPlace.RowInit[handle]; SCInitialPlace.PosInit[handle]; [layoutData.lgRows.maxRowWidth, layoutData.lgRows.numMaxRows] _ SCRowUtil.FindMaxRow[handle]; SCChanUtil.InitChanWidths[handle]; SCInstUtil.AsgnChanPos[handle]; layoutData.initTotWidth _ layoutData.totWidth; layoutData.initTotHeight _ layoutData.totHeight; IF debug THEN SCPlaceUtil.WriteCurPlace[handle]; [] _ SCUtil.WriteResults["End initial placement\n initial size: ", handle, 0]; Process.SetPriority[p]}; PosImprove: PUBLIC PROC [handle: SC.Handle, maxCycles: INT] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCPrivate.PosImprove[handle, areaFom, maxCycles]; Process.SetPriority[p]}; PosImproveWL: PUBLIC PROC [handle: SC.Handle, maxCycles: INT] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCPrivate.PosImprove[handle, wlFom, maxCycles]; Process.SetPriority[p]}; OrientImprove: PUBLIC PROC [handle: SC.Handle, maxCycles: INT] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCPrivate.OrientImprove[handle, areaFom, maxCycles]; Process.SetPriority[p]}; OrientImproveWL: PUBLIC PROC [handle: SC.Handle, maxCycles: INT] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCPrivate.OrientImprove[handle, wlFom, maxCycles]; Process.SetPriority[p]}; FTImprove: PUBLIC PROC [handle: SC.Handle, maxCycles: INT] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCPrivate.FTImprove[handle, wlFom, maxCycles]; Process.SetPriority[p]}; SAInitialPlace: PUBLIC PROC [handle: SC.Handle, widthFactor: REAL, seed: INT] RETURNS [initialResult: SC.SAInitialResult] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; initialResult _ SCPrivate.SAInitialPlace[handle, widthFactor, seed]; Process.SetPriority[p]}; SAGetParms: PUBLIC PROC [handle: SC.Handle, initialResult: SC.SAInitialResult, cellType: Core.CellType] RETURNS [saParms: SC.SAParms] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; saParms _ SCPrivate.SAGetParms[handle, initialResult, cellType]; Process.SetPriority[p]}; SAPlaceImprove: PUBLIC PROC [handle: SC.Handle, saParms: SC.SAParms, widthFactor: REAL, seed: INT] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCPrivate.SAPlaceImprove[handle, saParms, widthFactor, seed]; Process.SetPriority[p]}; SAPlaceImproveM: PUBLIC PROC [handle: SC.Handle, saParms: SC.SAParms, widthFactor: REAL, seed: INT] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCPrivate.SAPlaceImproveM[handle, saParms, widthFactor, seed]; Process.SetPriority[p]}; PlaceImprove: PUBLIC PROC [handle: SC.Handle, maxCycles: INT] = { <> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCPrivate.PlaceImprove[handle, maxCycles]; Process.SetPriority[p]}; GlobalRoute: PUBLIC PROC [handle: SC.Handle] = { <> <<>> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; SCSmash.RemoveSmash[handle]; SCSmash.SmashAllNets[handle, FALSE]; Process.SetPriority[p]}; DetailRoute: PUBLIC PROC [handle: SC.Handle] RETURNS [result: SC.Result] = { <> <<>> p: Process.Priority _ Process.GetPriority[]; Process.SetPriority[Process.priorityBackground]; result _ SCPrivate.DetailRoute[handle]; Process.SetPriority[p]}; CreateLayout: PUBLIC PROC [technologyKey: ATOM, horizLayer, vertLayer: Rope.ROPE, rowDirection: SC.Direction, numRows: NAT, cellType: Core.CellType, flattenCellType: RTCoreUtil.FlattenCellTypeProc, libName: Rope.ROPE _ NIL, name: Rope.ROPE _ NIL] RETURNS [object: CD.Object] = { <> <<>> result: SC.Result; widthFactor: REAL _ MAX[1.0, MIN[2.0, RTCoreUtil.GetCoreRealProp[cellType, SC.widthFactorProp, 1.1]]]; designRules: SC.DesignRules _ SC.CreateDesignRules[technologyKey, horizLayer, vertLayer, rowDirection]; handle: SC.Handle _ SC.CreateHandle[cellType, flattenCellType, libName, designRules, name, extractMode.decoration]; SC.InitialPlace[handle, RTCoreUtil.GetCoreIntProp[cellType, SC.numRows, 0]]; SC.SAPlaceImprove[handle, SC.SAGetParms[handle, SC.SAInitialPlace[handle, widthFactor], cellType], widthFactor]; SC.GlobalRoute[handle]; result _ SC.DetailRoute[handle]; RETURN [result.object]}; Destroy: PUBLIC PROC [handle: SC.Handle] ~ { <> <<>> SCPrivate.DestroyLayout[handle]; SCPrivate.DestroyStructure[handle]; SCUtil.DestroyRules[handle]; SCUtil.DestroyParms[handle]; handle.name _ NIL; handle.coreCellType _ NIL}; <> <<-- The cellType to layout is a record cellType containing elements from MSI; the layout proc flattens the Core description and calls the standard cell router. Placement is obtained from timberwolf.>> StandardCellRoute: PUBLIC PWCore.LayoutProc = { result: SC.Result; hMaterial: Rope.ROPE _ "metal"; vMaterial: Rope.ROPE _ "metal2"; widthFactor: REAL _ MAX[1.0, MIN[2.0, RTCoreUtil.GetCoreRealProp[cellType, SC.widthFactorProp, 1.1]]]; rules: SC.DesignRules _ SC.CreateDesignRules[technologyKey, hMaterial, vMaterial, horizontal]; handle: SC.Handle _ SC.CreateHandle[cellType: cellType, flattenCellType: RTCoreUtil.defaultFlatten, libName: libName, designRules: rules, decoration: extractMode.decoration]; CoreProperties.PutCellTypeProp[cellType, SC.handleAtom, handle]; SCUtil.ReadTWPlace[handle: handle]; SC.InitialPlace[handle, RTCoreUtil.GetCoreIntProp[cellType, SC.numRows, 0]]; <> <> <> <> SC.GlobalRoute[handle]; <> <> <> <> <> <> <> -- SC.FTImprove[handle, 10]; result _ SC.DetailRoute[handle]; RETURN[result.object]}; <<-- The cellType to layout is a record cellType containing elements from MSI; the layout proc flattens the Core description and calls the standard cell placer.>> StandardCellPlace: PUBLIC PWCore.LayoutProc = { hMaterial: Rope.ROPE _ "metal"; vMaterial: Rope.ROPE _ "metal2"; rules: SC.DesignRules _ SC.CreateDesignRules[technologyKey, hMaterial, vMaterial, horizontal]; handle: SC.Handle _ SC.CreateHandle[cellType: cellType, flattenCellType: RTCoreUtil.defaultFlatten, libName: libName, designRules: rules, decoration: extractMode.decoration]; CoreProperties.PutCellTypeProp[cellType, SC.handleAtom, handle]; SC.InitialPlace[handle, RTCoreUtil.GetCoreIntProp[cellType, SC.numRows, 0]]; SCUtil.WriteTWFiles[handle: handle]; RETURN[NIL]}; <<-- The cellType to layout is a record cellType containing elements from MSI; the layout proc flattens the Core description and calls the standard cell placer and router.>> StandardCellLayout: PUBLIC PWCore.LayoutProc = { result: SC.Result; saParms: SC.SAParms; initialResult: SC.SAInitialResult; hMaterial: Rope.ROPE _ "metal"; vMaterial: Rope.ROPE _ "metal2"; widthFactor: REAL _ MAX[1.0, MIN[2.0, RTCoreUtil.GetCoreRealProp[cellType, SC.widthFactorProp, 1.1]]]; rules: SC.DesignRules _ SC.CreateDesignRules[technologyKey, hMaterial, vMaterial, horizontal]; handle: SC.Handle _ SC.CreateHandle[cellType: cellType, flattenCellType: RTCoreUtil.defaultFlatten, libName: libName, designRules: rules, decoration: extractMode.decoration]; CoreProperties.PutCellTypeProp[cellType, SC.handleAtom, handle]; SC.InitialPlace[handle, RTCoreUtil.GetCoreIntProp[cellType, SC.numRows, 0]]; initialResult _ SC.SAInitialPlace[handle, widthFactor]; saParms _ SC.SAGetParms[handle, initialResult, cellType]; SC.SAPlaceImprove[handle: handle, saParms: saParms, widthFactor: widthFactor]; SC.PlaceImprove[handle: handle, maxCycles: 1]; SC.GlobalRoute[handle]; SC.PlaceImprove[handle: handle, maxCycles: 1]; <> <> <> <> -- SCSmash.CheckFts[handle]; -- SCSmash.CheckExits[handle]; result _ SC.DetailRoute[handle]; RETURN[result.object]}; <<-- The cellType to layout is a record cellType containing elements from MSI; the layout proc flattens the Core description and calls the standard cell placer and router.>> StandardCellLayoutTW: PUBLIC PWCore.LayoutProc = { result: SC.Result; hMaterial: Rope.ROPE _ "metal"; vMaterial: Rope.ROPE _ "metal2"; widthFactor: REAL _ MAX[1.0, MIN[2.0, RTCoreUtil.GetCoreRealProp[cellType, SC.widthFactorProp, 1.1]]]; rules: SC.DesignRules _ SC.CreateDesignRules[technologyKey, hMaterial, vMaterial, horizontal]; handle: SC.Handle _ SC.CreateHandle[cellType: cellType, flattenCellType: RTCoreUtil.defaultFlatten, libName: libName, designRules: rules, decoration: extractMode.decoration]; CoreProperties.PutCellTypeProp[cellType, SC.handleAtom, handle]; SC.InitialPlace[handle, RTCoreUtil.GetCoreIntProp[cellType, SC.numRows, 0]]; SCUtil.WriteTWFiles[handle: handle]; IF TWOps.TWIt[handle.name, TRUE]#NIL THEN SC.Error[callingError, Rope.Cat["Problem on Unix Placement Server. Check file ", handle.name, ".out"]]; SCUtil.ReadTWPlace[handle: handle]; SC.InitialPlace[handle, RTCoreUtil.GetCoreIntProp[cellType, SC.numRows, 0]]; -- initialResult _ SC.SAInitialPlace[handle, widthFactor]; -- saParms _ SC.SAGetParms[handle, initialResult, cellType]; -- SC.SAPlaceImprove[handle: handle, saParms: saParms, widthFactor: widthFactor]; -- SC.PlaceImprove[handle: handle, maxCycles: 1]; SC.GlobalRoute[handle]; -- SC.PlaceImprove[handle: handle, maxCycles: 1]; <> <> <> <> -- SCSmash.CheckFts[handle]; -- SCSmash.CheckExits[handle]; -- SC.FTImprove[handle, 10]; result _ SC.DetailRoute[handle]; RETURN[result.object]}; StandardCellDecorate: PUBLIC PWCore.DecorateProc = { <> SmashPins: PROC [wire: Core.Wire] = {CoreGeometry.PutPins[extractMode.decoration, wire, NIL]}; <> WireToLabels: PROC [wire: Core.Wire] RETURNS [LIST OF Route.Label] ~ { net: SCPrivate.Net _ SCUtil.FindNetByWire[handle, wire]; RETURN[IF net.numberOfRegions > 0 THEN LIST[net.name] ELSE net.brokenNets]}; <> ComparePos: PROC [pos1, pos2: CD.Position] RETURNS [BOOL] ~ { IF pos1.y = pos2.y THEN RETURN[pos1.x < pos2.x] ELSE RETURN[pos1.y < pos2.y]}; <> CompareCT: CoreRoute.CompareFlatCTProc ~ { <> flatName1: Rope.ROPE _ CoreFlat.CellTypePathRope[root, flatCT1]; instance1: SCPrivate.Instance _ SCUtil.FindInstance[handle, flatName1]; flatName2: Rope.ROPE _ CoreFlat.CellTypePathRope[root, flatCT2]; instance2: SCPrivate.Instance _ SCUtil.FindInstance[handle, flatName2]; IF instance1.curRow = instance2.curRow THEN RETURN[instance1.curPos < instance2.curPos] ELSE RETURN[instance1.curRow < instance2.curRow]}; handle: SC.Handle _ NARROW[CoreProperties.GetCellTypeProp[cellType, SC.handleAtom]]; CoreOps.VisitRootAtomics[cellType.public, SmashPins]; IF handle # NIL THEN { CoreRoute.DecorateRoutedArea[cellType: cellType, obj: obj, wireToLabels: WireToLabels, comparePos: ComparePos, compareCT: CompareCT]; SC.Destroy[handle]}}; <> StandardCellAttibutes: PUBLIC PWCore.AttributesProc = {-- [cellType: Core.CellType] FindSideForEachPin: CoreGeometry.EachWirePinProc = { <<[wire: Core.Wire, instance: CD.Instance, min: INT, max: INT, side: CoreGeometry.Side, layer: CD.Layer] RETURNS [quit: BOOL _ FALSE]>> PushPropOnAtomic: PROC [wire: Core.Wire] ~ { sideVal: REF ANY _ CoreProperties.GetWireProp[wire, SC.sideProp]; positionVal: REF ANY _ CoreProperties.GetWireProp[wire, SC.positionProp]; CoreProperties.PutWireProp[wire, SC.sideProp, IF sideVal=NIL THEN ref ELSE sideVal]; CoreProperties.PutWireProp[wire, SC.positionProp, IF positionVal=NIL THEN NEW[INT _ min] ELSE positionVal]}; ref: REF _ SELECT side FROM bottom => SC.bottomSideValue, top => SC.topSideValue, right => SC.rightSideValue, left => SC.leftSideValue, ENDCASE => SC.noSideValue; IF wire.size=0 THEN PushPropOnAtomic[wire] ELSE CoreOps.VisitRootAtomics[wire, PushPropOnAtomic]}; decoration: CoreGeometry.Decoration _ Sisyph.mode.decoration; DO IF CoreGeometry.HasObject[decoration, cellType] THEN { [] _ CoreGeometry.EnumerateWireSides[decoration, cellType, FindSideForEachPin]; EXIT}; IF cellType.class.recast = NIL THEN EXIT; cellType _ CoreOps.Recast[cellType] ENDLOOP}; SCLayoutAtom: ATOM _ PWCore.RegisterLayoutAtom[$SC, StandardCellLayout, StandardCellDecorate, StandardCellAttibutes]; SCPlaceAtom: ATOM _ PWCore.RegisterLayoutAtom[$SCPlace, StandardCellPlace, StandardCellDecorate, StandardCellAttibutes]; SCRouteAtom: ATOM _ PWCore.RegisterLayoutAtom[$SCRoute, StandardCellRoute, StandardCellDecorate, StandardCellAttibutes]; SCTWAtom: ATOM _ PWCore.RegisterLayoutAtom[$SCRemote, StandardCellLayoutTW, StandardCellDecorate, StandardCellAttibutes]; technologyKey: ATOM _ $cmosB; -- $cmosA or $cmosB libName: Rope.ROPE _ "CMOSB"; extractMode: Sinix.Mode _ PWCore.extractMode; <> handleAtom: PUBLIC ATOM _ CoreProperties.RegisterProperty[$SCHandle]; numRows: PUBLIC ATOM _ $numRows; <> sideProp: PUBLIC ATOM _ $Side; bottomSideValue: PUBLIC ATOM _ $bottom; rightSideValue: PUBLIC ATOM _ $right; topSideValue: PUBLIC ATOM _ $top; leftSideValue: PUBLIC ATOM _ $left; noSideValue: PUBLIC ATOM _ $none; <> rowProp: PUBLIC ATOM _ $Row; <> positionProp: PUBLIC ATOM _ $Position; <> usePublicPositionsProp: PUBLIC ATOM _ $UsePublicPositions; <> investmentProp: PUBLIC ATOM _ $Investment; veryLongValue: PUBLIC ATOM _ $veryLong; longValue: PUBLIC ATOM _ $long; mediumValue: PUBLIC ATOM _ $medium; shortValue: PUBLIC ATOM _ $short; veryShortValue: PUBLIC ATOM _ $veryShort; <> t0SA: PUBLIC ATOM _ $t0SA; maxTStepSA: PUBLIC ATOM _ $maxTStepSA; lambdaSA: PUBLIC ATOM _ $lambdaSA; tableSizeSA: PUBLIC ATOM _ $tableSizeSA; limitSA: PUBLIC ATOM _ $limitSA; <> widthFactorProp: PUBLIC ATOM _ $widthFactor; bottomMaxExits: PUBLIC ATOM _ $BottomMaxExits; rightMaxExits: PUBLIC ATOM _ $RightMaxExits; topMaxExits: PUBLIC ATOM _ $TopMaxExits; leftMaxExits: PUBLIC ATOM _ $LeftMaxExits; <> bottomExitSpacing: PUBLIC ATOM _ $BottomExitSpacing; rightExitSpacing: PUBLIC ATOM _ $RightExitSpacing; topExitSpacing: PUBLIC ATOM _ $TopExitSpacing; leftExitSpacing: PUBLIC ATOM _ $LeftExitSpacing; <> interestingProperties: PUBLIC RTCoreUtil.PropertyKeys _ NEW[RTCoreUtil.PropertyKeysRec[20]]; <> interestingProperties.p[0] _ SC.sideProp; interestingProperties.p[1] _ SC.rowProp; interestingProperties.p[2] _ SC.positionProp; interestingProperties.p[3] _ SC.numRows; interestingProperties.p[4] _ SC.bottomMaxExits; interestingProperties.p[5] _ SC.rightMaxExits; interestingProperties.p[6] _ SC.topMaxExits; interestingProperties.p[7] _ SC.leftMaxExits; interestingProperties.p[8] _ SC.bottomExitSpacing; interestingProperties.p[9] _ SC.rightExitSpacing; interestingProperties.p[10] _ SC.topExitSpacing; interestingProperties.p[11] _ SC.leftExitSpacing; interestingProperties.p[12] _ SC.investmentProp; interestingProperties.p[13] _ SC.t0SA; interestingProperties.p[14] _ SC.maxTStepSA; interestingProperties.p[15] _ SC.lambdaSA; interestingProperties.p[16] _ SC.tableSizeSA; interestingProperties.p[17] _ SC.limitSA; interestingProperties.p[18] _ SC.widthFactorProp; interestingProperties.p[19] _ SC.usePublicPositionsProp; <> }.