<> <> <> <> DIRECTORY CD, CDBasics, CDBasicsInline, CDRects, CDIO, CMosB, Rope, TokenIO; CMosBWellDifImpl: CEDAR PROGRAM IMPORTS CD, CDBasics, CDBasicsInline, CDIO, CDRects, CMosB, TokenIO SHARES CDRects = BEGIN wellSurround: CD.Number = CMosB.wellSurround; wpdifClass: CD.ObjectClass = CD.RegisterObjectClass[$C2PDifRect, [ drawMe: DrawWellPDiffRect, interestRect: InsideWellDiffRect, showMeSelected: ShowSelectedWellDiffRect, internalRead: CDRects.bareRectClass.internalRead, internalWrite: WriteWellDif, wireTyped: TRUE, description: "w-pdif", technology: CMosB.cmosB ]]; wndifClass: CD.ObjectClass = CD.RegisterObjectClass[$C2NDifRect, [ drawMe: DrawWellNDiffRect, interestRect: InsideWellDiffRect, showMeSelected: ShowSelectedWellDiffRect, internalRead: CDRects.bareRectClass.internalRead, internalWrite: WriteWellDif, wireTyped: TRUE, description: "w-ndif", technology: CMosB.cmosB ]]; dummySpecific: REF WellRectRep = NEW[WellRectRep]; WellRectRep: TYPE = RECORD [i: INT_0]; WriteWellDif: CD.InternalWriteProc = { sz: CD.Position _ CDBasics.SizeOfRect[ob.bbox]; TokenIO.WriteInt[h, sz.x-2*wellSurround]; TokenIO.WriteInt[h, sz.y-2*wellSurround]; CDIO.WriteLayer[h, ob.layer]; }; InsideWellDiffRect: PROC [ob: CD.Object] RETURNS [CD.Rect] = { RETURN [CDBasics.Extend[ob.bbox, -wellSurround]] }; ShowSelectedWellDiffRect: CD.DrawProc = { pr.drawOutLine[pr, CDBasics.Extend[CDBasics.MapRect[ob.bbox, trans], -(wellSurround)], CD.selectionLayer] }; CreateWellDiffRect: PROC [size: CD.Position, l: CD.Layer] RETURNS [ob: CD.Object] = { <<--we do not lru cache; CDRects caching is good enough>> size _ CDBasics.MaxPoint[size, [1, 1]]; ob _ NEW[CD.ObjectRep _ [class: wpdifClass, specific: dummySpecific]]; IF l=CMosB.wpdif THEN ob.class _ wpdifClass ELSE IF l=CMosB.wndif THEN ob.class _ wndifClass ELSE { --actally error, but try to correct IF l=CMosB.ndif THEN {l _ CMosB.wndif; ob.class _ wndifClass} ELSE IF l=CMosB.pdif THEN {l _ CMosB.wpdif; ob.class _ wpdifClass} ELSE ERROR }; ob.bbox _ [x1: -wellSurround, y1: -wellSurround, x2: size.x+wellSurround, y2: size.y+wellSurround]; ob.layer _ l; }; DrawWellPDiffRect: CD.DrawProc = { r: CD.Rect = CDBasicsInline.MapRect[ob.bbox, trans]; pr.drawRect[pr,CDBasics.Extend[r, -wellSurround], CMosB.pdif]; pr.drawRect[pr, r, CMosB.nwell]; }; DrawWellNDiffRect: CD.DrawProc = { r: CD.Rect = CDBasicsInline.MapRect[ob.bbox, trans]; pr.drawRect[pr, CDBasics.Extend[r, -wellSurround], CMosB.ndif]; pr.drawRect[pr, r, CMosB.pwell]; }; CDRects.UseAsCreateRect[CMosB.wpdif, CreateWellDiffRect, wpdifClass]; CDRects.UseAsCreateRect[CMosB.wndif, CreateWellDiffRect, wndifClass]; END.