DIRECTORY CD, CDBasics, CDCallSpecific, CDIO, CDInstances, CDOrient, CDPrivate, CDProperties, CDRects, CDLayers, CDOps, LRUCache, Rope, SafeStorage; CDRectsImpl: CEDAR MONITOR IMPORTS CD, CDCallSpecific, CDBasics, CDInstances, CDIO, CDOrient, CDOps, CDPrivate, CDProperties, CDLayers, LRUCache, Rope, SafeStorage EXPORTS CDRects SHARES CD = BEGIN dummyRectPtr: CD.RectPtr = SafeStorage.GetPermanentZone[].NEW[CD.RectRep _ [filler: NIL]]; lruQueue: LRUCache.Handle _ LRUCache.Create[255, CDPrivate.Hash, Equal]; free: CD.Object _ NIL; --always bare rect GiveOb: ENTRY PROC [] RETURNS [ob: CD.Object] = INLINE { ob _ free; free _ NIL; IF ob=NIL THEN ob _ NEW[CD.ObjectRep_[class: bareRectClass, specificRef: dummyRectPtr]]; }; Equal: PROC[x, y: REF] RETURNS [BOOL] = { ob1: CD.Object = NARROW[x]; ob2: CD.Object = NARROW[y]; RETURN [ob1.class=ob2.class AND ob1.size=ob2.size AND ob1.layer=ob2.layer] }; CreateRectProc: TYPE = PROC [size: CD.Position, l: CD.Layer] RETURNS [CD.Object] _ CreateBareRect; createRectArray: REF ARRAY CD.Layer OF CreateRectProc = SafeStorage.GetPermanentZone[].NEW[ARRAY CD.Layer OF CreateRectProc]; CreateRect: PUBLIC PROC [size: CD.Position, l: CD.Layer] RETURNS [ob: CD.Object] = { IF createRectArray[l]=CreateBareRect THEN { ob _ CreateBareRect[size, l] } ELSE { used: REF; insert: BOOL; ob _ createRectArray[l][size, l]; [insert: insert, used: used] _ LRUCache.Include[lruQueue, ob]; IF ~insert THEN ob _ NARROW[used]; }; }; HangExtensionsOn: PROC[on: CD.ObjectClass] = { CDCallSpecific.Register[$Lengthen, on, Lengthen]; CDCallSpecific.Register[$Default, on, Defaulten]; CDCallSpecific.Register[$ChangeLayer, on, ChangeLayer]; }; UseAsCreateRect: PUBLIC PROC [l: CD.Layer, createRect: PROC [size: CD.Position, l: CD.Layer] RETURNS [CD.Object], hangExtensionsOn: CD.ObjectClass ] = { IF createRect=NIL THEN createRect _ CreateBareRect; createRectArray[l] _ createRect; IF hangExtensionsOn#NIL THEN HangExtensionsOn[hangExtensionsOn]; CDProperties.PutLayerProp[onto: l, prop: $CDxRectCreation, val: $CDxUser]; }; CreateBareRect: PUBLIC PROC [size: CD.Position, l: CD.Layer] RETURNS [ob: CD.Object] = { used: REF; insert: BOOL; ob _ GiveOb[]; ob.size _ CDBasics.MaxPoint[size, [1, 1]]; ob.layer _ l; [insert: insert, used: used] _ LRUCache.Include[lruQueue, ob]; IF ~insert THEN { free _ ob; ob _ NARROW[used]; }; }; bareRectClass: PUBLIC CD.ObjectClass; oldSaveRectClass: CD.ObjectClass; --for compatibility only Init: PROC [] = { bareRectClass _ CD.RegisterObjectClass[$Rect, [ drawMe: DrawMeForRects, quickDrawMe: DrawMeForRects, internalRead: ReadRect, internalWrite: WriteRect, describe: Describe, wireTyped: TRUE ]]; HangExtensionsOn[bareRectClass]; oldSaveRectClass _ CD.RegisterObjectClass[$SaveRect, [internalRead: ReadRect]]; }; Describe: PROC[me: CD.Object] RETURNS [Rope.ROPE] = { RETURN [Rope.Concat["rect ", CDOps.LayerName[me.layer]]] }; DrawMeForRects: PROC [inst: CD.Instance, pos: CD.Position, orient: CD.Orientation, pr: CD.DrawRef] = { pr.drawRect[CDOrient.RectAt[pos, inst.ob.size, orient], inst.ob.layer, pr] }; ChangeLayer: CDCallSpecific.CallProc = { new: CD.Instance; layer: CD.Layer _ WITH x SELECT FROM lr: CDPrivate.LayerRef => lr.number, ENDCASE => CDLayers.CurrentLayer[design]; new _ CDInstances.NewInstI[ ob: CreateRect[CD.InterestSize[inst.ob], layer], location: CDBasics.BaseOfRect[CDInstances.InstRectI[inst]], orientation: inst.orientation ]; repaintMe _ TRUE; inst.ob _ new.ob; inst.location _ new.location; }; Lengthen: CDCallSpecific.CallProc = { sz: CD.Position _ CD.InterestSize[inst.ob]; amount: CD.Position; IF x=NIL THEN amount _ [0, design.technology.lambda] ELSE IF ISTYPE [x, REF CD.Position] THEN amount _ NARROW[x, REF CD.Position]^ ELSE {done_FALSE; RETURN}; sz _ CDBasics.AddPoints[sz, amount]; IF sz.x<=0 OR sz.y<=0 THEN {done _ FALSE; RETURN}; inst.ob _ CreateRect[sz, inst.ob.layer]; repaintMe _ TRUE; }; Defaulten: CDCallSpecific.CallProc = { sz: CD.Position _ CD.InterestSize[inst.ob]; w: CD.Number _ CDLayers.LayerWidth[design, inst.ob.layer]; IF w<=0 THEN {done _ FALSE; RETURN}; sz.x _ w; inst.ob _ CreateRect[sz, inst.ob.layer]; repaintMe _TRUE; }; SetLength: CDCallSpecific.CallProc = { newLength: CD.Number _ NARROW[x, REF CD.Number]^; sz: CD.Position _ inst.ob.size; IF sz.ysz.x THEN sz.x _ newWidth ELSE sz.y _ newWidth; inst.ob _ CreateRect[sz, inst.ob.layer]; repaintMe _ TRUE; }; WriteRect: CD.InternalWriteProc -- PROC [me: Object] -- = { CDIO.WritePos[CD.InterestSize[me]]; CDIO.WriteLayer[me.layer]; }; ReadRect: CD.InternalReadProc --PROC [] RETURNS [Object]-- = { sz: CD.Position = CDIO.ReadPos[]; l: CD.Layer = CDIO.ReadLayer[]; ob: CD.Object = CreateRect[sz, l]; RETURN [ob] }; Init[]; END. VCDRectsImpl.mesa (part of ChipNDale) Copyright c 1983, 1986 by Xerox Corporation. All rights reserved. Christian Jacobi, June 24, 1983 4:58 pm Last Edited by: Christian Jacobi, August 25, 1986 11:50:51 am PDT --initialized by default --don't cache a secod time.. --otherwise do not remember object on free! we don't know its class Κx˜codešœ&™&Kšœ Οmœ7™BKšœ(™(K™AK˜—šΟk ˜ Kšžœ˜K˜ K˜K˜Kšœ ˜ K˜ K˜ K˜ K˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ —K˜šΠbl œžœžœ˜Kšžœžœ'žœQ˜ˆKšžœ ˜Kšžœžœ˜ —Kšž˜K˜Kš œžœ*žœžœžœ˜ZKšœH˜HKšœžœ žœΟc˜)K˜š Οnœžœžœžœžœ žœ˜8Kšœžœ˜Kš žœžœžœžœžœ>˜XK˜—K˜š ‘œžœžœžœžœ˜)Kšœžœ žœ˜Kšœžœ žœ˜Kšžœžœžœ˜JKšœ˜—K˜Kš œžœžœžœžœžœžœ˜bK˜š œžœžœžœžœ˜8Kš œžœžœžœžœ˜FKšœ™K˜—š‘ œžœžœžœžœžœžœ ˜Tšžœ#žœ˜+Kšœ™Kšœ˜K˜—šžœ˜Kšœžœ žœ˜Kšœ!˜!Kšœ>˜>šžœ žœžœ˜#KšœD™D—K˜—Kšœ˜K˜—š‘œžœžœ˜.Kšœ1˜1Kšœ1˜1Kšœ7˜7Kšœ˜—K˜š‘œžœžœžœ˜+Kš œ žœžœžœžœžœ ˜FKšœžœ ˜ Kšœ˜Kšžœ žœžœ˜3Kšœ ˜ Kšžœžœžœ$˜@KšœJ˜JKšœ˜—K˜š‘œžœžœžœžœžœžœ ˜XKšœžœ žœ˜Kšœ˜Kšœ8˜8Kšœ>˜>šžœ žœ˜Kšœ ˜ Kšœžœ˜K˜—Kšœ˜K˜—Kšœž œ ˜%Kšœžœ ˜:K˜š‘œžœ˜šœžœ˜/Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ˜Kšœ ž˜Kšœ˜—Kšœ ˜ Kšœžœ:˜OKšœ˜K˜—š ‘œžœžœ žœžœ˜5Kšžœ3˜9Kšœ˜—K˜š ‘œžœžœžœžœ ˜RKšœžœ ˜KšœJ˜JKšœ˜K˜—šΠbn œ˜(Kšœžœ ˜šœžœ žœžœž˜$Kšœ$˜$Kšžœ"˜)—šœ˜Kšœžœ ˜1Kšœ;˜;Kšœ˜Kšœ˜—Kšœ žœ˜Kšœ˜Kšœ˜Kšžœ˜K˜—š’œ˜%Kšœžœ žœ˜+Kšœžœ ˜Kšžœžœžœ'˜4Kšžœžœžœžœžœ žœ žœžœžœ ˜MKšžœžœžœ˜Kšœ$˜$Kš žœ žœ žœ žœžœ˜2Kšœ(˜(Kšœ žœ˜Kšœ˜K˜—š‘ œ˜&Kšœžœ žœ˜+Kšœžœ5˜:Kšžœžœ žœžœ˜$Kšœ ˜ Kšœ(˜(Kšœ žœ˜Kšœ˜K˜—š‘ œ˜&Kš œ žœ žœžœžœ ˜1Kšœžœ˜Kšžœ žœ˜#Kšžœ˜Kšœ(˜(Kšœ žœ˜Kšœ˜K˜—š‘œ˜%Kš œ žœ žœžœžœ ˜0Kšœžœ˜Kšžœ žœ˜"Kšžœ˜Kšœ(˜(Kšœ žœ˜Kšœ˜—K˜š’ œžœ œ˜;Kšžœ žœ˜#Kšžœ˜Kšœ˜—K˜š’œžœ œ˜>Kšœžœ žœ ˜!Kšœžœ žœ ˜Kšœžœ˜"Kšžœ˜ Kšœ˜—K˜K˜Kšžœ˜K˜K˜—…—r@