DIRECTORY CD, NMosContacts, NMosTransistors, CDOps, CDSequencer, CDPanel, CDValue, TerminalIO, NMos; NMosTransistorCommands: CEDAR PROGRAM IMPORTS CD, CDOps, CDSequencer, CDPanel, CDValue, TerminalIO, NMosContacts, NMosTransistors, NMos = BEGIN lambda: CD.Number = NMos.lambda; Implant: TYPE = NMosTransistors.Implant; CreateTransistorComm: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; TerminalIO.PutRope["create transistor\n"]; ob _ NMosTransistors.CreateTransistor[ w: CDValue.FetchInt[comm.design, $NMosTransistorW, technology]*lambda, l: CDValue.FetchInt[comm.design, $NMosTransistorL, technology]*lambda, implant: GetImplant[comm.design] ]; [] _ CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos] END; CreateATransistorComm: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; TerminalIO.PutRope["Create angle transistor\n"]; ob _ NMosTransistors.CreateAngleTransistor[ w: CDValue.FetchInt[comm.design, $NMosTransistorW, technology]*lambda, l: CDValue.FetchInt[comm.design, $NMosTransistorL, technology]*lambda, implant: GetImplant[comm.design] ]; [] _ CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos] END; CreatePullUpComm: PROC [comm: CDSequencer.Command] = BEGIN ob: CD.Object; TerminalIO.PutRope["Create Pullup\n"]; ob _ NMosTransistors.CreatePullUp[ w: CDValue.FetchInt[comm.design, $NMosPullUpW, technology]*lambda, l: CDValue.FetchInt[comm.design, $NMosPullUpH, technology]*lambda ]; [] _ CDOps.IncludeObjectI[design: comm.design, ob: ob, location: comm.pos] END; ChangeExtComm: PROC [comm: CDSequencer.Command] = { inst: CD.Instance _ CDOps.TheInstance[comm.design, "change extension"]; IF inst#NIL THEN { new: CD.Object _ NIL; wex: INT _ CDValue.FetchInt[comm.design, $NMosWEx, technology]; lex: INT _ CDValue.FetchInt[comm.design, $NMosLEx, technology]; WITH inst.ob.specific SELECT FROM tp: NMosTransistors.TransistorPtr => { new _ NMosTransistors.CreateTransistor[ w: tp.width, l: tp.length, wExt: wex, lExt: lex ]; }; cp: NMosContacts.ContactPtr => { sz: CD.Position _ CD.InterestSize[inst.ob]; new _ NMosContacts.CreateBurCon[ w: sz.x+2*(wex-cp.wExt), l: sz.y+2*(lex-cp.lExt), wex: wex, lex: lex ]; }; ENDCASE => NULL; IF new=NIL THEN TerminalIO.PutRope["failed\n"] ELSE { CDOps.RedrawInstance[comm.design, inst, TRUE]; inst.ob _ new; CDOps.RedrawInstance[comm.design, inst, FALSE]; }; }; }; GetImplant: PROC [design: CD.Design] RETURNS [implant: Implant]= BEGIN impLayer: INT = CDValue.FetchInt[design, $NMosTransistorImplant, technology]; impCrazy: INT = CDValue.FetchInt[design, $NMosImplantCrazy, technology]; IF impCrazy=1 THEN { IF impLayer=1 THEN { TerminalIO.PutRope[" Creates weak depletion transistor\n"]; implant _ NMosTransistors.weakDepletion } ELSE { TerminalIO.PutRope[" Creates zero treshold transistor\n"]; implant _ NMosTransistors.zeroTresh; } } ELSE { IF impLayer=1 THEN implant _ NMosTransistors.strongDepletion ELSE implant _ NMosTransistors.enhancement } END; ImplCommands: PROC [] = BEGIN CDSequencer.ImplementCommand[$DrawNXstr, CreateTransistorComm, NMos.nmos]; CDValue.RegisterKey[$NMosTransistorW, NMos.nmos, $nmos]; CDValue.RegisterKey[$NMosTransistorL, NMos.nmos, $nmos]; CDValue.RegisterKey[$NMosTransistorImplant, NMos.nmos, $nmos]; CDValue.RegisterKey[$NMosImplantCrazy, NMos.nmos, $nmos]; CDValue.RegisterKey[$NMosWEx, NMos.nmos, $nmos]; CDValue.RegisterKey[$NMosLEx, NMos.nmos, $nmos]; CDPanel.Number[number: [cdValueKey: $NMosTransistorW], tech: NMos.nmos, button: [text: "Transistor width:"], min: 1, default: 2]; CDPanel.Number[number: [cdValueKey: $NMosTransistorL], tech: NMos.nmos, button: [text: "length:"], min: 1, default: 2]; CDPanel.Number[number: [cdValueKey: $NMosTransistorImplant], tech: NMos.nmos, button: [text: "implant:"], min: 0, max: 1, default: 0]; CDPanel.Number[number: [cdValueKey: $NMosImplantCrazy], tech: NMos.nmos, button: [text: "weak:"], min: 0, max: 1, default: 0]; CDPanel.Line[NMos.nmos]; CDSequencer.ImplementCommand[$DrawAngleNXstr, CreateATransistorComm, NMos.nmos]; CDSequencer.ImplementCommand[$DrawPullup, CreatePullUpComm, NMos.nmos]; CDValue.RegisterKey[$NMosPullUpW, NMos.nmos]; CDValue.RegisterKey[$NMosPullUpH, NMos.nmos]; CDPanel.Number[number: [cdValueKey: $NMosPullUpW], tech: NMos.nmos, button: [text: "PullUp width:"], min: 1, default: 2]; CDPanel.Number[number: [cdValueKey: $NMosPullUpH], tech: NMos.nmos, button: [text: "height:"], min: 1, default: 3]; CDPanel.Line[NMos.nmos]; CDPanel.Number[number: [cdValueKey: $NMosWEx], tech: NMos.nmos, button: [text: "extension comm: W:"], min: 0, default: 2, lambda: NMos.lambda]; CDPanel.Number[number: [cdValueKey: $NMosLEx], tech: NMos.nmos, button: [text: " L:"], min: 0, default: 2, lambda: NMos.lambda]; CDPanel.Line[NMos.nmos]; CDSequencer.ImplementCommand[$ChangeExt, ChangeExtComm, NMos.nmos]; END; ImplCommands[]; END. ώNMosTransistorCommands.mesa (part of ChipNDale) Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. Created by: Christian Jacobi, June 24, 1983 5:03 pm Last edited by: Christian Jacobi, October 31, 1986 1:39:43 pm PST --is talky Κh˜šœ0™0Jšœ Οmœ7™BJšœ5™5Icode™A—J˜šΟk ˜ Jšžœ˜J˜ J˜J˜J˜ J˜J˜J˜ J˜J˜—šΟbœžœžœ˜&Jšžœ]˜d—Jšž˜J˜Jšœžœ˜ Jšœ žœ˜(J˜šΟnœžœ˜8Jšž˜Jšœžœ˜J˜*˜&J˜FJ˜FJšœ ˜ J˜—J˜JJšžœ˜J˜—š œžœ˜9Jšž˜Jšœžœ˜J˜0˜+J˜FJ˜FJšœ ˜ J˜—J˜JJšžœ˜J˜—š œžœ˜4Jšž˜Jšœžœ˜J˜&˜#J˜BJ˜AJ˜—J˜JJšžœ˜—J˜š  œžœ ˜3Jšœžœ?˜Gšžœžœžœ˜Jšœžœ ž˜Jšœžœ7˜?Jšœžœ7˜?šžœžœž˜!šœ&˜&šœ'˜'Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ˜—J˜—šœ ˜ Jšœ+˜+šœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ˜—J˜—Jšžœžœ˜—Jšžœžœžœ˜.šžœ˜Jšœ(žœ˜.Jšœ˜Jšœ(žœ˜/J˜—J˜—Jšœ˜J˜—š  œžœ žœ žœ˜@Jšœ ™ Jšž˜Jšœ žœ@˜MJšœ žœ;˜Hšžœ žœ˜šžœ žœ˜J˜@Jšœ(˜(J˜—šžœ˜J˜?Jšœ$˜$J˜—J˜—šžœ˜Jšžœ žœ+˜=Jšžœ&˜*J˜—Jšžœ˜—J˜š  œžœ˜Jšž˜J˜JJšœ9˜9Jšœ9˜9Jšœ=žœ˜?Jšœ8žœ˜:Jšœ/žœ˜1Jšœ/žœ˜1J˜šœG˜GJšœ9˜9—šœG˜GJšœ/˜/—šœM˜MJšœ8˜8—šœH˜HJšœ5˜5—Jšœ˜J˜PJ˜GJšœ.˜.Jšœ,žœ˜.šœC˜CJšœ5˜5—šœC˜CJšœ/˜/—Jšœ˜J˜šœ?˜?JšœP˜P—šœ?˜?JšœA˜A—Jšœ˜JšœC˜CJšžœ˜J˜—J˜Jšžœ˜J˜—…—v