<<--File: IPPlaceProcsImpl.mesa>> <> <<>> DIRECTORY OrderedRefArray, IPCoTab, IPTop, IPTopOps, IPPlaceKit, IPPlaceProcs; IPPlaceProcsImpl: CEDAR PROGRAM IMPORTS OrderedRefArray, IPCoTab, IPTop, IPTopOps, IPPlaceKit EXPORTS IPPlaceProcs = BEGIN OPEN IPPlaceProcs; PlaceInit: PUBLIC PROC [ top: IPTop.Ref, orderingFn: IPPlaceKit.OrderingFn, trialsGen: IPPlaceKit.PlaceCompTGen, placeEval: IPPlaceKit.PlaceEvaluator, results: OrderedRefArray.Ref] ={ comps: IPPlaceKit.Components; depthAndBreadthList: LIST OF IPPlaceKit.DepthBreadthRec; placeRecursively: PROC[comps: IPPlaceKit.Components, dbList: LIST OF IPPlaceKit.DepthBreadthRec, prevStkSize: NAT] ={ dAndb: IPPlaceKit.DepthBreadthRec _ dbList.first; compsHd: IPPlaceKit.Components; IF placeEval[top, comps, OrderedRefArray.GetPruneValue[results]].prune THEN RETURN; [compsHd, comps] _ IPPlaceKit.CopyCompsHead[comps, dAndb.depth]; dbList _ dbList.rest; IF comps = NIL OR dbList.first.depth = 0 THEN PlaceComps[top, compsHd, trialsGen, placeEval, results, 0] ELSE { trials: OrderedRefArray.Ref _ OrderedRefArray.Create[dAndb.breadth]; eachTrialAction: OrderedRefArray.EachItemAction ={ IPTopOps.Redo[top, NARROW[item]]; placeRecursively[comps, dbList, IPTopOps.StackSize[top]]; [] _ IPTopOps.Undo[top, IPTopOps.StackSize[top] - prevStkSize]; --undo Redo }; --eachTrialAction PlaceComps[top, compsHd, trialsGen, placeEval, trials, prevStkSize]; OrderedRefArray.Enumerate[trials, eachTrialAction]; }; }; --placeRecursively <<--(1) Order the nonActive components in placement order>> [comps, depthAndBreadthList] _ orderingFn[top]; <<--(2) If assembly has no channels define channels, insert a component if necessary>> IF IPTop.NoTopology[top] THEN { IF IPCoTab.CountComponents[top.coTab].active = 0 THEN [] _ IPTopOps.SetComponent[top, comps.first, TRUE, [0,0], TRUE]; [] _ IPTop.ReDefineChs[top]; IPTop.Geometrize[top]; comps _ comps.rest; depthAndBreadthList.first.depth _ depthAndBreadthList.first.depth.PRED }; <<--(3) Do placement recursively>> placeRecursively[comps, depthAndBreadthList, IPTopOps.StackSize[top]]; }; --PlaceInit PlaceImprove: PUBLIC PROC[ top: IPTop.Ref, remove, numbOfTrials: NAT, removeTGen: IPPlaceKit.RemoveCompTGen, removeEval: IPPlaceKit.RemoveEvaluator, placeTGen: IPPlaceKit.PlaceCompTGen, placeEval: IPPlaceKit.PlaceEvaluator, results: OrderedRefArray.Ref ] = { startStkSize: NAT _ IPTopOps.StackSize[top]; removalTrials: OrderedRefArray.Ref _ OrderedRefArray.Create[numbOfTrials]; eachRemoveTrialAction: OrderedRefArray.EachItemAction ={ track: LIST OF REF _ NARROW[item]; comps: IPPlaceKit.Components _ IPPlaceKit.GetComponents[track]; IPTopOps.Redo[top, track]; IF placeEval[top, comps, OrderedRefArray.GetPruneValue[results]].prune THEN NULL ELSE PlaceComps[top, comps, placeTGen, placeEval, results, 0]; [] _ IPTopOps.Undo[top, IPTopOps.StackSize[top] - startStkSize]; }; --eachRemoveTrialAction <<--(1) Remove the needed number of components>> RemoveComps[top, remove, removeTGen, removeEval, removalTrials, startStkSize]; <<--(2) Try PlaceComps on each remove trial>> OrderedRefArray.Enumerate[removalTrials, eachRemoveTrialAction]; }; --PlaceImprove PlaceComps: PUBLIC PROC[top: IPTop.Ref, comps: LIST OF IPCoTab.Component, trialsGen: IPPlaceKit.PlaceCompTGen, placeEval: IPPlaceKit.PlaceEvaluator, results: OrderedRefArray.Ref, resultsAfter: NAT] = { startStkSize: NAT _ IPTopOps.StackSize[top]; trials: OrderedRefArray.Ref _ trialsGen[top, comps]; eachTrialAction: OrderedRefArray.EachItemAction ={ IPPlaceKit.Execute[top, item]; IF comps = NIL THEN OrderedRefArray.Insert[results, IPTopOps.GetTrack[top, resultsAfter], placeEval[top, NIL].value] ELSE IF placeEval[top, comps, OrderedRefArray.GetPruneValue[results]].prune THEN NULL --not fruitful ELSE PlaceComps[top, comps, trialsGen, placeEval, results, resultsAfter]; [] _ IPTopOps.Undo[top, IPTopOps.StackSize[top] - startStkSize]; }; --eachTrialAction comps _ comps.rest; OrderedRefArray.Enumerate[trials, eachTrialAction] }; --PlaceComps RemoveComps: PUBLIC PROC[ top: IPTop.Ref, numb: NAT, trialsGen: IPPlaceKit.RemoveCompTGen, removeEval: IPPlaceKit.RemoveEvaluator, results: OrderedRefArray.Ref, resultsAfter: NAT _ 0 ] ={ startStkSize: NAT _ IPTopOps.StackSize[top]; trials: OrderedRefArray.Ref _ trialsGen[top, numb]; eachTrialAction: OrderedRefArray.EachItemAction ={ IPPlaceKit.Execute[top, item]; IF numb = 0 THEN OrderedRefArray.Insert[results, IPTopOps.GetTrack[top, resultsAfter], removeEval[top, 0].value] ELSE IF removeEval[top, numb, OrderedRefArray.GetPruneValue[results]].prune THEN NULL ELSE RemoveComps[top, numb, trialsGen, removeEval, results, resultsAfter]; [] _ IPTopOps.Undo[top, IPTopOps.StackSize[top] - startStkSize]; }; --eachTrialAction numb _ numb.PRED; OrderedRefArray.Enumerate[trials, eachTrialAction] }; --RemoveComps END.