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]}; }. ”file: SCSAPlaceImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. got an IO, get another IO got a logic, get another logic Κl˜šœ™Icodešœ Οmœ0™;—J˜šΟk ˜ J˜Jšœ˜J˜J˜Jšœ˜Jšžœ˜Jšœ ˜ J˜ Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ˜J˜—šΟn œžœž˜J˜Jšžœžœ9˜ZJšžœ ˜Jšžœžœ˜J˜Jšœžœžœ˜šœžœžœ˜ Jšœ#žœ˜(—J˜š Ÿœžœž œ žœžœžœ˜MJ˜š Ÿœž œ žœžœžœžœ˜IJ˜Jšžœžœ˜J˜—š Ÿ œž œ žœžœžœ˜:J˜Jšžœžœ˜J˜—š Ÿœž œžœžœžœ˜EJ˜Jšœ)žœ˜FJšœG˜GJšœH˜HJšœB˜BJšœ*˜*Jšœ˜šžœžœ˜Jšœ™Jšžœ žœžœž˜šžœ˜Jšœ˜Jšžœ žœžœžœ˜——šžœžœžœ˜'Jšœ™Jšžœ žœžœž˜šžœ˜Jšœ˜Jšžœ žœžœžœ˜——Jšžœžœ3˜:Jšžœ˜J˜—šŸ œž œžœ!žœ˜IJšœ)žœ˜FJšœG˜GJšœR˜RJšœ/˜/Jšžœ ˜J˜—šŸœž œžœžœ˜eJšžœ ˜J˜—šŸœž œžœžœ˜YJšœ)žœ˜FJšœG˜GJšœH˜HJšœB˜BJšœR˜Rš žœHžœ žœ žœž˜mJšžœ˜—Jšžœ ˜J˜—šŸœž œžœžœ˜\Jšœ)žœ˜FJšœB˜BJšœ6˜6JšœG˜GJšœ[˜[J˜Jšžœ ˜J˜—š Ÿœž œžœ žœžœ˜OJ˜Jšœ˜J˜—š Ÿ œž œ žœ žœ žœ˜BJ˜Jšžœ ˜J˜—šŸœž œžœ žœ˜DJ˜Jšžœ ˜J˜—šŸ œž œžœ žœ˜1JšžœB˜HJ˜—Jšœ#žœ˜=Jšœ)žœ˜FJšœ-˜-Jšœ2žœžœ ˜CJšœ2žœžœ ˜CJšœ žœ˜Jšœ žœ˜Jšœžœ˜ J˜JšœG˜GJšœ+˜+Jšœ˜JšœT˜TJ˜šžœž˜$šžœž˜Jšœ!˜!šžœžœ˜Jšœ žœ˜"Jšœ žœ˜&Jšžœžœ˜+šžœ˜Jšœžœ˜šžœ.žœ˜6Jšœ˜———Jšžœ˜—J˜ Jšžœ˜—J˜Jšœ˜JšœG˜GJšœ+˜+Jšœ˜J˜JšœW˜WJšžœžœ$˜1—Jšœ˜——…—88