DIRECTORY CD, CDAtomicObjects, CDLayers, CDOps, CDPanelFonts, CDSequencer, CDViewer, Commander USING [CommandProc, Register], IO, Rope, TerminalIO, CMosB; CMosBCommands: CEDAR PROGRAM IMPORTS CDAtomicObjects, CDLayers, CDOps, CDPanelFonts, CDSequencer, CDViewer, Commander, IO, TerminalIO, CMosB = BEGIN lambda: CD.Number = CMosB.lambda; CreateXstr: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; layer: CD.Layer; size: CD.Position _ [8*lambda, 8*lambda]; TerminalIO.WriteRope["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.WriteRopes[CDOps.LayerName[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2Trans, size, comm.design.technology, layer]; IF ob=NIL THEN TerminalIO.WriteRope["not done\n"] ELSE CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos, orientation: 0] END; CreateLXstr: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; layer: CD.Layer; TerminalIO.WriteRope["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.WriteRopes[CDOps.LayerName[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2LTrans, [0, 0], comm.design.technology, layer]; IF ob=NIL THEN TerminalIO.WriteRope["not done\n"] ELSE CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos, orientation: 0] END; CreateCont: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; layer: CD.Layer; TerminalIO.WriteRope["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; ENDCASE => layer _ CMosB.pol; TerminalIO.WriteRopes[CDOps.LayerName[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2SimpleCon, [0, 0], comm.design.technology, layer]; IF ob=NIL THEN TerminalIO.WriteRope["not done\n"] ELSE CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos, orientation: 0] END; CreateLargeCont: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; layer: CD.Layer; TerminalIO.WriteRope["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; ENDCASE => layer _ CMosB.pol; TerminalIO.WriteRopes[CDOps.LayerName[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2LargeSimpleCon, [0, 0], comm.design.technology, layer]; IF ob=NIL THEN TerminalIO.WriteRope["not done\n"] ELSE CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos, orientation: 0] END; CreateDiffShortCont: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; layer: CD.Layer; TerminalIO.WriteRope["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.WriteRopes[CDOps.LayerName[layer], "\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2DifShortCon, [0, 0], comm.design.technology, layer]; IF ob=NIL THEN TerminalIO.WriteRope["not done\n"] ELSE CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos, orientation: 0] END; CreateVia: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; TerminalIO.WriteRope["create via\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2Via, [0, 0], comm.design.technology]; IF ob=NIL THEN TerminalIO.WriteRope["not done\n"] ELSE CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos, orientation: 0] END; CreateLargeVia: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; TerminalIO.WriteRope["create large via\n"]; ob _ CDAtomicObjects.CreateAtomicOb[$C2LargeVia, [0, 0], comm.design.technology]; IF ob=NIL THEN TerminalIO.WriteRope["not done\n"] ELSE CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos, orientation: 0] END; SetLayerComment: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["comment for default\n"]; CDLayers.SetCurrentLayer[comm.design, CD.commentLayer]; END; SetLayerNWell: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["NWell for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.nwell] END; SetLayerPWell: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["PWell for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.pwell]; END; SetLayerDif: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["diffusion for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.ndif] END; SetLayerPol: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["poly for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.pol] END; SetLayerMet2: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["metal-2 for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.met2] END; SetLayerMet: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["metal for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.met] END; SetLayerPDif: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["p-diff for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.wpdif] END; SetLayerNWCnt: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["N-Well Cnt for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.nwellCont] END; SetLayerPWCnt: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["P-Well Cnt for default\n"]; CDLayers.SetCurrentLayer[comm.design, CMosB.pwellCont] END; DiffToPWorld: PROC [comm: CDSequencer.Command] = BEGIN layer: CD.Layer = CDLayers.CurrentLayer[comm.design]; TerminalIO.WriteRope["Switch diffusion to P type"]; SELECT layer FROM CMosB.ndif => CDLayers.SetCurrentLayer[comm.design, CMosB.wpdif]; CMosB.pwellCont => CDLayers.SetCurrentLayer[comm.design, CMosB.nwellCont]; ENDCASE => TerminalIO.WriteRope[" not done"]; TerminalIO.WriteLn[]; END; DiffToNWorld: PROC [comm: CDSequencer.Command] = BEGIN layer: CD.Layer = CDLayers.CurrentLayer[comm.design]; TerminalIO.WriteRope["Switch diffusion to N type"]; SELECT layer FROM CMosB.pdif => CDLayers.SetCurrentLayer[comm.design, CMosB.ndif]; CMosB.wpdif => CDLayers.SetCurrentLayer[comm.design, CMosB.ndif]; CMosB.nwellCont => CDLayers.SetCurrentLayer[comm.design, CMosB.pwellCont]; ENDCASE => TerminalIO.WriteRope[" not done"]; TerminalIO.WriteLn[]; END; NewCWorld: Commander.CommandProc = BEGIN design: CD.Design _ CDOps.CreateDesign[CMosB.cmosB]; [] _ CDViewer.CreateViewer[design]; cmd.out.PutRope["cmosB design created\n"]; END; Load: Commander.CommandProc = BEGIN cmd.out.PutRope["cmosB loaded\n"]; END; Init: PROC [] = BEGIN 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 Gates32", "4 TimesRoman8", "4 Helvetica8I", "4 Helvetica8", "2 TimesRoman8", "2 Helvetica8I", "2 Helvetica8"]; MakeComm[$SetLayerComment, SetLayerComment]; MakeComm[$SetLayerNWell, SetLayerNWell]; MakeComm[$SetLayerNDif, SetLayerDif]; MakeComm[$SetLayerPol, SetLayerPol]; MakeComm[$SetLayerMet, SetLayerMet]; MakeComm[$SetLayerMet2, SetLayerMet2]; MakeComm[$SetLayerPDif, SetLayerPDif]; MakeComm[$SetLayerNWCnt, SetLayerNWCnt]; MakeComm[$SetLayerPWCnt, SetLayerPWCnt]; 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[$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[$DrawNDifShortCon, CreateDiffShortCont, doQueueAndMark]; MakeComm[$DrawWNDifShortCon, CreateDiffShortCont, doQueueAndMark]; MakeComm[$DrawPDifShortCon, CreateDiffShortCont, doQueueAndMark]; MakeComm[$DrawWPDifShortCon, CreateDiffShortCont, doQueueAndMark]; MakeComm[$DrawMm2Con, CreateVia, doQueueAndMark]; MakeComm[$DrawLVia, CreateLargeVia, doQueueAndMark]; Commander.Register[ key: "///Commands/CDNewCMosB", proc: NewCWorld, doc: "Creates new CMosB design" ]; Commander.Register[ key: "///Commands/CDCMosB", proc: Load, doc: "loads CMosB ChipNDale" ]; CDPanelFonts.ImplementIt[tech: CMosB.cmosB, installCommands: TRUE, layerProc: CommentLayer, defaultFonts: fontNames]; Commander.Register[ key: "///Commands/CDCMos", proc: Load, doc: "loads CMosB ChipNDale" ]; Commander.Register[ key: "///Commands/CDNewCMos", proc: NewCWorld, doc: "Creates new CMosB design" ]; END; CommentLayer: PROC [CD.Layer] RETURNS [CD.Layer] = BEGIN RETURN [CD.commentLayer]; END; Init[]; END.  CMosBCommands.mesa (part of ChipNDale) Copyright c 1983, 1986 by Xerox Corporation. All rights reserved. by Christian Jacobi, June 24, 1983 5:03 pm last edited Christian Jacobi, March 31, 1986 4:08:21 pm PST Last Edited by: Jacobi June 6, 1986 4:22:18 pm PDT --for compatibility Κ Ϋ˜codešœ'™'Kšœ Οmœ7™BKšœ+™+Kšœ;™;K™2—K˜šΟk ˜ Kšžœ˜K˜Kšœ ˜ Kšœ˜Kšœ ˜ Kšœ ˜ Kšœ ˜ Kšœ žœ˜(K˜K˜K˜ K˜—K˜šΠbl œžœžœ˜Kšžœk˜r—Kšž˜K˜Kšœžœ˜!K˜šΟn œžœ˜.Kšž˜Kšœžœ˜Kšœžœ˜Kšœžœ!˜)Kšœ+˜+šžœ ž˜Kšœ!˜!Kšœ#˜#Kšœ!˜!Kšœ#˜#Kšžœ˜—Kšœ4˜4KšœS˜Sšžœžœž˜Kšœ"˜"—šž˜K˜U—Kšžœ˜K˜—š  œžœ˜/Kšž˜Kšœžœ˜Kšœžœ˜Kšœ-˜-šžœ ž˜Kšœ&˜&Kšœ(˜(Kšœ&˜&Kšœ(˜(Kšžœ˜—Kšœ4˜4KšœV˜Všžœžœž˜Kšœ"˜"—šž˜K˜U—Kšžœ˜K˜—š  œžœ˜.Kšž˜Kšœžœ˜Kšœžœ˜Kšœ(˜(šžœ ž˜Kšœ#˜#Kšœ%˜%Kšœ#˜#Kšœ%˜%Kšœ!˜!Kšœ)˜)Kšœ)˜)Kšžœ˜—Kšœ4˜4KšœY˜Yšžœžœž˜Kšœ"˜"—šž˜K˜U—Kšžœ˜K˜—š œžœ˜3Kšž˜Kšœžœ˜Kšœžœ˜Kšœ.˜.šžœ ž˜Kšœ$˜$Kšœ&˜&Kšœ$˜$Kšœ&˜&Kšœ"˜"Kšœ*˜*Kšœ*˜*Kšžœ˜—Kšœ4˜4Kšœ^˜^šžœžœž˜Kšœ"˜"—šž˜K˜U—Kšžœ˜K˜—š œžœ˜7Kšž˜Kšœžœ˜Kšœžœ˜Kšœ3˜3šžœ ž˜Kšœ(˜(Kšœ*˜*Kšœ(˜(Kšœ*˜*Kšžœ˜—Kšœ4˜4Kšœ[˜[šžœžœž˜Kšœ"˜"—šž˜K˜U—Kšžœ˜K˜—š  œžœ˜-Kšž˜Kšœžœ˜Kšœ%˜%KšœL˜Lšžœžœž˜Kšœ"˜"—šž˜K˜U—Kšžœ˜K˜—š œžœ˜2Kšž˜Kšœžœ˜Kšœ+˜+KšœQ˜Qšžœžœž˜Kšœ"˜"—šž˜K˜U—Kšžœ˜K˜—š œžœ˜3Kšž˜Kšœ.˜.Kšœ&žœ˜7Kšžœ˜K˜—š  œžœ˜1Kšž˜K˜,Kšœ2˜2Kšžœ˜K˜—š  œžœ˜1Kšž˜K˜,Kšœ3˜3Kšžœ˜K˜—š  œžœ˜/Kšž˜K˜0Kšœ1˜1Kšžœ˜K˜—š  œžœ˜/Kšž˜K˜+Kšœ0˜0Kšžœ˜K˜—š  œžœ˜0Kšž˜K˜.Kšœ1˜1Kšžœ˜K˜—š  œžœ˜/Kšž˜K˜,Kšœ0˜0Kšžœ˜K˜—š  œžœ˜0Kšž˜K˜-Kšœ2˜2Kšžœ˜K˜—š  œžœ˜1Kšž˜K˜1Kšœ6˜6Kšžœ˜K˜—š  œžœ˜1Kšž˜K˜1Kšœ6˜6Kšžœ˜K˜—š  œžœ˜0Kšž˜Kšœžœ,˜5K˜3šžœž˜KšœA˜AKšœJ˜JKšžœ'˜.—K˜Kšžœ˜K˜—š  œžœ˜0Kšž˜Kšœžœ,˜5K˜3šžœž˜Kšœ@˜@KšœA˜AKšœJ˜JKšžœ'˜.—K˜Kšžœ˜—K˜š  œ˜#Kšž˜Kšœžœ*˜4K˜#Kšœ*˜*Kšžœ˜—K˜š œ˜Kšž˜Kšœ"˜"Kšžœ˜—K˜š œžœ˜Kšž˜š œžœžœF˜_Kšœ6˜6Kšœ˜—K˜Kš œ žœžœžœžœr˜•Kšœ,˜,Kšœ(˜(Kšœ%˜%Kšœ$˜$Kšœ$˜$Kšœ&˜&Kšœ&˜&Kšœ(˜(Kšœ(˜(K˜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˜Kšœ9˜9Kšœ:˜:Kšœ9˜9Kšœ:˜:Kšœ8˜8Kšœ:˜:Kšœ:˜:K˜KšœA˜AKšœB˜BKšœA˜AKšœB˜BK˜Kšœ1˜1Kšœ4˜4K˜šœ˜K˜K˜K˜Kšœ˜—šœ˜K˜K˜ K˜Kšœ˜—Kšœ=žœ4˜ušœ™šœ˜K˜K˜ K˜Kšœ˜—šœ˜K˜K˜K˜Kšœ˜——Kšžœ˜—K˜š   œžœžœžœžœ ˜2Kšž˜Kšžœ˜Kšžœ˜—K˜K˜Kšžœ˜K˜—…—'ξ2ι