<> <> <> DIRECTORY CD, CDRects, CDIO, CDLRUCache, CDOrient, CDInline, CDApplications, CMos, TokenIO; CMosPDif: CEDAR PROGRAM IMPORTS CD, CDIO, CDLRUCache, CDRects, CDOrient, CDInline, CDApplications, CMos, TokenIO = BEGIN lambda: CD.DesignNumber = CD.lambda; wellSurround: CD.DesignNumber = CMos.wellSurround; pForWellDiff: REF CD.ObjectProcs ~ CD.RegisterObjectType[$CMosPDifRect, CMos.cmos]; cache: CDLRUCache.LRUCache ~ CDLRUCache.Create[size: 30, newProc: NewPDif]; dummySpecific: REF CMos.WellRectRep = NEW[CMos.WellRectRep]; NewPDif: PROC [] RETURNS [CD.ObPtr] = { ob: CD.ObPtr _ NEW[CD.ObjectDefinition_[p: pForWellDiff]]; ob.specificRef _ dummySpecific; RETURN [ob] }; Init: PROC [] = BEGIN pForWellDiff.drawMe _ DrawWellDiffRect; pForWellDiff.insideRect _ InsideWellDiffRect; pForWellDiff.showMeSelected _ ShowSelectedWellDiffRect; pForWellDiff.hitInside _ HitInsideWellDiffRect; pForWellDiff.internalRead _ ReadWellDif; pForWellDiff.internalWrite _ WriteWellDif; pForWellDiff.wireTyped _ TRUE; CDRects.UseAsCreateRect[CMos.pdif, CreateWellDiffRect, pForWellDiff]; <<-- hack; here to reduce numbers of modules only>> CDRects.UseAsCreateRect[CMos.bur, CDRects.CreateSaveRect]; CDRects.UseAsCreateRect[CMos.cut2, CDRects.CreateSaveRect]; END; WriteWellDif: CD.InternalWriteProc -- PROC [me: ObPtr] -- = BEGIN TokenIO.WriteInt[me.size.x-2*wellSurround]; TokenIO.WriteInt[me.size.y-2*wellSurround]; CDIO.WriteLevel[me.level]; END; ReadWellDif: CD.InternalReadProc --PROC [] RETURNS [ObPtr]-- = BEGIN x: INT = TokenIO.ReadInt[]; y: INT = TokenIO.ReadInt[]; l: CD.Level = CDIO.ReadLevel[]; ob: CD.ObPtr = CreateWellDiffRect[[x, y], l]; RETURN [ob] END; InsideWellDiffRect: PROC [ob: CD.ObPtr] RETURNS [CD.DesignRect] = BEGIN RETURN [CDInline.Extend[CDInline.RectAt[[0, 0], ob.size], -wellSurround]] END; ShowSelectedWellDiffRect: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN pr.outLineProc[CDInline.Extend[CDOrient.RectAt[pos, aptr.ob.size, orient], -(wellSurround)], pr] END; HitInsideWellDiffRect: PROC [aptr: CD.ApplicationPtr, hitRect: CD.DesignRect] RETURNS [BOOL] = BEGIN RETURN [CDInline.Intersect[ CDInline.Extend[ CDApplications.ARectO[aptr], -wellSurround], hitRect]] END; CreateWellDiffRect: PROC [size: CD.DesignPosition, l: CD.Level] RETURNS [CD.ObPtr] = BEGIN ob: CD.ObPtr ~ cache.UnusedOrNew[]; ob.p _ pForWellDiff; ob.size _ CDInline.AddSize[ [2*wellSurround, 2*wellSurround], CDInline.MaxPoint[size, [0, 0]]]; ob.level _ l; RETURN [cache.ReplaceByAequivalent[ob]] END; DrawWellDiffRect: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN r: CD.DesignRect = CDOrient.RectAt[pos, aptr.ob.size, orient]; inr: CD.DesignRect = CDInline.Extend[r, -wellSurround]; pr.drawRect[inr, aptr.ob.level, pr]; pr.drawRect[r, CMos.nwel, pr]; END; Init[]; END.