DIRECTORY CD, CDBasics, CDBasicsInline, CDRects, CDIO, CMos, Rope, TokenIO; CMosWellDifImpl: CEDAR PROGRAM IMPORTS CD, CDBasics, CDBasicsInline, CDIO, CDRects, CMos, TokenIO SHARES CDRects = BEGIN wellSurround: CD.Number = CMos.wellSurround; wpdifClass: CD.ObjectClass = CD.RegisterObjectClass[$CMosPDifRect, [ drawMe: DrawWellPDiffRect, interestRect: InsideWellDiffRect, showMeSelected: ShowSelectedWellDiffRect, internalRead: CDRects.bareRectClass.internalRead, internalWrite: WriteWellDif, wireTyped: TRUE, description: "w-pdif", technology: CMos.cmos ]]; wndifClass: CD.ObjectClass = CD.RegisterObjectClass[$CMosNDifRect, [ drawMe: DrawWellNDiffRect, interestRect: InsideWellDiffRect, showMeSelected: ShowSelectedWellDiffRect, internalRead: CDRects.bareRectClass.internalRead, internalWrite: WriteWellDif, wireTyped: TRUE, description: "w-ndif", technology: CMos.cmos ]]; dummySpecific: REF WellRectRep = NEW[WellRectRep]; WellRectRep: TYPE = RECORD [i: INT_0]; NewWellDif: PROC [] RETURNS [CD.Object] = { ob: CD.Object _ NEW[CD.ObjectRep _ [class: wpdifClass]]; ob.specific _ dummySpecific; RETURN [ob] }; 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: PROC [inst: CD.Instance, trans: CD.Transformation, pr: CD.DrawRef] = { pr.drawOutLine[CDBasics.Extend[CDBasics.MapRect[inst.ob.bbox, trans], -(wellSurround)], CD.selectionLayer, pr] }; CreateWellDiffRect: PROC [size: CD.Position, l: CD.Layer] RETURNS [ob: CD.Object] = { size _ CDBasics.MaxPoint[size, [1, 1]]; ob _ NEW[CD.ObjectRep _ [class: wpdifClass, specific: dummySpecific]]; IF l=CMos.wpdif THEN ob.class _ wpdifClass ELSE IF l=CMos.wndif THEN ob.class _ wndifClass ELSE { --actally error, but try to correct IF l=CMos.ndif THEN {l _ CMos.wndif; ob.class _ wndifClass} ELSE IF l=CMos.pdif THEN {l _ CMos.wpdif; ob.class _ wpdifClass} ELSE ERROR }; ob.bbox _ [x1: -wellSurround, y1: -wellSurround, x2: size.x+wellSurround, y2: size.y+wellSurround]; ob.layer _ l; }; DrawWellPDiffRect: PROC [inst: CD.Instance, trans: CD.Transformation, pr: CD.DrawRef] = { r: CD.Rect = CDBasicsInline.MapRect[inst.ob.bbox, trans]; pr.drawRect[CDBasics.Extend[r, -wellSurround], CMos.pdif, pr]; pr.drawRect[r, CMos.nwell, pr]; }; DrawWellNDiffRect: PROC [inst: CD.Instance, trans: CD.Transformation, pr: CD.DrawRef] = { r: CD.Rect = CDBasicsInline.MapRect[inst.ob.bbox, trans]; pr.drawRect[CDBasics.Extend[r, -wellSurround], CMos.ndif, pr]; pr.drawRect[r, CMos.pwell, pr]; }; CDRects.UseAsCreateRect[CMos.wpdif, CreateWellDiffRect, wpdifClass]; CDRects.UseAsCreateRect[CMos.wndif, CreateWellDiffRect, wndifClass]; END. &CMosWellDifImpl.mesa (part of ChipNDale) Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. Created by: Christian Jacobi, September 10, 1983 9:34 pm Last edited by: Christian Jacobi, October 17, 1986 2:03:11 pm PDT --we do not lru cache; CDRects caching is good enough Κz˜codešœ)™)Kšœ Οmœ7™BKšœ:™:K™AK˜—šΟk ˜ Kšžœ˜K˜ K˜K˜K˜K˜K˜K˜K˜—šΟnœžœžœ˜Kšžœžœžœ˜BKšžœ ˜—Kšž˜K˜Kšœžœ˜,K˜šœ žœžœ%˜DKšœ˜Kšœ!˜!Kšœ)˜)Kšœ1˜1Kšœ˜Kšœ žœ˜Kšœ˜Kšœ˜Kšœ˜—šœ žœžœ%˜DKšœ˜Kšœ!˜!Kšœ)˜)Kšœ1˜1Kšœ˜Kšœ žœ˜Kšœ˜Kšœ˜Kšœ˜—Kšœžœžœ˜3šœ žœžœžœ˜'K˜—K˜šŸ œžœžœžœ ˜+Kšœžœ žœžœ"˜8Kšœ˜Kšžœ˜ Kšœ˜—K˜šΠbn œžœ˜&Kšœ/˜/Kšœ)˜)Kšœ)˜)Kšžœ˜Kšœ˜K˜—š Ÿœžœžœ žœžœ ˜>Kšžœ+˜1Kšœ˜K˜—šŸœžœžœ)žœ ˜`KšœXžœ˜nKšœ˜K˜—š Ÿœžœžœžœžœžœ ˜UKšœ5™5K˜'Kšœžœžœ;˜FKšžœžœ˜*Kšžœžœžœ˜/šžœΟc#˜*Kšžœ žœ(˜;Kšžœžœ žœ(˜@Kšžœž˜ K˜—Kšœc˜cKšœ ˜ Kšœ˜K˜—šŸœžœžœ)žœ ˜YKšœžœ5˜:Kšœ>˜>K˜ Kšœ˜K˜—šŸœžœžœ)žœ ˜YKšœžœ5˜:Kšœ>˜>K˜ Kšœ˜K˜—KšœD˜DKšœD˜DKšžœ˜K˜—…— Nξ