DIRECTORY CD, CDAtomicObjects, CDLayers, CDOps, CDCommandOps, CDPanel, CDPanelFonts, CDSequencer, CDTexts, CDValue, CDViewer, IO, Rope, TerminalIO, CMosB, ViewerClasses, ViewerOps; CMosBCommands: CEDAR PROGRAM IMPORTS CD, CDAtomicObjects, CDCommandOps, CDLayers, CDOps, CDPanel, CDPanelFonts, CDSequencer, CDTexts, CDValue, CDViewer, TerminalIO, CMosB, ViewerOps = BEGIN lambda: CD.Number = CMosB.lambda; CreateXstr: PROC [comm: CDSequencer.Command] = { ob: CD.Object; layer: CD.Layer; size: CD.Position _ [8*lambda, 8*lambda]; TerminalIO.PutRope["create transistor "]; SELECT comm.key FROM $DrawNXstr => layer _ CMosB.ndif; $DrawWNXstr => layer _ CMosB.wndif; $DrawPXstr => layer _ CMosB.pdif; $DrawWPXstr => layer _ CMosB.wpdif; ENDCASE => layer _ CMosB.ndif; TerminalIO.PutRopes[CDOps.LayerRope[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2Trans, size, comm.design.technology, layer]; CDCommandOps.IncludeOb[comm, ob] }; CreateLXstr: PROC [comm: CDSequencer.Command] = { ob: CD.Object; layer: CD.Layer; TerminalIO.PutRope["create L transistor "]; SELECT comm.key FROM $DrawAngleNXstr => layer _ CMosB.ndif; $DrawAngleWNXstr => layer _ CMosB.wndif; $DrawAnglePXstr => layer _ CMosB.pdif; $DrawAngleWPXstr => layer _ CMosB.wpdif; ENDCASE => layer _ CMosB.ndif; TerminalIO.PutRopes[CDOps.LayerRope[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2LTrans, [0, 0], comm.design.technology, layer]; CDCommandOps.IncludeOb[comm, ob] }; CreateCont: PROC [comm: CDSequencer.Command] = { ob: CD.Object; layer: CD.Layer; TerminalIO.PutRope["create contact "]; SELECT comm.key FROM $DrawNDifCon => layer _ CMosB.ndif; $DrawWNDifCon => layer _ CMosB.wndif; $DrawPDifCon => layer _ CMosB.pdif; $DrawWPDifCon => layer _ CMosB.wpdif; $DrawPolCon => layer _ CMosB.pol; $DrawNWCntCon => layer _ CMosB.nwellCont; $DrawPWCntCon => layer _ CMosB.pwellCont; $DrawWNWCntCon => layer _ CMosB.wnwellCont; $DrawWPWCntCon => layer _ CMosB.wpwellCont; ENDCASE => layer _ CMosB.pol; TerminalIO.PutRopes[CDOps.LayerRope[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2SimpleCon, [0, 0], comm.design.technology, layer]; CDCommandOps.IncludeOb[comm, ob] }; CreateLargeCont: PROC [comm: CDSequencer.Command] = { ob: CD.Object; layer: CD.Layer; TerminalIO.PutRope["create large contact "]; SELECT comm.key FROM $DrawLNDifCon => layer _ CMosB.ndif; $DrawLWNDifCon => layer _ CMosB.wndif; $DrawLPDifCon => layer _ CMosB.pdif; $DrawLWPDifCon => layer _ CMosB.wpdif; $DrawLPolCon => layer _ CMosB.pol; $DrawLNWCntCon => layer _ CMosB.nwellCont; $DrawLPWCntCon => layer _ CMosB.pwellCont; $DrawLWNWCntCon => layer _ CMosB.wnwellCont; $DrawLWPWCntCon => layer _ CMosB.wpwellCont; ENDCASE => layer _ CMosB.pol; TerminalIO.PutRopes[CDOps.LayerRope[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2LargeSimpleCon, [0, 0], comm.design.technology, layer]; CDCommandOps.IncludeOb[comm, ob] }; CreateDiffShortCont: PROC [comm: CDSequencer.Command] = { ob: CD.Object; layer: CD.Layer; TerminalIO.PutRope["create diff short contact "]; SELECT comm.key FROM $DrawNDifShortCon => layer _ CMosB.ndif; $DrawWNDifShortCon => layer _ CMosB.wndif; $DrawPDifShortCon => layer _ CMosB.pdif; $DrawWPDifShortCon => layer _ CMosB.wpdif; ENDCASE => layer _ CMosB.ndif; TerminalIO.PutRopes[CDOps.LayerRope[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2DiffShortCon, [0, 0], comm.design.technology, layer]; CDCommandOps.IncludeOb[comm, ob] }; CreateVia: PROC [comm: CDSequencer.Command] = { ob: CD.Object; TerminalIO.PutRope["create via\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2Via, [0, 0], comm.design.technology]; CDCommandOps.IncludeOb[comm, ob] }; CreateLargeVia: PROC [comm: CDSequencer.Command] = { ob: CD.Object; TerminalIO.PutRope["create large via\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2LargeVia, [0, 0], comm.design.technology]; IF ob=NIL THEN TerminalIO.PutRope["not done\n"] ELSE [] _ CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos] }; DiffToPWorld: PROC [comm: CDSequencer.Command] = { layer: CD.Layer = CDLayers.CurrentLayer[comm.design]; TerminalIO.PutRope["Switch diffusion to P type"]; SELECT layer FROM CMosB.ndif, CMosB.wndif => CDLayers.SetCurrentLayer[comm.design, CMosB.wpdif]; CMosB.pwellCont, CMosB.wpwellCont => CDLayers.SetCurrentLayer[comm.design, CMosB.wnwellCont]; ENDCASE => TerminalIO.PutRope[" not done"]; TerminalIO.PutRope["\n"]; }; DiffToNWorld: PROC [comm: CDSequencer.Command] = { layer: CD.Layer = CDLayers.CurrentLayer[comm.design]; TerminalIO.PutRope["Switch diffusion to N type"]; SELECT layer FROM CMosB.pdif, CMosB.wpdif => CDLayers.SetCurrentLayer[comm.design, CMosB.ndif]; CMosB.wnwellCont, CMosB.nwellCont => CDLayers.SetCurrentLayer[comm.design, CMosB.pwellCont]; ENDCASE => TerminalIO.PutRope[" not done"]; TerminalIO.PutRope["\n"]; }; SchematicModeComm: PROC [comm: CDSequencer.Command] = { GetGrid: PROC [viewer: ViewerClasses.Viewer] RETURNS [i: INT _ -1] = { WITH ViewerOps.GetViewer[viewer, $Grid] SELECT FROM ri: REF INT => i _ ri^; ENDCASE => NULL; }; font: CDTexts.CDFont _ CDPanelFonts.CurrentFont[comm.design]; viewer: ViewerClasses.Viewer _ CDViewer.GetViewer[comm]; IF viewer#NIL THEN { is: INT _ GetGrid[viewer]; goal: INT _ MAX[2*CMosB.lambda, is]; IF goal#is THEN ViewerOps.SetViewer[viewer: viewer, data: NEW[INT_goal], op: $Grid]; }; CDValue.StoreInt[comm.design, $PanelLayerMode, 0]; CDValue.StoreInt[comm.design, $CDxStepValue, 0]; [] _ CDPanel.PutUp[comm.design, $CDxStepValue]; CDLayers.SetCurrentLayer[comm.design, CD.commentLayer]; CDLayers.SetLayerWidth[comm.design, CD.commentLayer, CMosB.lambda/2]; [] _ CDPanel.PutUp[comm.design, $PanelLayerMode]; [] _ CDPanelFonts.SetCurrentFont[comm.design, CDTexts.MakeFont[font.supposedName, CMosB.lambda/2]]; TerminalIO.PutRope["schematics mode\n"]; }; LayoutModeComm: PROC [comm: CDSequencer.Command] = { font: CDTexts.CDFont _ CDPanelFonts.CurrentFont[comm.design]; viewer: ViewerClasses.Viewer _ CDViewer.GetViewer[comm]; IF viewer#NIL THEN ViewerOps.SetViewer[viewer: viewer, data: NEW[INT_CMosB.lambda], op: $Grid]; CDValue.StoreInt[comm.design, $PanelLayerMode, 1]; CDValue.StoreInt[comm.design, $CDxStepValue, 0]; [] _ CDPanel.PutUp[comm.design, $CDxStepValue]; IF CD.LayerTechnology[CDLayers.CurrentLayer[comm.design]]=NIL THEN CDLayers.SetCurrentLayer[comm.design, CD.commentLayer]; [] _ CDPanel.PutUp[comm.design, $PanelLayerMode]; [] _ CDPanelFonts.SetCurrentFont[comm.design, CDTexts.MakeFont[font.supposedName, CMosB.lambda/4]]; TerminalIO.PutRope["layout mode\n"]; }; Init: PROC [] = { MakeComm: PROC [key: ATOM, p: CDSequencer.CommandProc, qm: CDSequencer.QueueMethod_doQueue] = { CDSequencer.ImplementCommand[key, p, CMosB.cmosB, qm]; }; fontNames: LIST OF Rope.ROPE = LIST[ "4 Helvetica8", "4 Helvetica8B", "4 Helvetica12", "4 Helvetica6", "4 Helvetica6B", "4 TimesRoman8", "2 Helvetica8", "1 Helvetica8", "8 Helvetica8", "4 Gates32"]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerComment, CD.commentLayer, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerNWell, CMosB.nwell, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerPWell, CMosB.pwell, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerNDif, CMosB.ndif, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerPol, CMosB.pol, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerMet2, CMosB.met2, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerMet, CMosB.met, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerPDif, CMosB.wpdif, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerNWCnt, CMosB.nwellCont, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerPWCnt, CMosB.pwellCont, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerWNWCnt, CMosB.wnwellCont, CMosB.cmosB]; CDCommandOps.RegisterCurrentLayerCommand[$SetLayerWPWCnt, CMosB.wpwellCont, CMosB.cmosB]; MakeComm[$TestDifFlipToPWorld, DiffToPWorld]; MakeComm[$TestDifFlipToNWorld, DiffToNWorld]; MakeComm[$DiffToPWorld, DiffToPWorld]; MakeComm[$DiffToNWorld, DiffToNWorld]; MakeComm[$DrawNXstr, CreateXstr, doQueueAndMark]; MakeComm[$DrawPXstr, CreateXstr, doQueueAndMark]; MakeComm[$DrawWNXstr, CreateXstr, doQueueAndMark]; MakeComm[$DrawWPXstr, CreateXstr, doQueueAndMark]; MakeComm[$DrawAngleNXstr, CreateLXstr, doQueueAndMark]; MakeComm[$DrawAnglePXstr, CreateLXstr, doQueueAndMark]; MakeComm[$DrawAngleWNXstr, CreateLXstr, doQueueAndMark]; MakeComm[$DrawAngleWPXstr, CreateLXstr, doQueueAndMark]; MakeComm[$DrawNDifCon, CreateCont, doQueueAndMark]; MakeComm[$DrawWNDifCon, CreateCont, doQueueAndMark]; MakeComm[$DrawPDifCon, CreateCont, doQueueAndMark]; MakeComm[$DrawWPDifCon, CreateCont, doQueueAndMark]; MakeComm[$DrawPolCon, CreateCont, doQueueAndMark]; MakeComm[$DrawNWCntCon, CreateCont, doQueueAndMark]; MakeComm[$DrawPWCntCon, CreateCont, doQueueAndMark]; MakeComm[$DrawWNWCntCon, CreateCont, doQueueAndMark]; MakeComm[$DrawWPWCntCon, CreateCont, doQueueAndMark]; MakeComm[$DrawLNDifCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawLWNDifCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawLPDifCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawLWPDifCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawLPolCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawLNWCntCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawLPWCntCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawLWNWCntCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawLWPWCntCon, CreateLargeCont, doQueueAndMark]; MakeComm[$DrawNDifShortCon, CreateDiffShortCont, doQueueAndMark]; MakeComm[$DrawWNDifShortCon, CreateDiffShortCont, doQueueAndMark]; MakeComm[$DrawPDifShortCon, CreateDiffShortCont, doQueueAndMark]; MakeComm[$DrawWPDifShortCon, CreateDiffShortCont, doQueueAndMark]; MakeComm[$DrawMm2Con, CreateVia, doQueueAndMark]; MakeComm[$DrawLVia, CreateLargeVia, doQueueAndMark]; MakeComm[$SetLayoutMode, LayoutModeComm]; MakeComm[$SetSchematicMode, SchematicModeComm]; CDPanelFonts.ImplementIt[tech: CMosB.cmosB, layerProc: CommentLayer, defaultFonts: fontNames]; CDCommandOps.RegisterCommanderNewDesign[CMosB.cmosB]; }; CommentLayer: PROC [CD.Layer] RETURNS [CD.Layer] = { RETURN [CD.commentLayer]; }; Init[]; END. θCMosBCommands.mesa (part of ChipNDale) Copyright c 1983, 1986 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, June 24, 1983 5:03 pm Last edited by: Christian Jacobi, January 28, 1987 2:58:54 pm PST Κ‚˜codešœ'™'Kšœ Οmœ7™BKšœ3™3K™A—K˜šΟk ˜ Kšžœ˜K˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ˜Kšœ˜Kšœ ˜ Kšœ˜K˜K˜ K˜Kšœ˜Kšœ ˜ —K˜šΟn œžœžœ˜Kšžœ”˜›—Kšž˜K˜Kšœžœ˜!K˜šŸ œžœ ˜0Kšœžœ˜Kšœžœ˜Kšœžœ!˜)Kšœ)˜)šžœ ž˜Kšœ!˜!Kšœ#˜#Kšœ!˜!Kšœ#˜#Kšžœ˜—Kšœ2˜2KšœS˜SKšœ ˜ Kšœ˜K˜—šŸ œžœ ˜1Kšœžœ˜Kšœžœ˜Kšœ+˜+šžœ ž˜Kšœ&˜&Kšœ(˜(Kšœ&˜&Kšœ(˜(Kšžœ˜—Kšœ2˜2KšœV˜VKšœ ˜ Kšœ˜K˜—šŸ œžœ ˜0Kšœžœ˜Kšœžœ˜Kšœ&˜&šžœ ž˜Kšœ#˜#Kšœ%˜%Kšœ#˜#Kšœ%˜%Kšœ!˜!Kšœ)˜)Kšœ)˜)Kšœ+˜+Kšœ+˜+Kšžœ˜—Kšœ2˜2KšœY˜YKšœ ˜ Kšœ˜K˜—šŸœžœ ˜5Kšœžœ˜Kšœžœ˜Kšœ,˜,šžœ ž˜Kšœ$˜$Kšœ&˜&Kšœ$˜$Kšœ&˜&Kšœ"˜"Kšœ*˜*Kšœ*˜*Kšœ,˜,Kšœ,˜,Kšžœ˜—Kšœ2˜2Kšœ^˜^Kšœ ˜ Kšœ˜K˜—šŸœžœ ˜9Kšœžœ˜Kšœžœ˜Kšœ1˜1šžœ ž˜Kšœ(˜(Kšœ*˜*Kšœ(˜(Kšœ*˜*Kšžœ˜—Kšœ2˜2Kšœ\˜\Kšœ ˜ Kšœ˜K˜—šŸ œžœ ˜/Kšœžœ˜Kšœ#˜#KšœL˜LKšœ ˜ Kšœ˜K˜—šŸœžœ ˜4Kšœžœ˜Kšœ)˜)KšœQ˜Qšžœžœž˜Kšœ ˜ —šž˜KšœJ˜J—Kšœ˜K˜—šŸ œžœ ˜2Kšœžœ,˜5Kšœ1˜1šžœž˜KšœN˜NKšœ]˜]Kšžœ%˜,—Kšœ˜Kšœ˜K˜—šŸ œžœ ˜2Kšœžœ,˜5Kšœ1˜1šžœž˜KšœM˜MKšœ\˜\Kšžœ%˜,—Kšœ˜Kšœ˜—K˜šŸœžœ ˜7šŸœžœ žœžœ ˜Fšžœ$žœž˜3Kšœžœžœ ˜Kšžœžœ˜—K˜—Kšœ=˜=Kšœ8˜8šžœžœžœ˜Jšœžœ˜Jšœžœžœ˜$Jšžœ žœ+žœžœ˜TJ˜—Jšœ2˜2Jšœ0˜0Jšœ/˜/Jšœ&žœ˜7Jšœ$žœ˜EJšœ1˜1Jšœc˜cKšœ(˜(J˜—J˜šŸœžœ ˜4Kšœ=˜=Kšœ8˜8šžœžœžœ˜Jšœ*žœžœ˜L—Jšœ2˜2Jšœ0˜0Jšœ/˜/šžœžœ5žœž˜BJšœ&žœ˜7—Jšœ1˜1Jšœc˜cKšœ$˜$J˜—K˜šŸœžœ˜K˜šŸœžœžœF˜_Kšœ6˜6Kšœ˜—K˜š œ žœžœžœžœ˜$KšœR˜RKšœN˜N—K˜Kšœ;žœ˜YKšœS˜SKšœS˜SKšœQ˜QKšœO˜OKšœQ˜QKšœO˜OKšœR˜RKšœW˜WKšœW˜WKšœY˜YKšœY˜YK˜Kšœ-˜-Kšœ-˜-Kšœ&˜&Kšœ&˜&Kšœ1˜1Kšœ1˜1Kšœ2˜2Kšœ2˜2K˜Kšœ7˜7Kšœ7˜7Kšœ8˜8Kšœ8˜8K˜Kšœ3˜3Kšœ4˜4Kšœ3˜3Kšœ4˜4Kšœ2˜2Kšœ4˜4Kšœ4˜4Kšœ5˜5Kšœ5˜5K˜Kšœ9˜9Kšœ:˜:Kšœ9˜9Kšœ:˜:Kšœ8˜8Kšœ:˜:Kšœ:˜:Kšœ;˜;Kšœ;˜;K˜KšœA˜AKšœB˜BKšœA˜AKšœB˜BK˜Kšœ1˜1Kšœ4˜4K˜Kšœ)˜)Kšœ/˜/K˜Kšœ^˜^K™Kšœ5˜5Kšœ˜—K˜š Ÿ œžœžœžœžœ ˜4Kšžœžœ˜Kšœ˜—K˜K˜Kšžœ˜K˜—…—'ό1f