DIRECTORY CD USING [Instance, Layer, Number], CDSimpleRules, CMos USING [lambda, cmos, ndif, pdif, pol, met, met2, nwell, nwellCont, pwellCont, cut, cut2, bur], Rope USING [ROPE], SX USING [CellPostProcessProc, Circuit, Constraint, ConstraintArray, ConstraintIndex, CircuitNode, ConstraintResolution, ConversionProc, GeometricRule, MapRec, nodeIndex, NodeLinkage, spaceIndex, SpinifexLayerIndex, TechHandle, BoxMapProc, violateIndex], SXCMos, SXCMosBasicRules, SXOutput USING [LinkagePrintProc, LinkageHousekeeper], SXOutputPrivate USING [UnNameTransType], SXTechnology USING [RegisterTechnologyHandle, RegisterSpinifexObjectProcs, ResolutionTable, SetUpResolution], TerminalIO USING [PutRope] ; SXCMosInitImpl: CEDAR PROGRAM IMPORTS CDSimpleRules, CMos, SXCMos, SXOutputPrivate, SXTechnology, TerminalIO EXPORTS SXCMos ~ BEGIN OPEN SXCMos; Constraint: TYPE ~ SX.Constraint; l: CD.Number ~ CMos.lambda; ndCnstr: PUBLIC REF ConstraintArray _ NEW[ConstraintArray]; ndInWel: CIndex ~ ndBur.SUCC; -- n-Diffusion in n-Well ndWel: CIndex ~ ndInWel.SUCC; -- Exclude n-Diffusion by n-Well ndCnt: CIndex ~ ndWel.SUCC; -- n-Diffusion contact here. ndPWct: CIndex ~ ndCnt.SUCC; -- p-Diffusion contact here. ndPdErr: CIndex ~ ndPWct.SUCC; -- n-Diffusion & p-Diffusion together => Error. pdCnstr: PUBLIC REF ConstraintArray _ NEW[ConstraintArray]; pdNdErr: CIndex ~ pdCh.SUCC; -- p-Diffusion & n-Diffusion together => Error. pdCnt: CIndex ~ pdNdErr.SUCC; -- p-Diffusion contact here. pdNWct: CIndex ~ pdCnt.SUCC; -- n-Diffusion contact here. polCnstr: PUBLIC REF ConstraintArray _ NEW[ConstraintArray]; pDErr: CIndex ~ pDandP.SUCC; -- Poly and Diffusion found together => Error. metCnstr: PUBLIC REF ConstraintArray _ NEW[ConstraintArray]; mVC: CIndex ~ mVia.SUCC; -- Via and Cut seperated by less than 2 lambda. InitRules: PROCEDURE [cMosHandle: REF SX.TechHandle] ~ { Rule: TYPE ~ SX.GeometricRule; TrigMap: TYPE ~ PACKED ARRAY CIndex OF BOOLEAN _ ALL[FALSE]; spaceRuleTrig, widthRuleTrig, nDifWidRuleTrig, polOverDifTrig1, polDifSepTrig1, polDifSepTrig2, nDifSpaceTrig1A, nDifSpaceTrig1B, nDifSpaceTrig2, pDifSpaceTrig1A, pDifSpaceTrig1B, pDifSpaceTrig2A, pDifSpaceTrig2B, pDifWidTrig, polSpaceTrig, polWidTrig, nDifSepNWellTrig1, nDifSepNWellTrig2, nDifInWellDifTrig1, nDifAndPDifTrig1, pDifAndNDifTrig1, alwaysErrorTrig2, buriedTrig, nDifChannelTrig, metCutViaSpacing, metCutCutSpacing, metSpacing, metWidth, polDifBuriedExitError: TrigMap; -- ALL[FALSE] detectOpaqueViolation: REF Rule; spaceRuleTrig[SX.nodeIndex] _ TRUE; widthRuleTrig _ ALL[TRUE]; widthRuleTrig[SX.nodeIndex] _ FALSE; nDifSpaceTrig1A[SX.nodeIndex] _ TRUE; nDifSpaceTrig1A[ndCh] _ TRUE; nDifSpaceTrig1A[ndCnt] _ TRUE; nDifSpaceTrig1B[ndPWct] _ TRUE; nDifSpaceTrig2[SX.nodeIndex] _ TRUE; nDifSpaceTrig2[ndCh] _ FALSE; -- there is no diff at channels nDifSpaceTrig2[ndCnt] _ TRUE; nDifSpaceTrig2[ndPWct] _ TRUE; buriedTrig[ndBur] _ TRUE; nDifChannelTrig[ndCh] _ TRUE; nDifWidRuleTrig _ ALL[TRUE]; nDifWidRuleTrig[SX.nodeIndex] _ FALSE; nDifWidRuleTrig[ndCnt] _ FALSE; pDifSpaceTrig1A[SX.nodeIndex] _ TRUE; pDifSpaceTrig1A[pdCh] _ TRUE; pDifSpaceTrig1A[pdCnt] _ TRUE; pDifSpaceTrig2A[SX.nodeIndex] _ TRUE; pDifSpaceTrig2A[pdCh] _ FALSE; -- there is no diff at channels pDifSpaceTrig2A[pdCnt] _ TRUE; pDifSpaceTrig2A[pdNWct] _ TRUE; pDifSpaceTrig1B[pdNWct] _ TRUE; pDifSpaceTrig2B[SX.nodeIndex] _ TRUE; pDifSpaceTrig2B[pdCnt] _ TRUE; pDifWidTrig _ ALL[TRUE]; pDifWidTrig[SX.nodeIndex] _ FALSE; pDifWidTrig[pdCnt] _ FALSE; nDifSepNWellTrig1[SX.nodeIndex] _ TRUE; nDifSepNWellTrig2[ndWel] _ TRUE; polSpaceTrig[SX.nodeIndex] _ TRUE; polSpaceTrig[pDandP] _ TRUE; polWidTrig _ ALL[TRUE]; polWidTrig[SX.nodeIndex] _ FALSE; polWidTrig[pDandP] _ FALSE; polWidTrig[pDErr] _ FALSE; polDifSepTrig1 [SX.nodeIndex] _ TRUE; polDifSepTrig1 [pDandP] _ TRUE; polDifSepTrig2 [pExnD] _ TRUE; polDifSepTrig2 [pExpD] _ TRUE; polDifSepTrig2 [pExNdCon] _ TRUE; polDifSepTrig2 [pExPdCon] _ TRUE; metSpacing [SX.nodeIndex] _ TRUE; metSpacing [mCut] _ TRUE; metSpacing [mVia] _ TRUE; metSpacing [mVC] _ TRUE; metWidth _ ALL[TRUE]; metWidth [SX.nodeIndex] _ FALSE; metWidth [mCut] _ FALSE; metWidth [mVia] _ FALSE; metWidth [mVC] _ FALSE; polOverDifTrig1 [pDErr] _ TRUE; nDifInWellDifTrig1 [ndInWel] _ TRUE; nDifAndPDifTrig1 [ndPdErr] _ TRUE; pDifAndNDifTrig1 [pdNdErr] _ TRUE; metCutViaSpacing [mVC] _ TRUE; metCutCutSpacing [mCut] _ TRUE; polDifBuriedExitError [pBurErr] _ TRUE; alwaysErrorTrig2 _ ALL[TRUE]; detectOpaqueViolation _ NEW[ Rule _ [ extent~ l, message~ "Opaque cell boundary violated", trigger1~ ALL[TRUE], trigger2~ ALL[TRUE]]]; detectOpaqueViolation.trigger1[SX.violateIndex] _ FALSE; cMosHandle.rules [ndifSpinifex] _ LIST[ NEW [Rule _ [message~ "n-Diffusion spacing", extent~ CDSimpleRules.MinDist[CMos.ndif, CMos.ndif], okIfConnected~ TRUE, trigger1~ nDifSpaceTrig1A, trigger2~ nDifSpaceTrig2]], NEW [Rule _ [message~ "n-Diffusion/unconnected p-substrate-contact spacing", extent~ SXCMosBasicRules.ndifUncSubtrContSpacing, okIfConnected~ TRUE, trigger1~ nDifSpaceTrig1B, trigger2~ nDifSpaceTrig2]], NEW [Rule _ [message~ "n-Diffusion width", extent~ CDSimpleRules.MinWidth[CMos.ndif], trigger1~ nDifWidRuleTrig, trigger2~ nDifWidRuleTrig]], NEW [Rule _ [message~ "n-Diffusion/n-Well spacing", extent~ SXCMosBasicRules.nDifToWell, trigger1~ nDifSepNWellTrig1, trigger2~ nDifSepNWellTrig2]], NEW [Rule _ [message~ "n-Well/n-Diffusion spacing", extent~ SXCMosBasicRules.nDifToWell, trigger1~ nDifSepNWellTrig2, trigger2~ nDifSepNWellTrig1]], NEW [Rule _ [message~ "n-Diffusion in n-Well", extent~ SXCMosBasicRules.ndifInnWell, trigger1~ nDifInWellDifTrig1, trigger2~ alwaysErrorTrig2]], NEW [Rule _ [message~ "n-Diffusion and p-substrate-contact", extent~ SXCMosBasicRules.ndifpSubstrCont, trigger1~ nDifAndPDifTrig1, trigger2~ alwaysErrorTrig2]], NEW [Rule _ [message~ "channel/buried-contact spacing", extent~ SXCMosBasicRules.ndifChanBurContSpacing, trigger1~ buriedTrig, trigger2~ nDifChannelTrig]], NEW [Rule _ [message~ "buried-contact/channel spacing", extent~ SXCMosBasicRules.ndifBurContChanSpacing, trigger1~ nDifChannelTrig, trigger2~ buriedTrig]], detectOpaqueViolation ]; cMosHandle.rules [pdifSpinifex] _ LIST[ NEW [Rule _ [message~ "p-Diffusion spacing", extent~ CDSimpleRules.MinDist[CMos.pdif, CMos.pdif], okIfConnected~ TRUE, trigger1~ pDifSpaceTrig1A, trigger2~ pDifSpaceTrig2A]], NEW [Rule _ [message~ "p-Diffusion/unconnected n-Well-contact spacing", extent~ SXCMosBasicRules.pdifUncnWellSpacing, okIfConnected~ TRUE, trigger1~ pDifSpaceTrig1B, trigger2~ pDifSpaceTrig2B]], NEW [Rule _ [message~ "p-Diffusion width", extent~ CDSimpleRules.MinWidth[CMos.pdif], trigger1~ pDifWidTrig, trigger2~ pDifWidTrig]], NEW [Rule _ [message~ "p-Diffusion and n-Well-contact", extent~ SXCMosBasicRules.pdifnWellCont, trigger1~ pDifAndNDifTrig1, trigger2~ alwaysErrorTrig2]], detectOpaqueViolation ]; cMosHandle.rules [polSpinifex] _ LIST[ NEW [Rule _ [message~ "Poly spacing", extent~ CDSimpleRules.MinDist[CMos.pol, CMos.pol], okIfConnected~ TRUE, trigger1~ polSpaceTrig, trigger2~ polSpaceTrig]], NEW [Rule _ [message~ "Poly width", extent~ CDSimpleRules.MinWidth[CMos.pol], trigger1~ polWidTrig, trigger2~ polWidTrig]], NEW [Rule _ [message~ "Poly/unconnected Diffusion spacing", extent~ SXCMosBasicRules.polUncDifSpacing, okIfConnected~ TRUE, trigger1~ polDifSepTrig1, trigger2~ polDifSepTrig2]], NEW [Rule _ [message~ "Diffusion/unconnected Poly spacing", extent~ SXCMosBasicRules.polDiffUncPolySpacing, okIfConnected~ TRUE, trigger1~ polDifSepTrig2, trigger2~ polDifSepTrig1]], NEW [Rule _ [message~ "Poly over Diffusion", extent~ SXCMosBasicRules.polOverDiff, trigger1~ polOverDifTrig1, trigger2~ alwaysErrorTrig2]], NEW [Rule _ [message~ "Insufficient Buried extension over Diffusion", extent~ SXCMosBasicRules.polBuriedExtension, trigger1~ polDifBuriedExitError, trigger2~ alwaysErrorTrig2]], detectOpaqueViolation ]; cMosHandle.rules [metSpinifex] _ LIST[ NEW [Rule _ [message~ "Metal spacing", extent~ CDSimpleRules.MinDist[CMos.met, CMos.met], okIfConnected~ TRUE, trigger1~ metSpacing, trigger2~ metSpacing]], NEW [Rule _ [message~ "Metal width", extent~ CDSimpleRules.MinWidth[CMos.met], trigger1~ metWidth, trigger2~ metWidth]], NEW [Rule _ [message~ "Cut to Via spacing", extent~ SXCMosBasicRules.metCutViaSpacing, trigger1~ metCutViaSpacing, trigger2~ alwaysErrorTrig2]], NEW [Rule _ [message~ "Cut to Cut spacing", extent~ SXCMosBasicRules.metCutCutSpacing, trigger1~ metCutCutSpacing, trigger2~ metCutCutSpacing]], detectOpaqueViolation ]; cMosHandle.rules [m2Spinifex] _ LIST[ NEW [Rule _ [message~ "Metal 2 spacing", extent~ CDSimpleRules.MinDist[CMos.met2, CMos.met2], okIfConnected~ TRUE, trigger1~ spaceRuleTrig, trigger2~ spaceRuleTrig]], NEW [Rule _ [message~ "Metal 2 width", extent~ CDSimpleRules.MinWidth[CMos.met2], trigger1~ widthRuleTrig, trigger2~ widthRuleTrig]], detectOpaqueViolation ]; }; Init: PROCEDURE ~ { cMosHandle: REF SX.TechHandle; ndifResolution: REF SX.ConstraintResolution; pdifResolution: REF SX.ConstraintResolution; polyResolution: REF SX.ConstraintResolution; metalResolution: REF SX.ConstraintResolution; ndCnstr[ndCh] _ NEW [Constraint _ [$NDifChannel, ndCh, TRUE, polSpinifex]]; ndCnstr[ndBur] _ NEW [Constraint _ [$BuriedNDifPol, ndBur]]; ndCnstr[ndInWel] _ NEW [Constraint _ [$NDifInWellError, ndInWel]]; ndCnstr[ndWel] _ NEW [Constraint _ [$ExcludeNDifByWell, ndWel]]; ndCnstr[ndCnt] _ NEW [Constraint _ [$ContactNDif, ndCnt, TRUE, ndifSpinifex]]; ndCnstr[ndPWct] _ NEW [Constraint _ [$ExcludeNDifByPWellCont, ndPWct, TRUE, pdifSpinifex]]; ndCnstr[ndPdErr] _ NEW [Constraint _ [$NDifAndPDifError, ndPdErr]]; pdCnstr[pdCh] _ NEW [Constraint _ [$PDifChannel, pdCh, TRUE, pdifSpinifex]]; pdCnstr[pdNdErr] _ NEW [Constraint _ [$PDifAndNDifError, pdNdErr]]; pdCnstr[pdCnt] _ NEW [Constraint _ [$ContactPDif, pdCnt, TRUE, pdifSpinifex]]; pdCnstr[pdNWct] _ NEW [Constraint _ [$ExcludePDifByNWellCont, pdNWct, TRUE, ndifSpinifex]]; polCnstr[pExnD] _ NEW [Constraint _ [$PolExcludeByNDif, pExnD, TRUE, ndifSpinifex]]; polCnstr[pExpD] _ NEW [Constraint _ [$PolExcludeByPDif, pExpD, TRUE, pdifSpinifex]]; polCnstr[pExNdCon] _ NEW [Constraint _ [$PolExcludeByNDifContact, pExNdCon, TRUE, ndifSpinifex]]; polCnstr[pExPdCon] _ NEW [Constraint _ [$PolExcludeByPDifContact, pExPdCon, TRUE, pdifSpinifex]]; polCnstr[pChE] _ NEW [Constraint _ [$PolChannelEdge, pChE]]; polCnstr[pDxorP] _ NEW [Constraint _ [$PolXorDif, pDxorP]]; polCnstr[pDandP] _ NEW [Constraint _ [$polAndDif, pDandP, TRUE, polSpinifex]]; polCnstr[pDErr] _ NEW [Constraint _ [$PolDifError, pDErr]]; polCnstr[pBur] _ NEW [Constraint _ [$PolBuried, pBur]]; polCnstr[pDExcl] _ NEW [Constraint _ [$PolExcludeNDif, pDExcl]]; polCnstr[pBurErr] _ NEW [Constraint _ [$PolBuriedNDifError, pBurErr]]; metCnstr[mCut] _ NEW [Constraint _ [$MetCut, mCut, TRUE, metSpinifex]]; metCnstr[mVia] _ NEW [Constraint _ [$MetVia, mVia, TRUE, metSpinifex]]; metCnstr[mVC] _ NEW [Constraint _ [$MetViaAndCutError, mVC]]; { nd: SX.ConstraintIndex ~ SX.nodeIndex; sp: SX.ConstraintIndex ~ SX.spaceIndex; ndifResTab: SXTechnology.ResolutionTable ~ [ [ sp, nd, ndCh, ndBur, ndInWel, ndWel, ndCnt, ndPWct, ndPdErr, ,,,,,,], [ nd, nd, ndCh, nd, ndInWel, ndInWel, ndCnt, ndPdErr, ndPdErr, ,,,,,,], [ ndCh, ndCh, ndCh, ndCh, ndInWel, ndInWel, ndCh, ndPdErr, ndPdErr, ,,,,,,], [ ndBur, nd, ndCh, ndBur, ndInWel, ndWel, ndCnt, ndPWct, ndPdErr, ,,,,,,], [ ndInWel, ndInWel, ndInWel, ndInWel, ndInWel, ndInWel, ndCnt, ndPdErr, ndPdErr, ,,,,,,], [ ndWel, ndInWel, ndInWel, ndWel, ndInWel, ndWel, ndCnt, ndPWct, ndPdErr, ,,,,,,], [ ndCnt, ndCnt, ndCh, ndCnt, ndCnt, ndCnt, ndCnt, ndPdErr, ndPdErr, ,,,,,,], [ ndPWct, ndPdErr, ndPdErr, ndPWct, ndPdErr, ndPWct, ndPdErr, ndPWct, ndPdErr, ,,,,,,], [ ndPdErr, ndPdErr, ndPdErr, ndPdErr, ndPdErr, ndPdErr, ndPdErr, ndPdErr, ndPdErr, ,,,,,,], ,,,,,, ]; pdifResTab: SXTechnology.ResolutionTable ~ [ [ sp, nd, pdCh, pdNdErr, pdCnt, pdNWct, ,,,,,,,,,], [ nd, nd, pdCh, pdNdErr, pdCnt, pdNdErr, ,,,,,,,,,], [ pdCh, pdCh, pdCh, pdNdErr, pdCh, pdNdErr, ,,,,,,,,,], [ pdNdErr, pdNdErr, pdNdErr, pdNdErr, pdNdErr, pdNdErr, ,,,,,,,,,], [ pdCnt, pdCnt, pdCh, pdNdErr, pdCnt, pdNdErr, ,,,,,,,,,], [ pdNWct, pdNdErr, pdNdErr, pdNdErr, pdNdErr, pdNWct, ,,,,,,,,,], ,,,,,,,,, ]; polyResTab: SXTechnology.ResolutionTable ~ [ [ sp, nd, pExnD, pExpD, pExNdCon, pExPdCon, pChE, pDExcl, pBur, pBurErr, pDxorP, pDandP, pDErr, ,,], [ nd, nd, pDErr, pDErr, pDErr, pDErr, pDErr, nd, nd, pDErr, nd, pDandP, pDErr, ,,], [ pExnD, pDErr, pExnD, pExpD, pExNdCon, pExPdCon, pChE, pBurErr, pBur, pBurErr, pChE, pDandP, pDErr, ,,], [ pExpD, pDErr, pExpD, pExpD, pExPdCon, pExPdCon, pChE, pBurErr, pBur, pBurErr, pChE, pDandP, pDErr, ,,], [ pExNdCon, pDErr, pExNdCon, pExPdCon, pExNdCon, pExPdCon, pExNdCon, pBurErr, pBur, pBurErr, pChE, pDandP, pDErr, ,,], [ pExPdCon, pDErr, pExPdCon, pExPdCon, pExPdCon, pExPdCon, pExPdCon, pBurErr, pBur, pBurErr, pChE, pDandP, pDErr, ,,], [ pChE, pDErr, pChE, pChE, pExNdCon, pExPdCon, pChE, pBurErr, pBur, pBurErr, pChE, pDandP, pDErr, ,,], [ pDExcl, nd, pBurErr, pBurErr, pBurErr, pBurErr, pBurErr, pDExcl, pBur, pBurErr, pDExcl, pDandP, pDErr, ,,], [ pBur, nd, pBur, pBur, pBur, pBur, pBur, pBur, pBur, pBur, pBur, pDandP, pDErr, ,,], [ pBurErr, pDErr, pBurErr, pBurErr, pBurErr, pBurErr, pBurErr, pBurErr, pBur, pBurErr, pBurErr, pDandP, pDErr, ,,], [ pDxorP, nd, pChE, pChE, pChE, pChE, pChE, pDExcl, pBur, pBurErr, pDxorP, pDandP, pDErr, ,,], [ pDandP, pDandP, pDandP, pDandP, pDandP, pDandP, pDandP, pDandP, pDandP, pDandP, pDandP, pDandP, pDandP, ,,], [ pDErr, pDErr, pDErr, pDErr, pDErr, pDErr, pDErr, pDErr, pDErr, pDErr, pDErr, pDandP, pDErr, ,,], ,, ]; metalResTab: SXTechnology.ResolutionTable ~ [ [ sp, nd, mCut, mVia, mVC, ,,,,,,,,,,], [ nd, nd, mCut, mVia, mVC, ,,,,,,,,,,], [ mCut, mCut, mCut, mVC, mVC, ,,,,,,,,,,], [ mVia, mVia, mVC, mVia, mVC, ,,,,,,,,,,], [ mVC, mVC, mVC, mVC, mVC, ,,,,,,,,,,], ,,,,,,,,,, ]; ndifResolution _ SXTechnology.SetUpResolution [ndCnstr, ndifResTab]; pdifResolution _ SXTechnology.SetUpResolution [pdCnstr, pdifResTab]; polyResolution _ SXTechnology.SetUpResolution [polCnstr, polyResTab]; metalResolution _ SXTechnology.SetUpResolution [metCnstr, metalResTab]; }; cMosHandle _ NEW[SX.TechHandle _ [ numSpinifexLayers~ 6, layerInterestBloat~ [SXCMosBasicRules.nDifLayerSep, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2), (CDSimpleRules.MinDist[CMos.pol, CMos.pol]/2), (CDSimpleRules.MinDist[CMos.met, CMos.met]/2), (CDSimpleRules.MinDist[CMos.met2, CMos.met2]/2), l,,], combineNodeProperties~ CopyWellConnections, cellPostProcess~ CheckWellConnections] ]; cMosHandle.illegalLayer[CMos.nwellCont] _ FALSE; cMosHandle.illegalLayer[CMos.pwellCont] _ FALSE; cMosHandle.illegalLayer[CMos.ndif] _ FALSE; cMosHandle.illegalLayer[CMos.pdif] _ FALSE; cMosHandle.illegalLayer[CMos.nwell] _ FALSE; cMosHandle.illegalLayer[CMos.pol] _ FALSE; cMosHandle.illegalLayer[CMos.met] _ FALSE; cMosHandle.illegalLayer[CMos.met2] _ FALSE; cMosHandle.cdLayerMapping[CMos.nwellCont] _ LIST [[ndifSpinifex, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2)], [wellSpinifex, l, NEW [SX.BoxMapProc _ AttachNWellContact]], [pdifSpinifex, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2), pdCnstr[pdNWct]], [ndifSpinifex, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2), ndCnstr[ndCnt]], [polSpinifex, SXCMosBasicRules.difToPolExtSep, polCnstr[pExnD]]]; -- Order Important for well plugging, node is created in first mapping, and used in second. cMosHandle.cdLayerMapping[CMos.pwellCont] _ LIST [[pdifSpinifex, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2)], [ndifSpinifex, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2), ndCnstr[ndPWct]], [pdifSpinifex, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2), pdCnstr[pdCnt]], [polSpinifex, SXCMosBasicRules.difToPolExtSep, polCnstr[pExpD]]]; cMosHandle.cdLayerMapping[CMos.ndif] _ LIST [[ndifSpinifex, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2)], [polSpinifex, SXCMosBasicRules.difToPolExtSep, polCnstr[pExnD]]]; cMosHandle.cdLayerMapping[CMos.pdif] _ LIST [[pdifSpinifex, (CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2)], [polSpinifex, SXCMosBasicRules.difToPolExtSep, polCnstr[pExpD]]]; cMosHandle.cdLayerMapping[CMos.nwell] _ LIST [[ndifSpinifex, SXCMosBasicRules.nDifToWell-(CDSimpleRules.MinDist[CMos.ndif, CMos.ndif]/2), ndCnstr[ndWel]], [wellSpinifex, l]]; -- INTERIM cMosHandle.cdLayerMapping[CMos.pol] _ LIST [[polSpinifex, (CDSimpleRules.MinDist[CMos.pol, CMos.pol]/2)]]; cMosHandle.cdLayerMapping[CMos.met] _ LIST [[metSpinifex, (CDSimpleRules.MinDist[CMos.met, CMos.met]/2)]]; cMosHandle.cdLayerMapping[CMos.met2] _ LIST [[m2Spinifex, (CDSimpleRules.MinDist[CMos.met2, CMos.met2]/2)]]; { conInfl: CD.Number~ lambda; -- Influence distance of contacts. cMosHandle.cdLayerMapping[CMos.cut] _ LIST [[ndifSpinifex, conInfl, $Opaque], [pdifSpinifex, conInfl, $Opaque], [polSpinifex, conInfl, $Opaque], [metSpinifex, conInfl, $Opaque]]; cMosHandle.cdLayerMapping[CMos.cut2] _ LIST [[metSpinifex, conInfl, $Opaque], [m2Spinifex, conInfl, $Opaque]]; cMosHandle.cdLayerMapping[CMos.bur] _ LIST [[ndifSpinifex, (CDSimpleRules.MinDist[CMos.met2, CMos.met2]/2), $Opaque], [polSpinifex, conInfl, $Opaque]]; }; cMosHandle.spinifexLayerNames[ndifSpinifex].layerId _ $nDiffusion; cMosHandle.spinifexLayerNames[pdifSpinifex].layerId _ $pDiffusion; cMosHandle.spinifexLayerNames[polSpinifex].layerId _ $Poly; cMosHandle.spinifexLayerNames[metSpinifex].layerId _ $Metal; cMosHandle.spinifexLayerNames[m2Spinifex].layerId _ $Metal2; cMosHandle.spinifexLayerNames[wellSpinifex].layerId _ $NWell; cMosHandle.spinifexLayerNames[ndifSpinifex].thymeName _ "nD"; cMosHandle.spinifexLayerNames[pdifSpinifex].thymeName _ "pD"; cMosHandle.spinifexLayerNames[polSpinifex].thymeName _ "P"; cMosHandle.spinifexLayerNames[metSpinifex].thymeName _ "M"; cMosHandle.spinifexLayerNames[m2Spinifex].thymeName _ "M2"; cMosHandle.constraintResolutions[ndifSpinifex] _ ndifResolution; cMosHandle.constraintResolutions[pdifSpinifex] _ pdifResolution; cMosHandle.constraintResolutions[polSpinifex] _ polyResolution; cMosHandle.constraintResolutions[metSpinifex] _ metalResolution; InitRules[cMosHandle]; SXTechnology.RegisterTechnologyHandle[cdTech~ CMos.cmos, technologyHandle~ cMosHandle]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosTransistor, conv~ ConvTransistor, thyme~ ThymeTransistor, rose~ RoseTransistor, fini~ SXOutputPrivate.UnNameTransType]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosPTypeTransistor, conv~ ConvTransistor, thyme~ ThymeTransistor, rose~ RoseTransistor, fini~ SXOutputPrivate.UnNameTransType]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosATransistor, conv~ ConvTransistor, thyme~ ThymeTransistor, rose~ RoseTransistor, fini~ SXOutputPrivate.UnNameTransType]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosPTypeATransistor, conv~ ConvTransistor, thyme~ ThymeTransistor, rose~ RoseTransistor, fini~ SXOutputPrivate.UnNameTransType]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CTrans, conv~ ConvTransistor, thyme~ ThymeTransistor, rose~ RoseTransistor, fini~ SXOutputPrivate.UnNameTransType]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CLTrans, conv~ ConvTransistor, thyme~ ThymeTransistor, rose~ RoseTransistor, fini~ SXOutputPrivate.UnNameTransType]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CWellTrans, conv~ ConvTransistor, thyme~ ThymeTransistor, rose~ RoseTransistor, fini~ SXOutputPrivate.UnNameTransType]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CLWellTrans, conv~ ConvTransistor, thyme~ ThymeTransistor, rose~ RoseTransistor, fini~ SXOutputPrivate.UnNameTransType]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosPDifRect, conv~ ConvertPDifRect]; InitContacts[]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosContactDifAndPol, conv~ ConvertContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosContactWellDifAndPol, conv~ ConvertContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosContactBut, conv~ ConvertContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosContactWellBut, conv~ ConvertContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CBurContS, conv~ ConvertBuriedContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CBurContPS, conv~ ConvertBuriedContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CBurContDI, conv~ ConvertBuriedContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CBurContDL, conv~ ConvertBuriedContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosWellBurContact, conv~ ConvertContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosMmContact, conv~ ConvertContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosContactWellDifShort, conv~ ConvertContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CMosContactDifShort, conv~ ConvertContact]; SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CSimpleCon, conv~ ConvertContact]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CWellSimpleCon, conv~ ConvertContact]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CDifShortCon, conv~ ConvertContact]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CWellDifShortCon, conv~ ConvertContact]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CButtingCont, conv~ ConvertContact]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CWellButtingCont, conv~ ConvertContact]; -- cd21 SXTechnology.RegisterSpinifexObjectProcs [cdTech~ CMos.cmos, objectType~ $CVia, conv~ ConvertContact]; -- cd21 }; Init[]; TerminalIO.PutRope["cMos technology parameters Loaded\n"]; END. ÎSXCMosInitImpl.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Written by Shand, September 12, 1983 11:40 pm Last Edited by: Shand, March 13, 1985 1:34:08 pm PST Last Edited by: Spreitzer, January 14, 1985 9:15:18 pm PST Last edited by: Christian Jacobi, November 7, 1986 4:32:12 pm PST Bowers, September 13, 1985 10:38:33 am PDT Last edited by: gbb November 24, 1985 4:51:05 pm PST -- Constraints -- n-Diffusion constraints. -- PUBLIC ndCh, ndBur. -- p-Diffusion constraints -- PUBLIC pdCh. -- Poly constraints -- PUBLIC pExnD, pExpD, pExNdCon, pExPdCon, pChE, pDExcl, pBur, pBurErr, pDxorP, pDandP. -- Metal constraints -- PUBLIC mCut, mVia. -- Geometric rule triggers. Corners are defined by union of dif and gate nDifWidRuleTrig[ndCh] _ FALSE; Corners are defined by union of dif and gate Metal Purely local errors are not handled in a natural manner by my scheme, so for every corner we find in polCnstr[pDErr] we generate an error if there is anything on any layer nearby, of course there is always something so we get our error. -- The geometric rules. We set violateIndex = FALSE, ALL else TRUE so that corner checks face inward, which should result in more logically pleasing error reports. The above two rules are no longer applied to channels. -- Construction of the Layer Constraints. Constraint: PUBLIC TYPE ~ RECORD [ name: ATOM, index: ConstraintIndex, -- index into the constraint array hasCorrespondingNode: BOOLEAN _ FALSE, -- used where connectivity affects the rule and there is a corresponding layer which has the node associated with this region. correspondingNodeLayer: SpinifexLayerIndex _ SpinifexLayerIndex.FIRST -- way to attach node values to constraints by looking at other layers. ]; -- Constraint priority: sp < ndBur < nd < ndCnt < ndCh < ndWel < ndInWel < ndPWct < ndPdErr. -- Constraint priority: sp < nd < pdCnt < pdCh < pdNWct < pdNdErr -- Constraint priority: sp < pDxorP < pExnD < pExpD < pChE < pExNdCon < pExPdCon < pDExcl < pBur < nd < pBurErr < pDErr < pDandP -- Constraint priority: sp < nd < mCut < mVia < mVC -- Basic cMosHandle & cdLayerMappings. -- Translations for Opaque Cells. -- Using value $Opaque ensures we get an error if these are ever used as normal cdLayerMappings. -- Spinifex Layer Identification. -- Thyme stray capacitance layer names. -- Set Constraint Resolutions for each layer into the TechHandle. -- The geometric rules. -- Technology handle is attached to the ChipNDale technology. -- Technology specific objects. Edited on February 20, 1985 12:00:53 pm PST, by Shand Bug in n-Diffusion width rule specification, Added object converters for split contacts (also called DifShort contacts) changes to: InitRules changed width rule triggers., Init Added object converters Edited on February 21, 1985 6:19:41 pm PST, by Beretta changes to: DIRECTORY, Init Edited on March 7, 1985 1:38:15 am PST, by Shand Adjust diffusion spacing rules to check diffusion to channel spacing changes to: InitRules dif spacing rule triggers, Init channel.withNode resolution for conflict detection. Edited on March 9, 1985 9:35:22 pm PST, by Shand changes to: Init, DIRECTORY, Constraint, ndCnstr, pdCnstr, polCnstr, InitRules, IMPORTS, InitRules, DIRECTORY Edited on March 12, 1985 3:16:06 pm PST, by Shand Now uses registration mechanism of SXTechnology. changes to: Init, DIRECTORY, IMPORTS, InitRules, polCnstr, InitRules Edited on March 12, 1985 4:03:10 pm PST, by Shand Rule extensions to handle Contact rules (DifCon to Poly, PolCon to Gate, Cut to Via) changes to: metCnstr, InitRules, Init Edited on March 13, 1985 1:31:13 pm PST, by Shand Gave an ordering for each set of layer constraints. Added the word unconnected to the messages for rules where it may not be obvious that connectivity affects the checking. changes to: InitRules, Init Edited on April 2, 1985 2:57:18 pm PST, by Beretta Since there is no diffusion in transistor channels, we do not want to test it. Warning: the rule "n-Diffusion/unconnected p-substrate-contact spacing" uses the same trigger. changes to: InitRules: nDifSpaceTrig2[ndCh] _ pDifSpaceTrig2A[pdCh] _ FALSE Edited on May 6, 1985 11:26:55 am PDT, by Beretta Converted to ChipNDale CD20 Last edited by: gbb July 20, 1985 4:05:15 pm PDT Added the registration of the new contact and transistor types. gbb August 9, 1985 2:44:09 pm PDT Added the registration of the transistor output procedure for Core. changes to: Init gbb November 24, 1985 4:50:49 pm PST Removed the registration of the transistor output procedure for Core. changes to: Init ʘcode™Kšœ Ïmœ1™Kšœžœ¢˜8Kšœžœ¢˜9Kšœžœ¢/˜N—Lš¡™šœ žœžœžœ˜;Lšœ™Kšœžœ¢/˜LKšœžœ¢˜:Kšœžœ¢˜9—Lš¡™šœ žœžœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœ žœ˜%Kšœžœ˜Kšœžœžœ˜Kšœžœ˜"Kšœžœ˜Lšœ"žœ˜'Kšœžœ˜ Lšœžœ˜"Kšœžœ˜Kšœ žœžœ˜Kšœžœ˜!Kšœžœ˜Kšœžœ˜Kšœ žœ˜%Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœžœ˜!Kšœžœ˜!—™Kšœžœ˜!Kšœžœ˜Kšœžœ˜Kšœžœ˜Kšœ žœžœ˜Kšœžœ˜ Kšœžœ˜Kšœžœ˜Kšœžœ˜—šœì™ìKšœžœ˜Kšœžœ˜$Kšœžœ˜"Kšœžœ˜"Kšœžœ˜Kšœžœ˜Kšœ"žœ˜'Kšœžœžœ˜——š¡™Kšœžœ œ Ïbœ žœžœ žœžœ˜†Kšœ‹™‹Kšœ2žœ˜8šœ"žœ˜'K–M[key: REF ANY, technology: CD.Technology _ NIL, default: REF ANY _ NIL]šžœ¤œGžœ8˜­–M[key: REF ANY, technology: CD.Technology _ NIL, default: REF ANY _ NIL]šžœ¤3œ œ(žœ8˜ÊK™6—Kšžœ¤œe˜Kšžœ¤œc˜”Kšžœ¤œc˜”Kšžœ¤œ œH˜Kšžœ¤#œ œJ˜ Kšžœ¤œ œJ˜›Kšžœ¤œ œJ˜›Kšœ˜Kšœ˜—šœ"žœ˜'K–M[key: REF ANY, technology: CD.Technology _ NIL, default: REF ANY _ NIL]šžœ¤œGžœ9˜®K–M[key: REF ANY, technology: CD.Technology _ NIL, default: REF ANY _ NIL]šžœ¤.œ œ$žœ9˜ÂKšžœ¤œ]˜…Kšžœ¤œ œH˜™Kšœ˜Kšœ˜—šœ!žœ˜&Kšžœ¤ œEžœ3˜ŸKšžœ¤ œZ˜{Kšžœ¤"œ œ!žœ8˜²Kšžœ¤"œ œ&žœ8˜·Kšžœ¤œ œE˜‹Kšžœ¤,œ œR˜±Kšœ˜Kšœ˜—šœ!žœ˜&Kšžœ¤ œEžœ/˜œKšžœ¤ œV˜xKšžœ¤œ œL˜‘Kšžœ¤œ œL˜‘Kšœ˜Kšœ˜—šœ žœ˜%Kšžœ¤œGžœ5˜¦Kšžœ¤ œa˜…Kšœ˜Kšœ˜——K˜—š£œž œ˜LšŸ œžœ˜Lšœžœ˜,Kšœžœ˜,Kšœžœ˜,Kšœžœ˜-š¡)™)šœ žœžœžœ™"Kšœžœ™ Kšœ¢"™;Kšœžœžœ¢{™¥Kšœ@žœ¢D™K™—Lšœžœ$žœ˜LKšœžœ)˜=Kšœžœ-˜CKšœžœ-˜AKšœžœ&žœ˜OKšœžœ2žœ˜\Kšœžœ.˜DLšœžœ%žœ˜MKšœžœ.˜DKšœžœ&žœ˜OKšœžœ2žœ˜\Lšœžœ+žœ˜UKšœžœ+žœ˜UKšœžœ5žœ˜bKšœžœ5žœ˜bKšœžœ)˜=Kšœžœ&˜L˜Kšœ&˜&Kšœ'˜'šœ,˜,IdefaultšœÐosD™\Mš¥O˜OMš¥O˜OMš¥Q˜QMš¥Q˜QMš¥Z˜ZMš¥V˜VMš¥S˜SMš¥W˜WMš¥[˜[Mš¥œ˜M˜—šœ,˜,Mšœ¥)™AMš¥9˜9Mš¥:˜:Mš¥;˜;Mš¥C˜CMš¥>˜>Mš¥A˜AJ˜ K˜—šœ,˜,Mšœ¥h™€Mš¥m˜mMš¥d˜dMš¥q˜qMš¥q˜qMš¥z˜zMš¥z˜zMš¥n˜nMš¥q˜qMš¥b˜bMš¥v˜vMš¥g˜gMš¥n˜nMš¥n˜nMšœ˜Kšœ˜—šœ-˜-Mšœ¥™3Mš¥)˜)Mš¥)˜)Mš¥*˜*Mš¥*˜*Mš¥'˜'M˜ K˜—LšœD˜DKšœD˜DKšœE˜EKšœG˜GK˜—š¡&™&Lšœ žœ œZ˜ˆKšœ¤ œžœ˜0Kšœ¤ œžœ˜0Kšœ¤œžœ˜+Kšœ¤œžœ˜+Kšœ¤œžœ˜,Kšœ¤œžœ˜*Kšœ¤œžœ˜*Kšœ¤œžœ˜+Kš œ¤ œžœR œžœ¢[˜ðKšœ¤ œžœ§˜×Kšœ¤œžœ„˜¯Kšœ¤œžœ„˜¯Kš œ¤œžœ~ œ¢Ñacl˜ºKšœ¤œžœ@˜jKšœ¤œžœ@˜jKšœ¤œžœA˜lK™!˜Kšœ žœ¢"˜>Kšœ`™`Kšœ¤œžœˆ˜²Kšœ¤œžœC˜nKšœ¤œžœm˜—K˜K˜——š¡!™!LšœB˜BKšœB˜BKšœ;˜;Kšœ<˜