DIRECTORY CD, CDEvents, CDExtras, CDOps, CDPanel, CDProperties, CDSequencer, CDTechnology, CDViewer, CMos, Commander USING [CommandProc, Register], Convert, FS, GraphicsColor, IO, Rope, TerminalIO, TokenIO, UserProfile, ViewerOps; CMosImpl: CEDAR PROGRAM IMPORTS CD, CDEvents, CDExtras, CDOps, CDPanel, CDProperties, CDSequencer, CDTechnology, CDViewer, Commander, Convert, IO, FS, Rope, TerminalIO, TokenIO, UserProfile, ViewerOps EXPORTS CMos = BEGIN s1: CARDINAL = 1; s2: CARDINAL = 16; s3: CARDINAL = 16*16; s4: CARDINAL = 16*16*16; ss: CARDINAL = s1+s2+s3+s4; sf: CARDINAL = s1+s3; green: CARDINAL = 1; blue: CARDINAL = 2; red: CARDINAL = 4; yellow: CARDINAL = 14; cut: PUBLIC CD.Level; pol: PUBLIC CD.Level; ndif: PUBLIC CD.Level; met: PUBLIC CD.Level; imp: PUBLIC CD.Level; ovg: PUBLIC CD.Level; bur: PUBLIC CD.Level; snerd: PUBLIC CD.Level; pdif: PUBLIC CD.Level; pwelCont: PUBLIC CD.Level; met2: PUBLIC CD.Level; pwel: PUBLIC CD.Level; nwel: PUBLIC CD.Level; nwelCont: PUBLIC CD.Level; NOcOL: PUBLIC CD.Level; cut2: PUBLIC CD.Level; CurrentDiffusion: PUBLIC PROC [design: CD.Design] RETURNS [CD.Level] = BEGIN lev: CD.Level _ CDPanel.FetchDefaultLevel[design]; IF lev=ndif OR lev=pdif OR lev=pwelCont OR lev=nwelCont THEN RETURN [lev] ELSE RETURN [CD.combined] END; CifName: PROC [lev: CD.Level, name: Rope.ROPE] = BEGIN CDProperties.PutPropOnLevel[onto: lev, prop: $CDxCIFName, val: name] END; SetLevelNWell: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["NWell for default\n"]; CDPanel.StoreDefaultLevel[comm.design, nwel] END; SetLevelDif: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["diffusion for default\n"]; CDPanel.StoreDefaultLevel[comm.design, ndif] END; SetLevelPol: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["poly for default\n"]; CDPanel.StoreDefaultLevel[comm.design, pol] END; SetLevelMet2: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["metal-2 for default\n"]; CDPanel.StoreDefaultLevel[comm.design, met2] END; SetLevelMet: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["metal for default\n"]; CDPanel.StoreDefaultLevel[comm.design, met] END; SetLevelPDif: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["p-diff for default\n"]; CDPanel.StoreDefaultLevel[comm.design, pdif] END; SetLevelNWCnt: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["N-Well Cnt for default\n"]; CDPanel.StoreDefaultLevel[comm.design, nwelCont] END; SetLevelPWCnt: PROC [comm: CDSequencer.Command] = BEGIN TerminalIO.WriteRope["P-Well Cnt for default\n"]; CDPanel.StoreDefaultLevel[comm.design, pwelCont] END; RegisterObjectType: PUBLIC PROC [a: ATOM] RETURNS [REF CD.ObjectProcs] = BEGIN RETURN [ CD.RegisterObjectType[a, cmos] ]; END; NewCWorld: Commander.CommandProc = BEGIN design: CD.Design _ CDOps.CreateDesign[cmos]; [] _ CDViewer.CreateViewer[design]; END; WriteTechnologyKey: CDEvents.EventProc = BEGIN TokenIO.WriteAtom[$CMos]; TokenIO.WriteInt[1]; END; ReadTechnologyKey: CDEvents.EventProc = BEGIN dont_TRUE; IF TokenIO.ReadAtom[]=$CMos THEN { version: INT = TokenIO.ReadInt[]; IF version=1 THEN dont_FALSE ELSE IF version=0 THEN { TerminalIO.WriteRope["***********************\n"]; TerminalIO.WriteRope["WARNING: objects using p-diffusion\n"]; TerminalIO.WriteRope["may be displaced; chat with Christian\n"]; TerminalIO.WriteRope["***********************\n"]; dont_FALSE }; }; IF dont THEN TerminalIO.WriteRope["CMos version miss-match\n"]; END; cmos: PUBLIC CD.Technology; Init4BitBricks: PROC [] = BEGIN CDTechnology.TeachColor[cut, 4, [7*ss, 11*ss, 7*ss, 11*ss]]; CDTechnology.TeachColor[ndif, 4, CDTechnology.Brick4[green]]; CDTechnology.TeachColor[pdif, 4, [1*ss, 3*ss, 1*ss, 1*ss]]; CDTechnology.TeachColor[pwelCont, 4, [1*ss, 1*ss, 0*ss, 1*ss]]; CDTechnology.TeachColor[nwelCont, 4, [1*ss, 1*ss, 2*ss, 1*ss]]; CDTechnology.TeachColor[pol, 4, CDTechnology.Brick4[red]]; CDTechnology.TeachColor[met, 4, CDTechnology.Brick4[blue]]; CDTechnology.TeachColor[imp, 4, CDTechnology.Brick4[yellow, 8800H]]; CDTechnology.TeachColor[met2, 4, [2*(s1+s2+s3), 2*ss, 2*(s1+s2+s3)+15*s4, 2*ss]]; CDTechnology.TeachColor[nwel, 4, [8*s1, 0, 0, 0]]; CDTechnology.TeachColor[bur, 4, [11*ss, 11*ss, 11*ss, 11*ss]]; CDTechnology.TeachColor[ovg, 4, [8*ss, 8*ss, 8*ss, 8*ss]]; CDTechnology.TeachColor[snerd, 4, [12345, 7865, 543, 0]]; CDTechnology.TeachColor[snerd, 4, [12345, 7865, 543, 0]]; CDTechnology.TeachColor[cut2, 4, [3*ss, 14*ss, 3*ss, 14*ss]]; CDTechnology.TeachColor[pwel, 4, [4*s1, 0, 0, 0]]; END; tipTable: Rope.ROPE _ NIL; NoteProfileChange: UserProfile.ProfileChangedProc = BEGIN newTipTable: Rope.ROPE _ UserProfile.Token[ key: "Chipndale.CMos.TIPTable", default: "ChipndaleCMos.TIP" ]; IF ~Rope.Equal[tipTable, newTipTable] THEN { CDTechnology.SetTipTable[cmos, newTipTable]; tipTable _ newTipTable } END; Init: PROC [] = BEGIN TerminalIO.WriteRope["cmos impl\n"]; cmos _ CD.RegisterTechnology[$cmos, "cmos"]; IF cmos=NIL THEN ERROR; cut _ CD.NewLevel[cmos, $cut]; pol _ CD.NewLevel[cmos, $pol]; ndif _ CD.NewLevel[cmos, $ndif]; met _ CD.NewLevel[cmos, $met]; imp _ CD.NewLevel[cmos, $imp]; ovg _ CD.NewLevel[cmos, $ovg]; bur _ CD.NewLevel[cmos, $bur]; snerd _ CD.NewLevel[cmos, $snerd]; pdif _ CD.NewLevel[cmos, $pdif]; pwelCont _ CD.NewLevel[cmos, $pwelCont]; met2 _ CD.NewLevel[cmos, $met2]; pwel _ CD.NewLevel[cmos, $pwel]; nwel _ CD.NewLevel[cmos, $nwel]; nwelCont _ CD.NewLevel[cmos, $nwelCont]; NOcOL _ CD.NewLevel[cmos, $NOcOL]; cut2 _ CD.NewLevel[cmos, $cut2]; UserProfile.CallWhenProfileChanges[NoteProfileChange]; CDTechnology.TeachColor[cut, 1, [7*ss, 11*ss, 7*ss, 11*ss]]; CDTechnology.TeachColor[cut, 8, [7*sf, 11*sf, 7*sf, 11*sf]]; CDTechnology.TeachColor[ndif, 1, [4*ss, ss, 4*ss, ss]]; CDTechnology.TeachColor[ndif, 8, CDTechnology.Brick8[green]]; CDTechnology.TeachColor[pdif, 1, [5*ss, ss, 4*ss, ss]]; CDTechnology.TeachColor[pdif, 8, [1*sf, 3*sf, 1*sf, 1*sf]]; CDTechnology.TeachColor[pwelCont, 1, [0*ss, ss, 4*ss, ss]]; CDTechnology.TeachColor[pwelCont, 8, [1*sf, 1*sf, 0*sf, 1*sf]]; CDTechnology.TeachColor[nwelCont, 1, [2*ss, ss, 4*ss, ss]]; CDTechnology.TeachColor[nwelCont, 8, [1*sf, 1*sf, 2*sf, 1*sf]]; CDTechnology.TeachColor[pol, 1, [8*ss, 4*ss, 2*ss, 1*ss]]; CDTechnology.TeachColor[pol, 8, CDTechnology.Brick8[red]]; CDTechnology.TeachColor[met, 1, [8*ss, 2*ss, 0, 0]]; CDTechnology.TeachColor[met, 8, CDTechnology.Brick8[blue]]; CDTechnology.TeachColor[imp, 1, [2*ss, 0, 2*ss, 0]]; CDTechnology.TeachColor[imp, 8, [14, 14, 0, 0]]; CDTechnology.TeachColor[met2, 1, [8*ss, 8*ss, 2*ss, 2*ss]]; CDTechnology.TeachColor[met2, 8, [2*sf, 29*sf, 2*sf, 37*sf]]; CDTechnology.TeachColor[nwel, 1, [4*ss, 0, 0, 0]]; CDTechnology.TeachColor[nwel, 8, [8*s1, 0, 0, 0]]; CDTechnology.TeachColor[bur, 1, [4*ss, 14*ss, 4*ss, 0*ss]]; CDTechnology.TeachColor[bur, 8, [11*sf, 11*sf, 11*sf, 11*sf]]; CDTechnology.TeachColor[ovg, 1, [4*ss, 14*ss, 4*ss, 0*ss]]; CDTechnology.TeachColor[ovg, 8, [8*sf, 8*sf, 8*sf, 8*sf]]; CDTechnology.TeachColor[snerd, 1, [12345, 7865, 543, 0]]; CDTechnology.TeachColor[snerd, 8, [12345, 7865, 543, 0]]; CDTechnology.TeachColor[snerd, 1, [12345, 7865, 543, 0]]; CDTechnology.TeachColor[snerd, 8, [12345, 7865, 543, 0]]; CDTechnology.TeachColor[cut2, 1, [3*ss, 14*ss, 3*ss, 14*ss]]; CDTechnology.TeachColor[cut2, 8, [2*ss, 10*ss, 4*ss, 5*ss]]; CDTechnology.TeachColor[pwel, 1, [2*ss, 0, 0, 0]]; CDTechnology.TeachColor[pwel, 8, [4*s1, 0, 0, 0]]; Init4BitBricks[]; CifName[cut, "$NC"]; CifName[ndif, "$N"]; CifName[pol, "$NP"]; CifName[met, "$NM"]; CifName[imp, "$NI"]; CifName[nwel, "$Y"]; CifName[ovg, "$NG"]; CifName[bur, "$NB"]; CifName[snerd, "$U"]; CifName[nwelCont, "$W"]; CifName[NOcOL, "$X"]; CifName[met2, "$NM2"]; CifName[cut2, "$NC2"]; CifName[pdif, "$Q"]; CifName[pwelCont, "$$V"]; CifName[pwel, "$NX"]; CDPanel.DefineLevelEntry[cmos, ndif, "ndif", 0, 2*CD.lambda]; CDPanel.DefineLevelEntry[cmos, pdif, "pdif", 0, 2*CD.lambda]; CDPanel.DefineLevelEntry[cmos, pwelCont, "p-wCnt", 0, 0]; CDPanel.DefineLevelEntry[cmos, nwelCont, "n-wCnt", 0, 0]; CDPanel.DefineLevelEntry[cmos, pol, "pol", 0, 2*CD.lambda]; CDPanel.DefineLevelEntry[cmos, met, "met", 0, 3*CD.lambda]; CDPanel.DefineLevelEntry[cmos, cut, "cut", 0, 0]; CDPanel.DefineLevelEntry[cmos, met2, "met2", 0, 3*CD.lambda]; CDPanel.DefineLevelEntry[cmos, cut2, "cut2", 0, 0]; CDPanel.DefineLevelEntry[cmos, ovg, "ovg", 0, 0]; CDPanel.DefineLevelEntry[cmos, nwel, "nwel", 0, 0]; CDPanel.DefineLevelEntry[cmos, bur, "bur", 0, 0]; CDPanel.DefineIntEntry[cdValueKey: $CDxSelectNewMode, tech: cmos, text: "select new:", min: 0, max: 1, default: 1]; CDPanel.DefineNewLine[cmos]; CDPanel.DefineIntEntry[cdValueKey: $CDxStepValue, tech: cmos, text: "step moves size:", min: 1, default: 1]; CDPanel.DefineIntEntry[cdValueKey: $CDxStretchyMove, tech: cmos, text: " stretchy:", min: 0, max: 1, default: 0]; CDPanel.DefineNewLine[cmos]; CDSequencer.ImplementCommand[$SetLayerNWell, SetLevelNWell, cmos]; CDSequencer.ImplementCommand[$SetLayerNDif, SetLevelDif, cmos]; CDSequencer.ImplementCommand[$SetLayerPol, SetLevelPol, cmos]; CDSequencer.ImplementCommand[$SetLayerMet, SetLevelMet, cmos]; CDSequencer.ImplementCommand[$SetLayerMet2, SetLevelMet2, cmos]; CDSequencer.ImplementCommand[$SetLayerPDif, SetLevelPDif, cmos]; CDSequencer.ImplementCommand[$SetLayerNWCnt, SetLevelNWCnt, cmos]; CDSequencer.ImplementCommand[$SetLayerPWCnt, SetLevelPWCnt, cmos]; CDEvents.RegisterEventProc[$WriteTechnologyPrivate, WriteTechnologyKey, cmos]; CDEvents.RegisterEventProc[$ReadTechnologyPrivate, ReadTechnologyKey, cmos]; BEGIN patNo: INT _ UserProfile.Number[key: "Chipndale.ChipmonkColorPatternNum", default: 0]; IF patNo=0 THEN patNo _ UserProfile.Number[key: "Chipndale.CMos.ChipmonkColorPatternNum", default: 0]; IF patNo#0 THEN {ReadCMPatterns[]; SetChipmonkPatterns[patNo]} END; Commander.Register[ key: "CDNewCmos", proc: NewCWorld, doc: "Creates new cmos design" ]; Commander.Register[ key: "CDCMosPatterns", proc: CMPatterns, doc: "Read chipndale color patterns" ]; Commander.Register[ key: "CDPatterns", proc: CMPatterns, doc: "Read chipndale color patterns" ]; END; level: TYPE = [0..15]; colPatNum: CARDINAL=8; colPatRead: CARDINAL_0; colPatternTabs: ARRAY [0..colPatNum) OF ARRAY level OF CARDINAL; colPatternBits: ARRAY [0..colPatNum) OF CARDINAL; orLTab: ARRAY level OF CARDINAL _ [11B, 1, 4, 2, 76B, 8, 33B, 10, 9, 1, 10, 62B, 10, 8, 10, 10]; SetChipmonkPatterns: PROC [i: INT] = BEGIN fileLevel: ARRAY level OF CD.Level = [ cut, ndif, pol, met, imp, ovg, bur, snerd, cut2, pdif, pwelCont, met2, pwel, nwel, nwelCont, NOcOL]; IF i<0 THEN { FOR j: NAT IN [0..colPatRead) DO IF colPatternBits[j]=(-i) THEN {i_j; EXIT} ENDLOOP }; IF i>=2 AND i EXIT].token; IF Rope.IsEmpty[token] THEN EXIT; IF Rope.Fetch[token, 0] IN ['0..'9] THEN { patNum _ Convert.IntFromRope[token ! Convert.Error => EXIT]; } ELSE patFile _ CDExtras.AppendExt[token, "CDColorPatterns"]; ENDLOOP; IF colPatRead=0 OR NOT Rope.IsEmpty[patFile] THEN ReadCMPatterns[patFile]; IF patNum<0 THEN { TerminalIO.WriteRope["pattern no [0.."]; TerminalIO.WriteInt[colPatRead+1]; TerminalIO.WriteRope["] > "]; patNum _ TerminalIO.RequestInt["" ! TerminalIO.UserAbort => GOTO UserAbort]; }; SetChipmonkPatterns[patNum] EXITS UserAbort => {NULL}; END; ReadCMPatterns: PROC[fileName: Rope.ROPE _ NIL] = BEGIN binfile: IO.STREAM; k, i, lv: CARDINAL; GetByte: PROC [] RETURNS[c: [0..255]] = INLINE { c _ LOOPHOLE[IO.GetChar[binfile], [0..255]]; }; Get2Bytes: PROC [] RETURNS [c: CARDINAL] = INLINE { h: [0..255] = GetByte[]; c _ h*256+GetByte[]; }; IF Rope.IsEmpty[fileName] THEN fileName _ UserProfile.Token[ key: "Chipndale.ChipmonkColorPatterns", default: "default.CDColorPatterns" ]; fileName _ CDExtras.AppendExt[fileName, "CDColorPatterns"]; binfile _ FS.StreamOpen[fileName ! FS.Error => IF error.group # bug THEN { TerminalIO.WriteRope[fileName]; TerminalIO.WriteRope[" not opened: "]; TerminalIO.WriteRope[error.explanation]; TerminalIO.WriteLn[]; GOTO FileName }]; k _ MIN[colPatNum, Get2Bytes[]]; colPatRead _ 0; FOR i IN [0..k) DO colPatternBits[i]_Get2Bytes[]; FOR lv IN level DO colPatternTabs[i][lv]_Get2Bytes[]; ENDLOOP; ENDLOOP; colPatRead_k; IO.Close[binfile]; EXITS FileName => {NULL}; END; --xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Init[]; END. 4CMosImpl.mesa by Ch. Jacobi August 11, 1983 3:56 pm last edited Christian Jacobi February 16, 1984 2:38 pm --4bit colors-- -- PROC [reason: ProfileChangeReason] --xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx backgroundGray _ GetColorGray[background]; whiteGray _ GetColorGray[white]; ΚΦ˜Jšœ ™ J˜Jšœ'™'Jšœ8™8J˜šΟk ˜ Jšœ˜J˜ Jšœ ˜ Jšœ˜J˜J˜ J˜ J˜ J˜ Jšœ˜Jšœ œ˜(Jšœ˜Jšœ˜J˜Jšœ˜Jšœ˜Jšœ ˜ J˜Jšœ ˜ Jšœ ˜ —J˜JšΟnœœ˜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šœœœ˜Jšœ œœ˜Jšœœœ˜Jšœœœ˜Jšœœœ˜Jšœ œœ˜Jšœœœ˜Jšœœœ˜J˜—š žœ œ œ œœ ˜FJš˜Jšœœ+˜2Jšœ œ œœœœœœœ ˜cJšœ˜—J˜šžœœ#˜0Jš˜JšœD˜DJšœ˜J˜—šž œœ˜1Jš˜J˜,Jšœ,˜,Jšœ˜J˜—šž œœ˜/Jš˜J˜0J˜,Jšœ˜J˜—šž œœ˜/Jš˜J˜+J˜+Jšœ˜J˜—šž œœ˜0Jš˜J˜.J˜,Jšœ˜J˜—šž œœ˜/Jš˜J˜,J˜+Jšœ˜J˜—šž œœ˜0Jš˜J˜-J˜,Jšœ˜J˜—šž œœ˜1Jš˜J˜1Jšœ0˜0Jšœ˜J˜—šž œœ˜1Jš˜J˜1Jšœ0˜0Jšœ˜J˜—šžœœœœœœœ˜HJš˜Jšœœ˜*Jšœ˜J˜—šž œ˜#Jš˜Jšœœ#˜-J˜#Jšœ˜J˜—šΟbœ˜(Jš˜Jšœ˜Jšœ˜šœ˜J˜——šŸœ˜'Jš˜Jšœœ˜ šœœ˜#Jšœ œ˜!Jšœ œ˜šœœ œ˜Jšœ2˜2Jšœ=˜=Jšœ@˜@Jšœ2˜2Jšœ˜ Jšœ˜—J˜—Jšœœ3˜?Jšœ˜—J˜Jšœœœ ˜J˜šžœœ˜Jš˜Jšœ<˜˜>Jšœ:˜:Jšœ9˜9Jšœ9˜9Jšœ=˜=Jšœ2˜2Jšœ˜—J˜Jšœœœ˜J˜šŸœ"˜3Jšœœ™%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šœœ˜ Jšœœ˜ Jšœ œ˜(Jšœœ˜"Jšœœ˜ J˜Jšœ6˜6J˜Jšœ<˜˜>J˜Jšœ;˜;Jšœ:˜:J˜Jšœ9˜9Jšœ9˜9J˜Jšœ9˜9Jšœ9˜9J˜Jšœ=˜=Jšœ<˜˜>Jšœ>˜>J˜@Jšœ@˜@JšœB˜BJšœB˜BJ˜JšœN˜NJšœL˜L˜Jš˜JšœœL˜VJšœ œW˜fJšœ œ/˜>Jšœ˜—J˜šœ˜J˜J˜˜Jšœ˜——šœ˜J˜Jšœ˜˜$Jšœ˜——šœ˜J˜Jšœ˜˜$Jšœ˜——Jšœ˜—J˜Jšœ:™:˜J™*J™!Jšœœ ˜Jšœ œ˜Jšœ œ˜Jš œœœœœœ˜@Jšœœœœ˜1JšœœœœA˜`J˜—šžœœœ˜$Jš˜šœ œœœ ˜&Icodešœ˜Kšœ˜Kšœ˜Kšœ˜—šœœ˜ šœœœ˜ Kšœœœ˜*Kš˜—K˜—šœœ˜šœ œ ˜JšœD˜DJš˜——šœœ˜šœ œ ˜Jšœ8˜8Jš˜——Jšœœœ˜!Jšœ/œ˜;šœ;œœ˜LJšœœ'˜CJšœ˜—Jšœ˜—J˜šŸ œ˜#Jš˜Jšœœ˜Jšœœœ˜Jš œœœœœ˜'š˜Jš œ œœœœ˜EJšœœœ˜!šœœ œ˜*Jšœ6œ˜