<> <> DIRECTORY Basics, Random, RealFns, Real, RTSets, SC, SCInstUtil, SCPrivate, SCPlaceUtil, SCWidthUtil, SCRowUtil, SCUtil; SCSAPlaceImpl: CEDAR PROGRAM IMPORTS Random, Real, RealFns, SC, SCInstUtil, SCPlaceUtil, SCRowUtil, SCWidthUtil, SCUtil EXPORTS SCPrivate SHARES SC = { debug: BOOLEAN _ TRUE; ExchDescription: TYPE = RECORD [ inst1, inst2: SCPrivate.Instance _ NIL]; SAPlace: PUBLIC PROCEDURE [handle: SC.Handle, t0, alpha: REAL, seed: INT] = { Freezing: PROCEDURE [score: REAL, temprature: REAL] RETURNS [BOOLEAN] = { RETURN[TRUE]}; Equilibrium: PROCEDURE [score: REAL] RETURNS [BOOLEAN] = { RETURN[TRUE]}; Select: PROCEDURE [] RETURNS [exch: ExchDescription _ [NIL, NIL]] = { structureData: SCPrivate.StructureData _ NARROW[handle.structureData]; numInstances: SCPrivate.ZMaxInstanceSr _ structureData.instances.count; numLogics: SCPrivate.ZMaxInstanceSr _ structureData.instances.numLogics; numIOs: SCPrivate.ZMaxInstanceSr _ structureData.instances.numIOs; inst1: SCPrivate.Instance _ GetInstance[]; inst2: SCPrivate.Instance; IF inst1.whichClass = io THEN { <> IF inst1 = NIL THEN RETURN ELSE { inst2 _ GetIo[inst1]; IF inst2 = NIL THEN RETURN}} ELSE IF inst1.whichClass = logic THEN { <> IF inst1 = NIL THEN RETURN ELSE { inst2 _ GetLogic[inst1]; IF inst2 = NIL THEN RETURN}} ELSE SC.Error[programmingError, "Invalid instance index"]; RETURN[[inst1, inst2]]}; GetInstance: PROCEDURE [] RETURNS [instance: SCPrivate.Instance _ NIL]= { structureData: SCPrivate.StructureData _ NARROW[handle.structureData]; numInstances: SCPrivate.ZMaxInstanceSr _ structureData.instances.count; index: SCPrivate.ZMaxInstanceSr _ Random.ChooseInt[selectStream, 1, numInstances]; instance _ structureData.instances.inst[index]; RETURN[instance]}; NextInstanceIndex: PROCEDURE [inst1: SCPrivate.Instance] RETURNS [inst2: SCPrivate.Instance _ NIL]= { RETURN[inst2]}; GetIo: PROCEDURE [inst1: SCPrivate.Instance] RETURNS [inst2: SCPrivate.Instance _ NIL]= { structureData: SCPrivate.StructureData _ NARROW[handle.structureData]; numInstances: SCPrivate.ZMaxInstanceSr _ structureData.instances.count; numLogics: SCPrivate.ZMaxInstanceSr _ structureData.instances.numLogics; numIOs: SCPrivate.ZMaxInstanceSr _ structureData.instances.numIOs; index: SCPrivate.ZMaxInstanceSr _ Random.ChooseInt[selectStream, 1, numInstances]; FOR i: SCPrivate.Instance _ NextInstanceIndex[inst1], NextInstanceIndex[i] WHILE i # inst1 AND inst2 = NIL DO ENDLOOP; RETURN[inst2]}; GetLogic: PROCEDURE [inst1: SCPrivate.Instance] RETURNS [inst2: SCPrivate.Instance _ NIL]= { structureData: SCPrivate.StructureData _ NARROW[handle.structureData]; numIOs: SCPrivate.ZMaxInstanceSr _ structureData.instances.numIOs; logicIndex: SCPrivate.ZMaxInstanceSr _ index - numIOs; numInstances: SCPrivate.ZMaxInstanceSr _ structureData.instances.count; index: SCPrivate.ZMaxInstanceSr _ Random.ChooseInt[selectStream, numIOs + 1, numInstances]; RETURN[inst2]}; Exchange: PROCEDURE [exch: ExchDescription] RETURNS [didIt: BOOLEAN _ TRUE] = { }; FullScore: PROCEDURE [handle: SC.Handle] RETURNS [score: REAL] = { RETURN[score]}; ModScore: PROCEDURE [exch: ExchDescription] RETURNS [score: REAL]= { RETURN[score]}; Random0To1: PROCEDURE [] RETURNS [value: REAL]= { RETURN[Real.Float[Random.ChooseInt[choiceStream, 0, 100000]]/100000.0]}; layoutData: SCPrivate.LayoutData _ NARROW[handle.layoutData]; structureData: SCPrivate.StructureData _ NARROW[handle.structureData]; lgRows: SCPrivate.LgRows _ layoutData.lgRows; selectStream: Random.RandomStream _ Random.Create[LAST[INT], seed]; choiceStream: Random.RandomStream _ Random.Create[LAST[INT], seed]; startArea: SC.Number; temprature: REAL _ t0; score: REAL _ FullScore[handle]; [lgRows.maxRowWidth, lgRows.numMaxRows] _ SCRowUtil.FindMaxRow[handle]; SCWidthUtil.AllChanWidths[handle, areaFom]; SCInstUtil.AsgnChanPos[handle]; startArea _ SCUtil.WriteResults["Position improvement\n starting area:", handle, 0]; UNTIL Freezing[score, temprature] DO UNTIL Equilibrium[score] DO exch: ExchDescription _ Select[]; IF Exchange[exch] THEN { trialScore: REAL _ ModScore[exch]; deltaScore: REAL _ trialScore - score; IF deltaScore < 0.0 THEN score _ trialScore ELSE { random: REAL _ Random0To1[]; IF random < RealFns.Exp[-deltaScore/temprature] THEN { [] _ Exchange[exch]}}}; ENDLOOP; temprature _ alpha * temprature; ENDLOOP; SCInstUtil.AllOffsets[handle]; [lgRows.maxRowWidth, lgRows.numMaxRows] _ SCRowUtil.FindMaxRow[handle]; SCWidthUtil.AllChanWidths[handle, areaFom]; SCInstUtil.AsgnChanPos[handle]; [] _ SCUtil.WriteResults["End position improvement\n ending area:", handle, startArea]; IF debug THEN SCPlaceUtil.WriteCurPlace[handle]}; }.