<> <> <> <> <> <> <> <> <<>> <> <> <<3392 Investment Boulevard>> <> <<>> 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.Vector; NmPosition: TYPE = D2Basic.Vector; Tad: TYPE = D2Basic.Number; -- units smaller than nanometers TadPair: TYPE = D2Basic.Vector; TadPosition: TYPE = D2Basic.Vector; TadRect: TYPE = D2Basic.Rect; MEBESPixels: TYPE = D2Basic.Number; -- usually 500 or 200 nm MEBESPosition: TYPE = D2Basic.Vector; 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, interestingLayers: ARRAY CD.Layer OF BOOL _ ALL[FALSE], 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; <> <<>> <> <> <> <> <> <<.. 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.>> <> <<.. 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. >> <> <<.. x>0. This covers any space in CoverSpec whose smaller dimension is no larger than x.>> <> <> <<>> <> <<.. 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 --]]]]>> <<>> 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[' ]; <<[9] must be '. , [10] is column ['A..'Z], [11] is row ['A..'Z]>> 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 ]; <<... 0 for default, 1 for first choice, etc.>> 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.Vector, factor: Rational ] RETURNS [ sp: D2Basic.Vector -- = 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