<> <> <> <> <> <> <> DIRECTORY CD USING [Instance, Layer, Number, Position], 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 [WriteRope] ; SXCMosInitImpl: CEDAR PROGRAM IMPORTS CDSimpleRules, CMos, SXCMos, SXOutputPrivate, SXTechnology, TerminalIO EXPORTS SXCMos ~ BEGIN OPEN SXCMos; Constraint: TYPE ~ SX.Constraint; <<-- Constraints>> <<-- n-Diffusion constraints.>> ndCnstr: PUBLIC REF ConstraintArray _ NEW[ConstraintArray]; <<-- PUBLIC ndCh, ndBur.>> 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. <<-- p-Diffusion constraints>> pdCnstr: PUBLIC REF ConstraintArray _ NEW[ConstraintArray]; <<-- PUBLIC pdCh.>> 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. <<-- Poly constraints>> polCnstr: PUBLIC REF ConstraintArray _ NEW[ConstraintArray]; <<-- PUBLIC pExnD, pExpD, pExNdCon, pExPdCon, pChE, pDExcl, pBur, pBurErr, pDxorP, pDandP.>> pDErr: CIndex ~ pDandP.SUCC; -- Poly and Diffusion found together => Error. <<-- Metal constraints>> metCnstr: PUBLIC REF ConstraintArray _ NEW[ConstraintArray]; <<-- PUBLIC mCut, mVia.>> 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; <<-- Geometric rule triggers.>> 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]; <<-- The geometric rules.>> detectOpaqueViolation _ NEW[ Rule _ [ extent~ 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; <<-- Construction of the Layer Constraints.>> <> <> <> <> <> <<];>> 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 ~ [ <<-- Constraint priority: sp < ndBur < nd < ndCnt < ndCh < ndWel < ndInWel < ndPWct < ndPdErr.>> [ 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 ~ [ <<-- Constraint priority: sp < nd < pdCnt < pdCh < pdNWct < pdNdErr>> [ 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 ~ [ <<-- Constraint priority: sp < pDxorP < pExnD < pExpD < pChE < pExNdCon < pExPdCon < pDExcl < pBur < nd < pBurErr < pDErr < pDandP>> [ 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 ~ [ <<-- Constraint priority: sp < nd < mCut < mVia < mVC>> [ 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]; }; <<-- Basic cMosHandle & cdLayerMappings.>> 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), 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, [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, 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)]]; <<-- Translations for Opaque Cells.>> { conInfl: CD.Number~ lambda; -- Influence distance of contacts. <<-- Using value $Opaque ensures we get an error if these are ever used as normal cdLayerMappings.>> 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]]; }; <<-- Spinifex Layer Identification.>> 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; <<-- Thyme stray capacitance layer names.>> 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"; <<-- Set Constraint Resolutions for each layer into the TechHandle.>> cMosHandle.constraintResolutions[ndifSpinifex] _ ndifResolution; cMosHandle.constraintResolutions[pdifSpinifex] _ pdifResolution; cMosHandle.constraintResolutions[polSpinifex] _ polyResolution; cMosHandle.constraintResolutions[metSpinifex] _ metalResolution; <<-- The geometric rules.>> InitRules[cMosHandle]; <<-- Technology handle is attached to the ChipNDale technology.>> SXTechnology.RegisterTechnologyHandle[cdTech~ CMos.cmos, technologyHandle~ cMosHandle]; <<-- Technology specific objects.>> 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.WriteRope["cMos technology parameters Loaded\n"]; END. <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<>>