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.
];
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]];
metCnstr[mVC] ← NEW [Constraint ← [$MetViaAndCutError, mVC, TRUE, metSpinifex]];
{
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~ [SXCMosBBasicRules.nDifLayerSep, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2), (CDSimpleRules.MinDist[CMosB.pol, CMosB.pol]/2), (CDSimpleRules.MinDist[CMosB.met, CMosB.met]/2), (CDSimpleRules.MinDist[CMosB.met2, CMosB.met2]/2), l,,],
combineNodeProperties~ CopyWellConnections,
cellPostProcess~ CheckWellConnections]
];
cMosHandle.illegalLayer[CMosB.nwellCont] ← FALSE;
cMosHandle.illegalLayer[CMosB.pwellCont] ← FALSE;
cMosHandle.illegalLayer[CMosB.ndif] ← FALSE;
cMosHandle.illegalLayer[CMosB.pdif] ← FALSE;
cMosHandle.illegalLayer[CMosB.nwell] ← FALSE;
cMosHandle.illegalLayer[CMosB.pol] ← FALSE;
cMosHandle.illegalLayer[CMosB.met] ← FALSE;
cMosHandle.illegalLayer[CMosB.met2] ← FALSE;
cMosHandle.cdLayerMapping[CMosB.nwellCont] ← LIST [[ndifSpinifex, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2)], [wellSpinifex, l, NEW [SX.BoxMapProc ← AttachNWellContact]], [pdifSpinifex, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2), pdCnstr[pdNWct]], [ndifSpinifex, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2), ndCnstr[ndCnt]], [polSpinifex, SXCMosBBasicRules.difToPolExtSep, polCnstr[pExnD]]]; -- Order Important for well plugging, node is created in first mapping, and used in second.
cMosHandle.cdLayerMapping[CMosB.pwellCont] ← LIST [[pdifSpinifex, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2)], [ndifSpinifex, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2), ndCnstr[ndPWct]], [pdifSpinifex, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2), pdCnstr[pdCnt]], [polSpinifex, SXCMosBBasicRules.difToPolExtSep, polCnstr[pExpD]]];
cMosHandle.cdLayerMapping[CMosB.ndif] ← LIST [[ndifSpinifex, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2)], [polSpinifex, SXCMosBBasicRules.difToPolExtSep, polCnstr[pExnD]]];
cMosHandle.cdLayerMapping[CMosB.pdif] ← LIST [[pdifSpinifex, (CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2)], [polSpinifex, SXCMosBBasicRules.difToPolExtSep, polCnstr[pExpD]]];
cMosHandle.cdLayerMapping[CMosB.nwell] ← LIST [[ndifSpinifex, SXCMosBBasicRules.nDifToWell-(CDSimpleRules.MinDist[CMosB.ndif, CMosB.ndif]/2), ndCnstr[ndWel]], [wellSpinifex, l]]; -- INTERIM
cMosHandle.cdLayerMapping[CMosB.pol] ← LIST [[polSpinifex, (CDSimpleRules.MinDist[CMosB.pol, CMosB.pol]/2)]];
cMosHandle.cdLayerMapping[CMosB.met] ← LIST [[metSpinifex, (CDSimpleRules.MinDist[CMosB.met, CMosB.met]/2)]];
cMosHandle.cdLayerMapping[CMosB.met2] ← LIST [[m2Spinifex, (CDSimpleRules.MinDist[CMosB.met2, CMosB.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[CMosB.cut] ← LIST [[ndifSpinifex, conInfl, $Opaque], [pdifSpinifex, conInfl, $Opaque], [polSpinifex, conInfl, $Opaque], [metSpinifex, conInfl, $Opaque]];
cMosHandle.cdLayerMapping[CMosB.cut2] ← LIST [[metSpinifex, conInfl, $Opaque], [m2Spinifex, conInfl, $Opaque]];
cMosHandle.cdLayerMapping[CMosB.bur] ← LIST [[ndifSpinifex, (CDSimpleRules.MinDist[CMosB.met2, CMosB.met2]/2), $Opaque], [polSpinifex, conInfl, $Opaque]];
};