DIRECTORY Atom, D2Basic, CD, CDSequencer, CStitching, IO, Rope; CDMEBES: CEDAR DEFINITIONS = BEGIN Meters: TYPE = REAL; Nm: TYPE = D2Basic.Number; -- nanometers NmRect: TYPE = D2Basic.Rect; NmPair: TYPE = D2Basic.Pos; NmPosition: TYPE = D2Basic.Pos; Tad: TYPE = D2Basic.Number; -- units smaller than nanometers TadPair: TYPE = D2Basic.Pos; TadPosition: TYPE = D2Basic.Pos; TadRect: TYPE = D2Basic.Rect; MEBESPixels: TYPE = D2Basic.Number; -- usually 500 or 200 nm MEBESPosition: TYPE = D2Basic.Pos; MEBESRect: TYPE = D2Basic.Rect; Rational: TYPE = RECORD [num, denom: INT _ 1]; ROPE: TYPE = Rope.ROPE; Tesselation: TYPE = CStitching.Tesselation; TessList: TYPE = LIST OF Tesselation; Sense: TYPE = {space, cover}; MEBESMode: TYPE = {oneTwo, extended, reticle}; -- see the Perkin-Elmer spec MaskState: TYPE = REF MaskStateRec; MaskStateRec: TYPE = RECORD [ design: CD.Design, designClip: REF CD.Rect _ NIL, tadsPerNm: INT _ 1, nmPerLambda: INT _ 1000, nmReticleClip: NmRect _ [0,0,0,0], dieOffset: NmPosition _ [0,0], dropInList: LIST OF REF ANY -- DropIn -- _ NIL, viewerArrow: CD.Position _ [0,0], toolingSpec: ToolingSpec _ NIL, derivationSpec: DerivationSpec _ NIL, curMask: DerivationMaskSpec _ NIL, -- for the current mask scale: Rational, -- relating Tads and ChipNDale design units mebesPixelPitch: Nm _ 500, -- for the current mask mode: MEBESMode _ oneTwo, drawCommand: REF DrawRectangle, designStripeClip: CD.Rect _ [0,0,0,0], tadStripeClip: TadRect _ [0,0,0,0], stripe: [0..maxStripes] _ 1, -- 0 is illegal stripeRectCount: INT _ 0, maskSetName: ROPE _ NIL, patternFileNames: LIST OF ROPE _ NIL, -- for the tape header s: IO.STREAM, data: REF _ NIL ]; ToolingSpec: TYPE = Atom.PropList -- .vals are ToolingMaskSpec's -- ; ToolingMaskSpec: TYPE = REF ToolingMaskSpecRec; ToolingPolarity: TYPE = {CL -- clear field --, DK -- dark field --}; ToolingMaskSpecRec: TYPE = RECORD [ maskNo: ROPE, fieldPolarity: ToolingPolarity, addrUnit, skewPerSide, scribeWidth, scribeOffset: Nm, mode: MEBESMode _ reticle ]; DerivationSpec: TYPE = LIST OF REF ANY -- MaskSpec -- ; DerivationMaskSpec: TYPE = REF DerivationMaskSpecRec; DerivationMaskSpecRec: TYPE = RECORD [ maskId: ATOM, cover: CoverSpec, props: Atom.PropList _ NIL]; CoverSpec: TYPE = REF ANY; CDLayer: TYPE = REF CDLayerRec _ NIL; CDLayerRec: TYPE = RECORD [ source: CD.Layer, deltaDiameter: Nm _ 0 -- + means mask feature is bigger than CD.Layer feature ]; DropIn: TYPE = REF DropInRec _ NIL; DropInRec: TYPE = RECORD [ name: ATOM, fileNamePattern: ROPE, -- pattern for IO.PutF pos: NmPosition, clearBackground: BOOL _ TRUE ]; CoverProc: TYPE = PROC [ ms: MaskState, spec: LIST OF REF ANY, extInfluenceDiameter: Tad _ 0 ] RETURNS [ result: Tesselation ]; bytesPerMebesWord: INT = 2; mebesBlockSize: INT = 2048; -- bytes stripeHeight: INT = 256; -- in EBES units maxStripes: INT = 255; maskHeight: INT = maxStripes*stripeHeight; maskWidth: INT = 32768; segmentOrigin: CARDINAL = 1; stripeOrigin: CARDINAL = 1; Mode12StartDrawing: TYPE = MACHINE DEPENDENT RECORD [ nFields (0: 0..7): [0..256) _ 2, addressCode (0: 8..15): Mode12AddressCode _ Nm500, cx (1): CARDINAL[0..maskWidth], -- 0 is illegal cy (2): CARDINAL[0..maskHeight], -- 0 is illegal moDayYr (3): Date, field1Size (6): CARDINAL _ 6, patternFileName (7): PatternFileName, field2Size (13): CARDINAL _ 2, maskInfo (14): PACKED ARRAY [0..4) OF CHAR _ ALL[' ] ]; Mode12AddressCode: TYPE = MACHINE DEPENDENT {Nm500(3), Nm250(6)}; Mode12StartStripe: TYPE = MACHINE DEPENDENT RECORD [ stripeNumber (0: 0..7): [0..maxStripes] _ 1, -- 0 is illegal commandCode (0: 8..15): [0..256) _ 7]; ExtAddrModeStartDrawing: TYPE = MACHINE DEPENDENT RECORD [ nFields (0: 0..7): [0..256) _ 2, commandCode (0: 8..15): [0..256) _ 5, addrUnitHigh (1): CARDINAL, -- expressed as multiple of 2^-28 micrometer addrUnitLow (2): CARDINAL, stripeHeight (3): CARDINAL _ 256, -- stripe height in address units cxHigh (4): CARDINAL _ 0, -- horizontal pattern size in address units cxLow (5): CARDINAL, cyHigh (6): CARDINAL _ 0, -- vertical pattern size in address units cyLow (7): CARDINAL, moDayYr (8): Date, field1Size (11): CARDINAL _ 6, patternFileName (12): PatternFileName, field2Size (18): CARDINAL _ 1 -- +2*#reticle segments ]; SegDirectoryEntry: TYPE = MACHINE DEPENDENT RECORD [ firstBlock (0): CARDINAL _ 1, -- 0 is illegal, block containing start drawing header is 1 firstWordWithinBlock (1): [0..1024] _ 1 -- 0 is illegal ]; ExtAddrModeStartStripe: TYPE = MACHINE DEPENDENT RECORD [ commandCode (0): CARDINAL _ 2, stripeNumber (1): CARDINAL _ 1 -- 0 is illegal ]; StartSegment: TYPE = MACHINE DEPENDENT RECORD [ segmentNumber (0: 0..7): [0..256) _ 1, -- 0 is illegal commandCode (0: 8..15): [0..256) _ 10]; Date: TYPE = PACKED ARRAY [0..6) OF CHAR _ ALL[' ]; PatternFileName: TYPE = PACKED ARRAY [0..12) OF CHAR _ ALL[' ]; DrawRectangle: TYPE = MACHINE DEPENDENT RECORD [ h (0: 0..9): [1..stripeHeight], -- Mesa biases subrange so 1 is represented as 0 commandCode (0: 10..15): [0..64) _ 16, w (1): CARDINAL[0..maskWidth], -- 0 is illegal x (2): CARDINAL[0..maskWidth), unused (3: 0..7): [0..256) _ 0, y (3: 8..15): [0..stripeHeight)]; DrawTrapezoid: TYPE = MACHINE DEPENDENT RECORD [ h (0: 0..9): [1..stripeHeight], -- Mesa biases subrange so 1 is represented as 0 commandCode (0: 10..15): [0..64) _ 20, wLow (1): CARDINAL, -- w=0 is illegal x1Low (2): CARDINAL, deltaX2High (3: 0..5): [0..64), y1 (3: 6..15): [0..1024), deltaX1Low (4): CARDINAL, deltaX2Low (5): CARDINAL, deltaX1High (6: 0..5): [0..64), x1High (6: 6..10): [0..32), wHigh (6:11..15): [0..32) ]; BasicCommand: TYPE = MACHINE DEPENDENT RECORD [commandCode (0): NAT _]; endStripe: BasicCommand = [commandCode: 8]; endRecord: BasicCommand = [commandCode: 9]; endDrawing: BasicCommand = [commandCode: 4]; stripesPerClump: INT; defaultTadsPerNm: INT; wDir: ROPE; abortFlag: REF BOOL; StartMEBESMask: PROC [comm: CDSequencer.Command]; GenerateCover: PROC [ ms: MaskState, spec: CoverSpec, extInfluenceDiameter: Tad _ 0 ] RETURNS [ rects: Tesselation ]; DrawLayersWithPosDeltas: PROC [ms: MaskState, rects: Tesselation, layers: LIST OF CDLayer, extInfluenceDiameter: Nm _ 0]; SendCommand: PROC [ s: IO.STREAM, comm: REF ]; -- for sending geometry to a MEBES file InsertDropIn: PROC [ ms: MaskState, rects: Tesselation, di: DropIn, data: REF ] RETURNS [ newData: REF ]; -- either insert in rects or output directly to ms.s ComplainAt: PROC [ ms: MaskState, pos: TadPosition, explanation: ROPE _ NIL, choice: LIST OF ROPE _ NIL ] RETURNS [ chosen: NAT ]; EBESOpen: PROC [ dest: IO.STREAM, eor: BOOL _ TRUE ] RETURNS [ self: IO.STREAM ]; NewTesselation: PROC [ initValue: REF _ NIL ] RETURNS [ tess: Tesselation ]; DisposeTesselation: PROC [ tess: Tesselation ] RETURNS [ Tesselation ]; ToRope: PROC [ ref: REF ] RETURNS [ rope: ROPE ]; RopeNeeded: SIGNAL [ ref: REF REF ]; ScaleCDToTad: PROC [ ms: MaskState, cdr: CD.Rect ] RETURNS [ tr: TadRect ]; ScaleTadToCD: PROC [ ms: MaskState, tr: TadRect ] RETURNS [ cdr: CD.Rect ]; ScaleRect: PROC [ r: D2Basic.Rect, factor: Rational ] RETURNS [ sr: D2Basic.Rect -- = factor*r -- ]; ScalePoint: PROC [ p: D2Basic.Pos, factor: Rational ] RETURNS [ sp: D2Basic.Pos -- = factor*r -- ]; Bloat: PROC [ r: TadRect, deltaDiameter: Tad ] RETURNS [ br: TadRect ]; TadTooLarge: ERROR; -- if deltaDiameter is not even RatAdd, RatMul: PROC [ r1, r2: Rational ] RETURNS [ Rational ]; RatNeg, RatInv, ReduceRational: PROC [ r: Rational ] RETURNS [ Rational ]; Ceiling: PROC [ r: Rational ] RETURNS [ c: INT ]; GCD: PROC [ m, n: INT ] RETURNS [ INT ]; END. -- of CDMEBES |CDMEBES.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. written by E. McCreight, November 2, 1983 6:03 pm Last Edited by: Jacobi, December 19, 1984 4:21:14 pm PST Hoel, February 27, 1986 11:19:49 am PST McCreight, December 11, 1986 12:38:06 pm PST A package to output a ChipnDale design in MEBES format for a Perkin-Elmer Lithographic System. Files produced herein should conform to the MEBES Mode I/II, extended mode, or reticle mode pattern file format described in the MEBES Software Manual, document A900-0102C, Data Files, document A900-0024D, publication of Perkin-Elmer Electron Beam Technology 3392 Investment Boulevard Hayward, CA 94545 Basic Types This program, alas, uses several different units of measure. One is the CD.Number, which is some fraction of the mythical Lambda. The CD.Number and the Lambda are related by a parameter in the CD.Technology. The ratio between a CD.number and a Nm can be set by the user. Another is the Meter and the Nm (nanometer). These are related in the obvious way. The integer type Nm should be able to carry all measurements. Another is the Tad. This is the smallest measuring quantum, in which every distance and position is expressible as an integer. The corner-stitched Tesselations that are passed among CoverProcs are expressed in Tads. At this writing there is no need for a Tad to be smaller than a Nm, but at some point.... The ratio between a Tad and a Nm can be set by the user. And then there's the MEBESPixel. For reasonable people today, this is 1000 Nm or 500 Nm or 250 Nm, but the MEBES formats permit other sizes. The ratio between a MEBESPixel and a Nm can be set by the user. Maskmaking State Record ChipNDale Rect containing all design geometry the final reticle. Its center is (the scaled center of designClip) - dieOffset. EBES stream where rectangles are to be drawn Mask Set Specifications Cover Specifications (which points on the mask are covered) A CoverSpec is a LIST OF REF ANY, or a CDLayer. If it is a LIST OF REF ANY, it must be among the following forms: LIST[ $NOT, CoverSpec ] LIST[ $AND, CoverSpec1, CoverSpec2, ... ] LIST[ $ANDNOT, CoverSpec1, CoverSpec2 ] LIST[ $OR, CoverSpec1, CoverSpec2, ... ] LIST[ $Enlarge, NEW[Nm _ x], CoverSpec ] .. This enlarges the diameter of every feature in CoverSpec1 by x nm. If x is negative, this enlarges the diameter of every space in CoverSpec1 by -x nm. LIST[ $RestrictedEnlarge, NEW[Nm _ x], CoverSpec1, CoverSpec2 ] .. x>0. This enlarges the radius of every feature in CoverSpec1 by the smaller of x/2 nm and half the distance to the nearest feature in CoverSpec2. LIST[ $DeNotch, NEW[Nm _ x], CoverSpec ] .. x>0. This covers any space in CoverSpec whose smaller dimension is no larger than x. LIST[ $SizeLEq, NEW[Nm _ width], NEW[Nm _ height], CoverSpec ] This filters the features of CoverSpec, keeping only rectangles no larger than width x height, while discarding non-rectangular features and (rectangular) features larger than width x height. LIST[ $MeasureRuns, "Description ROPE", CoverSpec, NEW[Nm _ coverHorizon], NEW[Nm _ coverMinFeature], NEW[Nm _ spaceHorizon], NEW[Nm _ spaceMinFeature] ] .. This is executed for its side effects. It looks for too-small features and spaces, and it hangs a structure on ms.data that is later printed in the log, showing how many micrometers of various-width features and space were found. ... for example, LIST[$OR, NEW[CDLayerRec _ [source: %CMos.ndif, deltaDiameter: 1000 -- nm --]], NEW[CDLayerRec _ [source: %CMos.pdif, deltaDiameter: 1000 -- nm --]], NEW[CDLayerRec _ [source: %CMos.pwelCont, deltaDiameter: 1000 -- nm --]], NEW[CDLayerRec _ [source: %CMos.nwelCont, deltaDiameter: 1000 -- nm --]]]] MEBES Command Formats patternFileBlockCount: CARDINAL _ 0, -- fill in after generation segment1: SegDirectoryEntry, segment2: SegDirectoryEntry, -- and so on ... month [01..12], day [01..31], year [00..99] [9] must be '. , [10] is column ['A..'Z], [11] is row ['A..'Z] Global Variables Central Procedures Utility Procedures ... 0 for default, 1 for first choice, etc. opens a layered stream with 2048-byte records, padded with nulls, where MEBES items do not cross record boundaries Κ κ˜šœ ™ Icodešœ Οmœ1™J™ΏJ™—š‘œ ‘‡™™Jšœι™ιJ™—J™——˜Jš œU‘œ>‘œB‘œB‘œ™»J™Jšœ žœžœžœ˜%šœ žœžœ˜Jšœžœ˜Jšœ‘'žœ‘˜MJ˜—J˜Jšœžœžœ žœ˜#šœ žœžœ˜Jšœžœ˜ Jšœžœ‘˜-Jšœ˜Jšœžœž˜J˜J˜——šΟn œžœžœžœžœžœžœ"žœ˜J˜—J˜—š ™J˜Jšœžœ˜Jšœžœ ‘˜$Jšœžœ‘˜)Jšœ žœ˜Jšœ žœ˜*Jšœ žœ ˜Jšœžœ˜Jšœžœ˜J˜š œžœžœž œžœ˜5Jšœ ˜ Jšœ2˜2Jšœžœ‘˜/Jšœžœ‘˜0Jšœ˜Jšœžœ˜Jšœ%˜%Jšœžœ˜Jš œžœžœžœžœžœ˜4Jšœ˜—Jšœžœžœž œ˜Aš œžœžœž œžœ˜4Jšœ-‘˜™>—š œžœžœž œžœ˜0Jšœ ‘0˜PJšœ&˜&Jšœžœ‘˜.Jšœžœ˜Jšœ˜Jšœ!˜!—š œžœžœž œžœ˜0Jšœ ‘0˜PJšœ&˜&Jšœ žœ‘˜%Jšœ žœ˜Jšœ˜Jšœ˜Jšœžœ˜Jšœžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jš œžœžœž œžœžœ˜GJšœ+˜+Jšœ+˜+Jšœ,˜,J˜J˜—Jš ™J˜Jšœžœ˜Jšœžœ˜Jšœžœ˜ Jšœ žœžœ˜J˜J˜Jš ™J™Jš’œžœ˜1J˜Jš’ œžœCžœ˜uJ˜Jš’œžœ-žœžœ(˜yJ˜Jš ’ œžœžœžœžœ‘'˜VJ˜Jš ™J™Jš ’ œžœ8žœžœ žœ‘4˜žJ˜š’ œžœ1žœžœ žœžœžœžœžœ žœ˜‚Jšœ+™+—J˜š’œžœ žœžœžœžœžœ žœžœ˜QJ™r—Jšœ˜Jš ’œžœžœžœžœ˜LJš’œžœžœ˜GJ˜š ’œžœžœžœ žœ˜1Jšœ žœžœžœ˜$J˜—Jš’ œžœžœžœ˜KJš’ œžœ žœžœ˜KJ˜Jš’ œžœ'žœ‘œ˜dJš’ œžœ&žœ‘œ˜cš’œžœ$žœ˜GJš’ œžœ‘˜3—J˜Jš œ’œžœžœ˜?Jš  œ œ’œžœžœ˜JJš’œžœžœžœ˜1Jš Ÿœžœ žœžœžœ˜(J™Jšžœ‘ ˜—J˜J˜—…—Ά: