<> <> <> <> <> <> DIRECTORY CD, CDSimpleRules, Core, CoreFlat, CoreGeometry, CoreOps, CoreProperties, CoreRoute, Process, PWCore, Rope, Route, RTCoreUtil, SC, SCChanUtil, SCInitialPlace, SCInstUtil, SCNewGlobalRoute, 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, SCNewGlobalRoute, 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]]; <> <> <> <> SCNewGlobalRoute.GlobalRouteAllNets[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]; SCNewGlobalRoute.GlobalRouteAllNets[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]]; <> <> <> <> <> SCNewGlobalRoute.GlobalRouteAllNets[handle]; <> <> <> <> <> <> <> <> 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; <> }.